Datenstruktur für Mastermind in Delphi 5

Also wenn ich das Spiel „Mastermind“ (teilweise auch unter „Logik“ bekannt) programmiere. welceh datenstruckturen und so sollte ich da am besten verwenden und warum??

kurz zu dem spiel - wer es nicht kennt. Also man hat 7 farben zur auswahl, der Computer entwickelt dann eine zufällige Farbreihnfolge aus 5 unterschiedlichen Farben (Farben werde nicht mehrfach verwendet). der Benutzer muss nun durch raten und logisches denken über 10 runden die entsprechende zahlenreihnfolge ermitteln. wenn die geratenen zahlen an der richtigen position stehen und die richtige farbe (entsprechend der zufälligen farbreihnfolge) hat gibt der computer einen schwarzen punkt aus, ist nur die farbe richtig, aber an der falschen position so wird ein weißer punkt angezeigt. so kann man dann über logisches denken die reihenfolge ermitteln. Bekommt man sie über die 10 Runden nicht raus hat man verloren

Ein Bekannter meinte das es mit Array ganz praktisch wäre. Also dass man die auszuwählenden Farben darunter speichert.

Dannach würde ich eine procedur schreiben die sich einen zufälligen farbcode merkt - wie könnte man das am bessten umsetzten (also mit welchen datenstruckturen und so), und warum?

der benutzer sollte dann am besten in einem stringgrid die jeweiligen farben einstellen können, die ausgabe ob die geratenen Zahlen an der richtigen position ist bzw. die richtige farbe haben… da dachte ich dass sich eine if-Funktion am bessten eignet in der art von

if StringGrid1.Cells[1,1]=1. Position und Farbe des zufälligen Farbcodes

then färbe StringGrid2.Cells[1,1] schwarz

if StringGrid1.Cells[1,1]= Farbe in zufälligen Farbcodes enthalten

then färbe StringGrid2.Cells[1,1] weiß

oder kann man dass vllt. irgendwie mit ner rekursion vereinfachen?

bzw. wie kann ich das verallgemeiner dass wenn man auf einen Button „Vergleichen“ klickt. die jeweilige runde verglichen wird. oder muss ich dass dann doch alles einzeln mit der oben beschriebene if-Funktion machen??

hoffe ihr könnte mir helfen und tipps geben ^-^

Ich denke Arrays sind da ganz gut geeignet. Auf Laufzeit brauchen wir wohl bei so was simplen nicht optimieren.

Annahme: Farben als Zahlen codiert starten bei 1. Master und Tip sind Arrays der Länge n, Arrays fangen mit Position 1 an (weiß ich jetzt nicht bei Delphi).

Pseudocode:

int schwarze = 0;
int weiße = 0;
Array TipTmp = Kopie von Array Tip;
Array MasterTmp = Kopie von Array Master;

for ( i von 1 bis n ) {
 if ( MasterTmp[i] == TipTmp[i] ) {
 schwarze hochzählen;
 // nicht mehr berücksichtigen beim Weiße zählen
 TipTmp[i] = 0;
 MasterTmp[i] = 0;
 }

}
for ( i von 1 bis n ) {
 if ( TipTmp[i] != 0 ) {
 int j = 1;
 boolean found = false;
 while ( j 

Für die vorherige Antwort hatte ich überlesen, dass Farben nur 1x verwendet werden. Das macht’s natürlich leichter:

Die Arrays enthalten wieder die Zahlen-codierten Farbwerte in der gegebenen Reihenfolge.

int schwarze = 0;
int weiße = 0;

for ( i von 1 bis n ) {
 for ( j von 1 bis n ) {
 if ( Tip[i] == Master[j] ) {
 if (i == j) {
 schwarze hochzählen;
 } else {
 weiße hochzählen;
 }
 }
 }
}

Leider kann ich dir dabei nicht weiterhelfen.

Also wenn ich das Spiel „Mastermind“ (teilweise auch unter
„Logik“ bekannt) programmiere. welceh datenstruckturen und so
sollte ich da am besten verwenden und warum??

kurz zu dem spiel - wer es nicht kennt. Also man hat 7 farben
zur auswahl, der Computer entwickelt dann eine zufällige
Farbreihnfolge aus 5 unterschiedlichen Farben (Farben werde
nicht mehrfach verwendet). der Benutzer muss nun durch raten
und logisches denken über 10 runden die entsprechende
zahlenreihnfolge ermitteln. wenn die geratenen zahlen an der
richtigen position stehen und die richtige farbe (entsprechend
der zufälligen farbreihnfolge) hat gibt der computer einen
schwarzen punkt aus, ist nur die farbe richtig, aber an der
falschen position so wird ein weißer punkt angezeigt. so kann
man dann über logisches denken die reihenfolge ermitteln.
Bekommt man sie über die 10 Runden nicht raus hat man verloren

Ein Bekannter meinte das es mit Array ganz praktisch wäre.
Also dass man die auszuwählenden Farben darunter speichert.

Dannach würde ich eine procedur schreiben die sich einen
zufälligen farbcode merkt - wie könnte man das am bessten
umsetzten (also mit welchen datenstruckturen und so), und
warum?

der benutzer sollte dann am besten in einem stringgrid die
jeweiligen farben einstellen können, die ausgabe ob die
geratenen Zahlen an der richtigen position ist bzw. die
richtige farbe haben… da dachte ich dass sich eine
if-Funktion am bessten eignet in der art von

if StringGrid1.Cells[1,1]=1. Position und Farbe des zufälligen
Farbcodes

then färbe StringGrid2.Cells[1,1] schwarz

if StringGrid1.Cells[1,1]= Farbe in zufälligen Farbcodes
enthalten

then färbe StringGrid2.Cells[1,1] weiß

oder kann man dass vllt. irgendwie mit ner rekursion
vereinfachen?

bzw. wie kann ich das verallgemeiner dass wenn man auf einen
Button „Vergleichen“ klickt. die jeweilige runde verglichen
wird. oder muss ich dass dann doch alles einzeln mit der oben
beschriebene if-Funktion machen??

hoffe ihr könnte mir helfen und tipps geben ^-^

Hallo Darkjosi,
so sorry, aber ich habe im Moment wenig Zeit. Arrays sind wohl die richtige Wahl. Zufallszahlen erzeugt man mit der Funktion random (max).
Ich hoffe, dass das erst einmal reicht.
Wolfram

Hallo DarkJosi

welche Datenstrukturen sollte ich da am besten verwenden

Es werden 7 Farben
var Farben:Array[1…7] of TColor;
oder
var Farben:Array[1…7] of String;
je nachdem ob du die Farbe oder einen Text speichern willst.

Zum Vergleichen:
procedure Pruefen(col,row:integer);
begin
if StringGrid1.Cells[Col,Row] = Farbe[Col] then …

end;

Beim Aufrufen der Procedure col und row der Zelle im Stringgrid angeben.

Ing