抱歉标题太长了。
希望它尽可能具有描述性。
免责声明:可以在 Stackoverflow 上和其他地方找到一些“查找差异”代码,但不是我正在寻找的功能。
稍后我将使用这些术语:
'userguess':用户将输入的单词
'solution':需要猜测的秘密单词。
我需要创建什么
一个猜词游戏,其中:
- 用户输入一个单词(我将通过 Javascript/jQuery 确保输入的单词包含与要猜测的单词相同数量的字母)。
- 然后,一个 PHP 函数检查“用户猜测”并突出显示(绿色)该单词中位于正确位置的字母,并突出显示(红色)尚未在正确位置但确实出现在其他地方的字母在这个词中。
未出现在“解决方案”中的字母将保持黑色。
陷阱场景:-假设“解决方案”是 “aabbc”,而用户猜测“abaac”
在上述场景中,这将导致:(绿色)a(/green)(red)b(/red)(red)a (/red)(black) a (/black)(green) c (/green)
注意最后一个“ a ”是黑色的,因为“userguess”有 3 个a,而“solution”只有 2 个
到目前为止我所拥有的
代码或多或少都在工作,但我感觉它可以精简 10 倍。
我正在填充 2 个新数组(一个用于解决方案,一个用于用户猜测),以防止陷阱(见上文)搞砸。
function checkWord($toCheck) {
global $solution; // $solution word is defined outside the scope of this function
$goodpos = array(); // array that saves the indexes of all the right letters in the RIGHT position
$badpos = array(); // array that saves the indexes of all the right letters in the WRONG position
$newToCheck = array(); // array that changes overtime to help us with the Pitfall (see above)
$newSolution = array();// array that changes overtime to help us with the Pitfall (see above)
// check for all the right letters in the RIGHT position in entire string first
for ($i = 0, $j = strlen($toCheck); $i < $j; $i++) {
if ($toCheck[$i] == $solution[$i]) {
$goodpos[] = $i;
$newSolution[$i] = "*"; // RIGHT letters in RIGHT position are 'deleted' from solution
} else {
$newToCheck[] = $toCheck[$i];
$newSolution[$i] = $solution[$i];
}
}
// go over the NEW word to check for letters that are not in the right position but show up elsewhere in the word
for ($i = 0, $j = count($newSolution); $i <= $j; $i++) {
if (!(in_array($newToCheck[$i], $newSolution))) {
$badpos[] = $i;
$newSolution[$i] = "*";
}
}
// use the two helper arrays above 'goodpos' and 'badpos' to color the characters
for ($i = 0, $j = strlen($toCheck), $k = 0; $i < $j; $i++) {
if (in_array($i,$goodpos)) {
$colored .= "<span class='green'>";
$colored .= $toCheck[$i];
$colored .= "</span>";
} else if (in_array($i,$badpos)) {
$colored .= "<span class='red'>";
$colored .= $toCheck[$i];
$colored .= "</span>";
} else {
$colored .= $toCheck[$i];
}
}
// output to user
$output = '<div id="feedbackHash">';
$output .= '<h2>Solution was : ' . $solution . '</h2>';
$output .= '<h2>Color corrected: ' . $colored . '</h2>';
$output .= 'Correct letters in the right position : ' . count($goodpos) . '<br>';
$output .= 'Correct letters in the wrong position : ' . count($badpos) . '<br>';
$output .= '</div>';
return $output;
} // checkWord