Überprüfen, ob 5 Zahlen nebeneinander liegen

Salvatore

Mitglied
Guten Abend Java Community! 🙂

seit heute morgen rätsel ich darüber, wie man möglichst effizient überprüft, ob fünf Punkte in einem 15x15 Koordinatensystem nebeneinander liegen.
Stellt es euch wie Tic Tac Toe vor, nur dass das Feld 15x15 Felder groß ist und 5 in einer Reihe sein müssen, um zu gewinnen (vertikal, horizontal oder diagonal). Das Koordinatensystem sieht so aus, was ich mit einem zweidimensionalen Array gelöst habe:
0,0 0,1 0,2 ... 0,15
1,0 ...
2,0 ...
...
15,0... 15,15

Man wählt einen Punkt, der dann ensprechend mit "1" für Spieler 1 und mit "2" für Spieler 2 markiert wird.
Während des Grübelns kam mir dann die ArrayList in den Kopf.. jedoch komme ich auch da nicht weiter.

Hat jemand einen Ansatz? 🙂

Mit freundlichen Grüßen,
Salvatore
 
Eine Möglichkeit wäre es nicht immer das gesamte Feld zu durchsuchen sondern nur die Zeilen/Spalten/Diagonalen zu betrachten die vom Punkt, wo der Stein gesetzt wurde, betroffen sind.
So kannst du von vorne herein schon relativ viele Möglichkeiten ausschließen.
Kleines Beispiel:
Code:
Gegeben sei folgendes Feld
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Der Stein wird jetzt bei (0,0) platziert
 ' . . . .
 . . . . .
 . . . . .
 . . . . .
 . . . . .

Die einzigen Reihen/Spalten/Diagonalen wo sich etwas geändert haben kann sind:
Reihe: 0
Spalte: 0
Diagonale von links oben nach rechts unten [ (0,0) zu (4,4) ]
Demnach musst du auch nur diese Reihen/Spalten/Diagonalen beachten, da sich bspw Spalte 2 ja nicht verändert haben kann.
 
Vielen Dank! Tatsächlich schließt man dadurch logischerweise unzählige Schritte aus. Jedoch komme ich bei der Umsetzung nicht weiter. Es soll ja praktisch nach jedem Zug (insgesamt 225 Züge möglich) überprüft werden, ob 5 in einer Reihe liegen, also überprüfe ich nach jedem gesetzten Stein. Aber wie? Ich kann ja bei einem 15x15 Feld unmöglich alle Fälle mithilfe if-Bedingungen überprüfen.
 
Brauchst du ja auch nicht. Die Methode muss nur immer aufgerufen werden sobald der Nutzer einen Stein gesetzt hat.
Wenn du das aktuelle Board, den Spieler und den gesetzten Punkt kennst, hast du alles was du brauchst um das oben angesprochene umzusetzen.
Als Beispiel brauchst du um die Reihen zu prüfen nur die x Koordinate:
Java:
public boolean hasWon(int[][] field, int player, int x, int y) {
    // Schauen ob in der gesetzten Zeile 5 Steine hintereinander liegen
    for(int i = 0; i < field[x].length-5; i++) {
         int rowCount = 0;
         for(int j = i; j < 5; j++) {
              if(field[x][i+j] == player) {
                  rowCount++;
              }
         }
         if(rowCount == 5) {
              return true;
         }
    }
    // Spalten + Diagonalen prüfen...
}
Analog dazu kannst du prüfen ob der gegebenen Spalte 5 hintereinander sind.
(Anti-)Diagonalen ist etwas aufwändiger - aber etwas kniffeln gehört ja dazu 😉
 
Kurze Frage zu
Java:
for(int i = 0; i < field[x].length-5; i++)
Wieso length-5? iterierst du dann nicht nur durch die ersten 10 Elemente (bei einem Array der Länge 15) im x-ten Array? Was, wenn genau die letzten 5 Elemente in einer Reihe passen?


Hat sich geklärt 😀 Wegen
Java:
if(field[x][i+j] == player)

und j geht bis 4 hoch hat man am Ende Index 14 😀
 

Neue Themen


Zurück
Oben