4 Gewinnt Gewinnabfrage in C#?

2 Antworten

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.


6c6f6c 
Beitragsersteller
 20.10.2016, 15:17

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++)

0
prototype0815  20.10.2016, 15:48
@6c6f6c

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.

1
6c6f6c 
Beitragsersteller
 20.10.2016, 19:03
@prototype0815

Danke!

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

0

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.


prototype0815  24.10.2016, 15:06

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

0