Frage von 6c6f6c, 51

4 Gewinnt Gewinnabfrage in C#?

Hallo Wie kann ich in C# eine Gewinnabfrage für 4 Gewinnt erstellen? Also das wenn 4 Steine der selben Farbe in einer Reihe sind ein Gewinner ausgespuckt wird. Ich habe bereits ein 7x6 großes Feld wo ich die Felder abwechselnd Rot und Gelb Färben kann. Die Felder sind von A1 bis G6 beschriftet. Meine idee würde mich bestimmt 200 Code Zeilen kosten. Habe leider gerade kein plan wie ich das machen soll.

Antwort
von prototype0815, 37

Ist gar nicht so ohne...Du musst eine Methode schreiben die nach jedem klick auf ein Feld aufgerufen wird.

Diese Methode muss zuerst alle Spalten vertikal prüfen, ob 4 Felder in gleicher Farbe vorhanden sind. Wenn nicht musst du alle Zeilen horizontal prüfen, sollte da auch noch kein Gewinner fest stehen wird es richtig lustig.

Beispiel:
A1 | A2 | A3 ...

B1 | B2 | ....

C1....

Jetzt musst du diagonal prüfen, das könnte so ablaufen: Du suchst ein farbiges Feld, von links nach rechts, Zeile für Zeile. Findest du ein farbiges Feld (z.B. B3) musst du dir dieses in einer separaten Variable merken (damit du später an dieser Stelle weiter suchen kannst). Da du von oben nach unten prüfst kann die Diagonale Linie ja nur nach unten gehen, somit musst du nun eine Zeile tiefer gehen (Zeile C1-C6), hier musst du dann jeweils prüfen ob ein Feld links (C2) oder ein Feld rechts (C4) von B3 in der selben Farbe eingefärbt ist. Findest du ein weiteres farbiges Feld, merkst du dir ob es nach links oder rechts ging, und in der nächsten Zeile suchst du in die Richtung weiter.

Knifflig wird es nur wenn du links und rechts unter B3 ein farbig passendes Feld findest...

Findest du keine Viererkette dann muss deine Variable wieder bei B3 mit der Suche fortdahren.

Dir könnte eine Rekursive Methode wohl sehr helfen.

Kommentar von 6c6f6c ,

vielen dank

Kann ich das irgendwie in eine For schleife packen? z.b. Prüfe A1 bis A6 und danach den buchstaben von A zu B ändern und B1 - B6 prüfen? Ich wüsste jetzt nur wie ich die Zahl ändere (variable++)

Kommentar von prototype0815 ,

Oha, steckst ja noch in den Kinderschuhen der Programmierung. (Ist nicht negativ gemeint) :-D

Ja, du brauchst wahrscheinlich nicht nur 1 Schleife. Das mit dem horizontalen prüfen, bzw. vertikalen prüfen ist recht simpel. Diagonal wird aber ein richtiger Spass.

Eigentlich solltest du dein Spielfeld in einem Zweidimensionalen Array darstellen, das hier wäre die Initialisierung eines solchen Arrays

TextBox[][] spielfeld = new TextBox[7][6];

Wenn du so etwas hast, dann kannst du mit Schlefen und dem .lenght() Inikator deine Spalten und Zeilen durchgehen ohne das du unter 0 oder über 7 bzw 6 hinaus kommst.

Machst du eine Rekursive Methode, bedeutet das dass sich die Methode bei bestimmten Fällen wieder selbst aufruft, damit kann man tolle Funktionen schreiben.

Kommentar von 6c6f6c ,

Danke!

Ich werds bei Zeit mal versuchen :) und ja ich habe vor etwas über 1 Monat mit C# angefangen.

Antwort
von greenvbuser, 22

Prototype's Antwort ist technisch gesehen richtig und würde so funktionieren. Bei Vier Gewinnt ist Performance-Optimierung auch noch nicht so wichtig. Aber wenn du später komplexere Spiele programmieren möchtest, solltest du vermeiden, nach jedem Spielzug die komplette Matrix zu durchlaufen.

Fakt ist: Ein Gewinn kann nur an der Stelle entstehen, an der du den letzten Stein gesetzt hast. Somit musst du lediglich von der Position des letzten Steines aus (spielfeld[steinPosX][steinPosY]) in jede mögliche Richtung drei Felder weit prüfen. Senkrecht nach oben musst du z.B. auch nicht prüfen, weil der letzte Stein logischerweise nicht unter einem anderen Stein liegen kann.

Kommentar von prototype0815 ,

das ist natürlich die optimierte Version, ganz klar !

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten