Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.05.2016, 17:43

[Java] Connect 4 Diagonale untersuchen

Hallo!

Ich arbeite zur Zeit an einem Connect 4, oder 4 gewinnt Spiel. Ich habe es jetzt schon hinbekommen auf horizontal und vertikal zu prüfen ob 4 Steine des selben Spielers da liegen. Ich hänge nur total gerade dabei, wie ich das nun für die Diagonalen mache. Hier mal meine Funktionen für Horizontal und Vertikal:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
    public boolean checkWinRows() {
        int sameDiscs;
        Player lastPlayerField = gameField[0][0].getPlayer();

        for(int i = 0; i < gameField.length; i++) {

            sameDiscs = 0;
            for(int j = 0; j < gameField[i].length; j++) {

                sameDiscs = countSameDiscs(sameDiscs, gameField[i][j].getPlayer() == lastPlayerField, gameField[i][j]);
                lastPlayerField = gameField[i][j].getPlayer();

                if(sameDiscs == 4) {
                    // set winner
                    lastPlayerField.setWon(true);
                    return true;
                }

            }
        }

        return false;
    }


    public boolean checkWinCols() {
        int sameDiscs;
        Player lastPlayerField = gameField[0][0].getPlayer();

        for(int j = 0; j < gameField[0].length; j++) {
            sameDiscs = 0;
            for(int i = 0; i < gameField.length; i++) {

                sameDiscs = countSameDiscs(sameDiscs, gameField[i][j].getPlayer() == lastPlayerField, gameField[i][j]);
                lastPlayerField = gameField[i][j].getPlayer();

                if(sameDiscs == 4) {
                    // set winner
                    lastPlayerField.setWon(true);
                    return true;
                }
            }
        }

        return false;
    }

 private int countSameDiscs(int sameDiscs, boolean samePlayer, Field field) {
        if(field.getPlayer() != null) {
            if(samePlayer)
                sameDiscs ++;
            else
                sameDiscs = 1;
        } else
            sameDiscs = 0;
        return sameDiscs;
    }


Ich stehe da echt an bei den Diagonalen, mein erster Anastz wäre:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public boolean checkWinDiagonal1(int row, int column) {
        if(column == 0)
            return false;
        int i=0, j=0;
        int iterateCount= 7-row;
         int sameDiscs;
         Player lastPlayerField = gameField[0][0].getPlayer();
          for( i=row, j=column; i < 7 && j > 0; i++, j--) {
              sameDiscs = 0;
              sameDiscs = countSameDiscs(sameDiscs, gameField[i][j].getPlayer() == lastPlayerField, gameField[i][j]);
              System.out.println("i: " + i + " " + "j: " + j);
              lastPlayerField = gameField[i][j].getPlayer();

              if(sameDiscs == 4) {
                  // set winner
                  lastPlayerField.setWon(true);
                  return true;
              }

          }
        return false;
    }
    
    public boolean checkWinDiagonal2(int row, int column) {
        int i=0, j=0;
        int iterateCount= 7-row;
        int sameDiscs;
        Player lastPlayerField = gameField[0][0].getPlayer();
          for( i=row, j=column; iterateCount>0; i++, j++, iterateCount--) {
              sameDiscs = 0;
              sameDiscs = countSameDiscs(sameDiscs, gameField[i][j].getPlayer() == lastPlayerField, gameField[i][j]);
              lastPlayerField = gameField[i][j].getPlayer();

              if(sameDiscs == 4) {
                  // set winner
                  lastPlayerField.setWon(true);
                  return true;
              }
          }
       return false;
   }


Funktioniert aber nicht, bekomme einen Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException Fehler.

Bin für Hilfe dankbar :)

LG