Kein überprüfen des gesamten Arrays möglich.(Viergewinnt Spiel)

Zakon

Bekanntes Mitglied
Hallo,
und zwar lerne ich für mein Studium gerade Java und bin noch im ersten Semester.
Ich soll ein Vier gewinnt spiel programmieren was sich selbst zufällig füllt.
Alles soweit so gut. Nur habe ich das Problem, dass bei meiner Diagonalen überprüfung ich nie auf meine Anzahl = 4 komme da ich den letzten "Block" nicht überprüfen kann durch meine "spielfeld.length -1".
Problem aber wenn ich die -1 lösche wird bekomme ich eine Fehlermeldung da ich ja ausserehalb des Array komme.

Hoffe jemand kann mir da helfen.
Danke schonmal im Vorraus: 🙂


[CODE lang="java" title="Diagonale überprüfung"] //Diagonal übeprüfen
for(int spalte =0; spalte<spielfeld.length-1;spalte++){
for (int zeile = 0; zeile < spielfeld.length-1; zeile++) {
if (spielfeld[spalte][zeile] == stein) {

int y=spalte;
int x=zeile;

while(x < spielfeld.length-1
&& y < spielfeld.length-1
&& spielfeld[y+1][x+1] == stein){//Letzte nicht weil kein stein mehr kommt
anzahldi++;
x++;
y++;
if (anzahldi == n) {
System.out.println("4 in einer Reihe diagonal");
break;
}
}
}
anzahldi=0;
}
}[/CODE]
 
Java:
public boolean areFourConnected(int player){

    // horizontalCheck
    for (int j = 0; j<getHeight()-3 ; j++ ){
        for (int i = 0; i<getWidth(); i++){
            if (this.board[i][j] == player && this.board[i][j+1] == player && this.board[i][j+2] == player && this.board[i][j+3] == player){
                return true;
            }           
        }
    }
    // verticalCheck
    for (int i = 0; i<getWidth()-3 ; i++ ){
        for (int j = 0; j<this.getHeight(); j++){
            if (this.board[i][j] == player && this.board[i+1][j] == player && this.board[i+2][j] == player && this.board[i+3][j] == player){
                return true;
            }           
        }
    }
    // ascendingDiagonalCheck
    for (int i=3; i<getWidth(); i++){
        for (int j=0; j<getHeight()-3; j++){
            if (this.board[i][j] == player && this.board[i-1][j+1] == player && this.board[i-2][j+2] == player && this.board[i-3][j+3] == player)
                return true;
        }
    }
    // descendingDiagonalCheck
    for (int i=3; i<getWidth(); i++){
        for (int j=3; j<getHeight(); j++){
            if (this.board[i][j] == player && this.board[i-1][j-1] == player && this.board[i-2][j-2] == player && this.board[i-3][j-3] == player)
                return true;
        }
    }
    return false;
}

Von hier https://stackoverflow.com/questions/32770321/connect-4-check-for-a-win-algorithm
 
Java:
public boolean areFourConnected(int player){

    // horizontalCheck
    for (int j = 0; j<getHeight()-3 ; j++ ){
        for (int i = 0; i<getWidth(); i++){
            if (this.board[i][j] == player && this.board[i][j+1] == player && this.board[i][j+2] == player && this.board[i][j+3] == player){
                return true;
            }          
        }
    }
    // verticalCheck
    for (int i = 0; i<getWidth()-3 ; i++ ){
        for (int j = 0; j<this.getHeight(); j++){
            if (this.board[i][j] == player && this.board[i+1][j] == player && this.board[i+2][j] == player && this.board[i+3][j] == player){
                return true;
            }          
        }
    }
    // ascendingDiagonalCheck
    for (int i=3; i<getWidth(); i++){
        for (int j=0; j<getHeight()-3; j++){
            if (this.board[i][j] == player && this.board[i-1][j+1] == player && this.board[i-2][j+2] == player && this.board[i-3][j+3] == player)
                return true;
        }
    }
    // descendingDiagonalCheck
    for (int i=3; i<getWidth(); i++){
        for (int j=3; j<getHeight(); j++){
            if (this.board[i][j] == player && this.board[i-1][j-1] == player && this.board[i-2][j-2] == player && this.board[i-3][j-3] == player)
                return true;
        }
    }
    return false;
}

Von hier https://stackoverflow.com/questions/32770321/connect-4-check-for-a-win-algorithm
Danke für die schnelle Antwort. Nur möchte ich ungern jetzt alles übern Haufen schmeißen und ein vorgefertigten Code verwenden. Wollte es ertsmal zum nachvolziehen auf meine Weise machen und habe gehofft es könnte mir jemand dabei einen Denkanstoß geben 🙂
 
Am einfachsten wäre es wohl Du würdest dir das Board einmal aufzeichnen und die Linien/Schritte einzeichnen wie Du es per Hand überprüfen würdest... Das hilft meist schon, es zu verstehen.
 
Also irgendwie ist der Auszug noch nicht aussagekräftig genug.

Derzeit nehme ich an, dass Du die Diagonale prüfst, indem Du stein auf den Wert aus dem Feld 0,0 setzt?
Und wie initialisierst Du anzahldi?

Kann es sein, dass anzahldi auf 0 gesetzt ist am Anfang? Dann kommst Du nur auf 3, denn du prüfst ja, ob drei Steine so sind, wie der erste.
Der erste Stein wird ja nicht geprüft und daher müsste dann anzahldi auf 1 initialisiert werden...

Das ist aber nur eine kleine Vermutung beim Überfliegen des Codes.

Edit: Ist aber auch generell etwas dubios, wenn Du nur prüfst, ob etwas gleich dem ersten Stein auf 0,0 ist. Also die Logik solltest Du noch einmal prüfen. Derzeit schaust Du nur ab index 1, da du ja x+1 und y+1 prüfst. Also bei einer Schleife ab 0 hast Du nie geschaut, was auf dem Feld 0,0 liegt. Daher wirklich einmal erst in Worten sagen, was Du genau bei dem Algorithmus machen möchtest um es dann umzusetzen ....
 
Also irgendwie ist der Auszug noch nicht aussagekräftig genug.

Derzeit nehme ich an, dass Du die Diagonale prüfst, indem Du stein auf den Wert aus dem Feld 0,0 setzt?
Und wie initialisierst Du anzahldi?

Kann es sein, dass anzahldi auf 0 gesetzt ist am Anfang? Dann kommst Du nur auf 3, denn du prüfst ja, ob drei Steine so sind, wie der erste.
Der erste Stein wird ja nicht geprüft und daher müsste dann anzahldi auf 1 initialisiert werden...

Das ist aber nur eine kleine Vermutung beim Überfliegen des Codes.
Ja anzahldi =0 oben. Ich glaube ich habe mein fehler gefunden undzwar muss ich wahrscheinlich in der erste if-Schleife ein anzahldi++; hinzufügen.(Da ich snst den ersten Stein nicht mitzähle)
Kann das gerade leider nur nicht ausprobieren, weil ich meinen Code gerade versuche mit Methoden zu Ordnen. 👏
Sobald es klappt werde ich euch Rückmeldung geben danke aber schonmal für die Antworten👍
 
Ja, das wäre eine Idee. Aber das ist ja der Start der Prüfung - wenn Du nur in der if Abfrage zählst, dann wäre meine Erwartungshaltung, dass Du anzahldi erst in der Schleife deklarierst und direkt mit 1 initialisierst. (Dann hast Du den möglichst kleinen Geltungsbereich)
 

Neue Themen


Zurück
Oben