PHP Wortratespiel (Buchstaben in richtiger und falscher Position markieren - wie Mastermind)

9

Sorry für den langen Titel.
Wollte es so beschreibend wie möglich sein.

Disclaimer: Ich könnte hier und anderswo auf Stackoverflow einige "Finde die Unterschiede" -Code finden, aber nicht ganz die Funktionalität, nach der ich gesucht habe.

Ich werde diese Terminologie später verwenden:
'userguess' : ein Wort, das vom Benutzer eingegeben wird

Lösung ': das geheime Wort, das erraten werden muss.

Was ich erstellen muss

Ein Wort Ratespiel wo:

  • Der Benutzer gibt ein Wort ein (ich werde durch Javascript / jQuery dafür sorgen, dass Das eingegebene Wort enthält die gleiche Anzahl von Buchstaben wie das Wort zu erraten werden).

  • Eine PHP-Funktion prüft dann die 'userguess' und Highlights (in grün) die Buchstaben in diesem Wort, die an der richtigen Stelle sind, und hebt (in rot) die Buchstaben hervor, die noch nicht an der richtigen Stelle sind, aber taucht irgendwo anders im Wort auf.
    Die Buchstaben, die das nicht tun Erscheinen in der 'Lösung' sind schwarz.



Fallstrebenszenario : - Sagen wir, die Lösung ist 'aabbc' und der Nutzer rät 'abaac'
Im obigen Szenario würde dies bedeuten: (grün) a (/ grün) (rot) b (/ rot) (rot) a (/ rot) (schwarz) a (/ schwarz) (grün) c (/ grün)
Beachten Sie, wie das letzte " a " schwarz ist, weil "userguess" 3 a's hat, aber "solution" nur zwei

hat

Was ich bisher habe

Der Code funktioniert mehr oder weniger, aber ich habe das Gefühl, dass er 10 mal schlanker und gemeiner sein kann.
Ich fülle zwei neue Arrays (eins für die Lösung und eins für den Benutzer) wie ich gehe, um zu verhindern, dass die Fallgrube (siehe oben) Dinge durcheinander bringt.

%Vor%     
Wayfarer 08.07.2012, 09:17
quelle

2 Antworten

2

Nette Frage. Ich würde es wahrscheinlich etwas anders machen als du :) (Ich glaube, das hast du dir erhofft!)

Hier finden Sie meine komplette Lösungsfunktion Ссылка - aber ich werde sie auch Schritt für Schritt aufschlüsseln.

>

Bitte versuchen Sie zunächst, global zu vermeiden. Es gibt keinen Grund, warum Sie Ihre Funktion nicht wie folgt definieren können:

function checkWord($toCheck, $solution) {

Sie können die Lösung übergeben und mögliche Gefahren später vermeiden.

Ich würde damit beginnen, die Benutzerschätzung und die Lösung in Arrays aufzuteilen und ein anderes Array zu verwenden, in dem meine Ausgabe gespeichert werden kann.

%Vor%

In jeder Phase des Prozesses würde ich die Zeichen entfernen, die von den Nutzern oder der Lösung als richtig oder falsch identifiziert wurden. Daher muss ich sie in keiner Weise kennzeichnen und die verbleibenden Phasen von Die Funktion wird effizienter ausgeführt.

Also nach Übereinstimmungen suchen.

%Vor%

Für Ihre Beispielschätzung / Lösung enthält $out jetzt ein grünes "a" an Position 0 und ein grünes c an Position 4. Sowohl die Schätzung als auch die Lösung haben diese Indizes nicht mehr und werden nicht überprüft wieder.

Ein ähnliches Verfahren zum Prüfen vorhandener Buchstaben, aber am falschen Ort.

%Vor%

In diesem Fall suchen wir nach dem erratenen Buchstaben in der Lösung und entfernen ihn, wenn er gefunden wird. Wir müssen die Anzahl der Vorkommen nicht zählen, da die Buchstaben entfernt werden, wenn wir fortfahren.

Schließlich raten die einzigen Buchstaben, die in den Benutzern raten, solche, die gar nicht in der Lösung vorhanden sind, und da wir die nummerierten Indizes durchgehend beibehalten haben, können wir einfach die übrig gebliebenen Buchstaben wieder zusammenfügen.

$out += $toCheck;

Fast da. $out hat alles, was wir brauchen, aber es ist nicht in der richtigen Reihenfolge. Obwohl die Indizes numerisch sind, sind sie nicht geordnet. Wir beenden mit:

%Vor%

Das Ergebnis ist:

"<span class="green">a</span><span class="red">b</span><span class="red">a</span>a<span class="green">c</span>"

    
Leigh 08.07.2012, 09:59
quelle
1

Hier versuchen Sie In Aktion sehen

Beispielausgabe:

%Vor%     
Lawrence Cherone 08.07.2012 10:33
quelle

Tags und Links