Disculpe el título largo.
Quería que fuera lo más descriptivo posible.Juego de adivinar palabras PHP (resaltar letras en posición correcta e incorrecta - como la mente maestra)
Descargo de responsabilidad: Podría encontrar un código de "encontrar las diferencias" aquí y en otros lugares en Stackoverflow, pero no exactamente la funcionalidad que estaba buscando.
voy a estar utilizando estos terminoligy más adelante:
'userguess': una palabra que será introducido por el usuario
'solución': la palabra secreta que necesita ser adivinado .
Lo que necesito para crear
Palabras juego de adivinanzas donde:
- el usuario introduce una palabra (Me aseguraré de que a través de Javascript/jQuery que la palabra introducida contiene la misma cantidad de letras que la palabra , adivine).
función - Un PHP comprueba entonces la 'userguess' y pone de relieve (en verde) las letras de la palabra que esté en el sitio correcto, y Destacados (en rojo) las cartas que aún no están en el lugar correcto , pero aparece en otro lugar de la palabra.
Las letras que no aparecen en la 'solución' se dejan en negro.
trampa Escenario: - Digamos que la 'solución' es 'aabbc' y el usuario adivina 'abaac'
En el escenario anterior esto se traduciría en: (verde) un (/ verde) (rojo) b (/ rojo) (rojo) un (/ rojo) (negro)un (/ negro) (verde) c (/ verde)
Note como el último "un" es causa negro 'userguess' tiene 3 una es pero 'solución' sólo tiene 2
Lo que tengo hasta ahora
Código está trabajando más o menos, pero tengo la sensación de que puede ser 10 veces más esbelto y mezquino.
Lleno 2 nuevas matrices (una para solución y una para usuario) a medida que avanzo para evitar que la trampa (ver más arriba) estropee las cosas.
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
"// verifique todas las letras correctas en la posición DERECHA" ¿no es exactamente lo mismo que un === control? Si la mayoría de las personas lo hacen bien, entonces debes hacer lo contrario de "falla primero", es decir, verificar, pasar primero, regresar. – Cups
+1, ¡Nunca he visto a un recién llegado escribir una pregunta tan detallada! :) – SuperSaiyan
+1 por una buena pregunta ... – Red