Logic Problem bei 4 gewinnt

Ryu1991

Erfahrenes Mitglied
Hi,
ich schreibe gerade ein kleines 4 Gewinnt - Spiel. Das läuft eigentlich ganz gut, aber da ist eine Kopfnuss, die ich seit 2h nicht knacke.
Ich bin gerade an der Erkennungsmethode für die Diagonalen von links unten nach rechts oben. Dafür habe ich mir folgenden Code überlegt:
C++:
 inReihe = 1;
    //schräg von links unten nach rechts oben
    for(Reihe = 0; Reihe < 6;Reihe++){
        for(Spalte = 0;Spalte < 7;Spalte++){
            if(Feld[Spalte][Reihe+Spalte].Player == PlayersTurn &&
               Feld[Spalte+1][Reihe+Spalte+1].Player == PlayersTurn){
                    inReihe++;
            }else{
                inReihe = 1;
            }

            if(inReihe == 4){
                Gewinner = PlayersTurn;
                return;
            }
        }
    }

Der erkennt auch eigentlich alles. Außer einer Diagonale, nämlich der zwischen den Punkten 0/1 und 6/7

also alles außer der Hier:
| _ | _ | _ | _ | _ | _ | x |
| _ | _ | _ | _ | _ | x | _ |
| _ | _ | _ | _ | x | _ | _ |
| _ | _ | _ | x | _ | _ | _ |
| _ | _ | x | _ | _ | _ | _ |
| _ | x | _ | _ | _ | _ | _ |

deshalb bin ich das ganze nochmal auf dem Papier durchgegangen.
Jetzt verstehe ich nicht mehr wie er die Diagonalen unterhalb der markierten erkennen kann, was er aber tut.

ich hoffe ihr könnt mir helfe.
Gruß Ryu
 
Zuletzt bearbeitet von einem Moderator:
Ich gehe mal davon aus das du dein Array von unten nach oben definiert hast, also dass unten links in der ecke [0][0] ist.

Wenn z.B. Spalte 1 und Reihe 0 (1. X von unten) im ersten logischen Ausdruck überprüft werden soll überprüfst du nicht [1][0] sondern [1][1], da 0+1 nunma 1 is und nich 0, und so geht das dann eben weiter...
du müsstest also wohl [spalte][reihe] und [spalte+1][reihe+1] nehmen

Bin mir zwar nich ganz sicher grade, aber ich denke der algoritmus wird so dann wohl auch soetwas als diagonale erkennen:

OOOXOOO
OOXOOOO
OXXOOOO
OXOOOOO

da ja in jeder reihe bei einem X recht obendrüber auch ein X ist, du müsstes also immer auch links drunter noch überprüfen.

außerdem würde inreihe auch hierbei bis 4 hochgezählt:
OOXXXXO
OXXXXOO

du solltest deinen algorithmus also noch einmal überdenken :)

natürlich gilt das alles aber nur wenn ich dein algorithmus kapiert hab ;)

falls nich korrigier mich, vielleicht is mein hirn heut auch schon etwas zermartert ^^
 
Zuletzt bearbeitet:
Du vermutest richtig, dass das Feld mit Links unten 0/0 definiert ist.

Die Überlegung bei der Entstehung war, dass wenn ich von einem Punkt aus gleich viel, nach rechts wie nach oben gehe, dann bin ich auf der Diagonale ausgehend von dem Punkt, und da ich durch die Doppelschleife alle Punkte durchgehe dachte ich ich hätte so alle.
Dann ist mir aber aufgefallen, dass ich mit diesem Algoritmus nur die Diagonalen Prüfe, die ihren Start bei 0/x haben, deshalb müsste ich nach meiner logik jetzt noch alle Diagoalen prüfen, die ihren start bei x/0 haben.
Das verwunderliche ist nur, dass der oben geschriebene Algortimus auch alle Diagonalen ausgehend von 0/x erkennt, außer der die bei x/1 startet....

EDIT:

Ich habe das Problem jetzt gelöst in dem Ich obensetehenden Code um folgenden ergänzt habe:
C++:
inReihe = 1;
    //schräg von links unten nach rechts oben
    //diagonalen beginnend bei X/0
    for(Spalte = 0; Spalte < 7;Spalte++){
        for(Reihe = 0;Reihe < 6;Reihe++){
            if(Feld[Spalte+Reihe][Reihe].Player == PlayersTurn &&
               Feld[Spalte+Reihe+1][Reihe+1].Player == PlayersTurn){
                    inReihe++;
            }else{
                inReihe = 1;
            }

            if(inReihe == 4){
                Gewinner = PlayersTurn;
                return;
            }
        }
    }

das funktioniert super :)
 
Zuletzt bearbeitet von einem Moderator:
Zurück