2017-10-04 2 views
0

Ich erstelle ein zweidimensionales Array von Zellen, bestehend aus JButtons (wenn das sinnvoll ist), um ein Spiel ähnlich wie Tic-Tac-Toe zu erstellen. Example of what im trying to accomplish vergessen, dass hinzufügen, wenn eine Zelle umgeben ist, ist das SpielVerwenden eines zweidimensionalen Arrays, um ein Spiel zu erstellen

gewinnt ich zur Zeit bei der Bearbeitung der for-Schleife bin verloren für die Zuweisung entweder die einer oder Null aus dieser aktuellen Zelle zu berücksichtigen, und die Zuordnung es zu eine lokale Variable.

Wenn ich sage topNum = board [row-1] [col]; Wie gehe ich vor, um entweder die einer Zelle zugewiesene Eins oder Null abzurufen? (Ich verwende eine setText Eigenschaft die Nummer der Zelle zuweisen.)

Danke für Ihre Hilfe

public boolean isWinner() { 
    for (int row = 0; row < this.sizeRow; row++) { 
     for (int col = 0; col < this.sizeCol; col++) { 
      Cell num = board[row][col]; 

      // not a winner if this cell is null 
      if (num != null) { 

       // Look at above cell 
       Integer topNum = -1; 
       if (row > 0) { 
        topNum = board[row-1][col]; 
        if (topNum == null) break; 
       }     

       // Look at right cell 
       Integer rightNum = -1; 
       if (col == this.sizeCol-1) { 
        rightNum = board[row][col+]; 
        if (rightNum == null) break; 
       } 

       // Look at left cell 
       Integer leftNum = -1; 
       if (col == this.sizeCol-1) { 
        rightNum = board[row][col-]; 
        if (rightNum == null) break; 
       } 

       // Look at bottom cell 
       Integer bottomNum = -1; 
       if (row > 0) { 
        topNum = board[row+1][col]; 
        if (topNum == null) break; 
       } 


       // do similar for left cell and bottom cell 

       // Check that topNum is not our current cell 
       // then check that topNum is the same number as right left and bottom OR those cells are -1, which 
       // means that side was on an edge. 
       if (!num.equals(topNum)) { 
        if ((topNum.equals(rightNum) || rightNum.equals(-1)) 
         && (topNum.equals(leftNum) || leftNum.equals(-1)) 
         && (topNum.equals(bottomNum) || bottomNum.equals(-1)) { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 
+1

Es gibt ein paar Lösungen im Umlauf für Tic-Tac-Toe und verbinden vier, die Algorithmen gibt für die Bestimmung ein Gewinnzustand basierend auf linearen Flüssen. In Ihrem Fall besteht die Grundidee darin, die aktuelle Zelle zu betrachten und basierend auf ax/y delta um alle umgebenden Zellen herumzugehen (x-1, y-1; x; y-1, x + 1, y-1 , so weiter und so eins), erlaubt das Problem für eine Situation, in der eine Zelle entlang der Kante ist, die ich zurückgeben würde blockiert – MadProgrammer

Antwort

2

Beginnen Sie mit etwas einfach, festzustellen, ob die eine Zelle zur Zeit durch den Spieler besetzt ist

protected boolean isOffBoard(int x, int y) { 
    return x < 0 || y < 0 || y >= board.length || x >= board[y].length; 
} 

protected boolean isOccupied(int x, int y) { 
    if (isOffBoard(x, y)) { 
     return true; 
    } 

    return board[y][x] != null; 
} 

protected boolean isOccupiedByPlayer(int player, int x, int y) { 
    if (isOffBoard(x, y)) { 
     return true; 
    } 
    if (!isOccupied(x, y)) { 
     return false; 
    } 

    return board[y][x] == player; 
} 

Diese drei Methoden machen einen einfachen Job

  • fest, ob die Zelle vom Brett ist oder nicht
  • Bestimmen Sie, ob die Zelle belegt ist oder nicht
  • Bestimmen Sie, ob die Zelle von dem bestimmten Player
  • belegt ist

Das ist praktisch, jetzt, da wir einen kreisförmigen Scheck über einen bestimmten Punkt und festzustellen, ob ein Spieler umgab oder nicht, so etwas wie dies einfach tun ...

protected boolean isSurroundedBy(int player, int x, int y) { 
    return isOccupiedByPlayer(player, x - 1, y - 1) 
      && isOccupiedByPlayer(player, x, y - 1) 
      && isOccupiedByPlayer(player, x + 1, y - 1) 
      && isOccupiedByPlayer(player, x - 1, y) 
      && isOccupiedByPlayer(player, x + 1, y) 
      && isOccupiedByPlayer(player, x - 1, y + 1) 
      && isOccupiedByPlayer(player, x, y + 1) 
      && isOccupiedByPlayer(player, x + 1, y + 1); 
} 

Dies einfach überprüft, ob die Zellen einen bestimmten Punkt umgibt, ist von einem bestimmten Spieler besetzt

benutzte ich die folgenden es zu testen ...

board[1][1] = 0; 
System.out.println(""); 
System.out.println("1x1 isOccupiedByPlayer 0 = " + isOccupiedByPlayer(0, 1, 1)); 
System.out.println("isSurrounded = " + isSurroundedBy(1, 1, 1)); 
board = new Integer[3][3]; 
board[0][0] = 0; 
System.out.println(""); 
System.out.println("0x0 isOccupiedByPlayer 0 = " + isOccupiedByPlayer(0, 0, 0)); 
System.out.println("isSurrounded = " + isSurroundedBy(1, 0, 0)); 
board[1][0] = 1; 
board[1][1] = 1; 
board[0][1] = 1; 
System.out.println(""); 
System.out.println("0x0 isOccupiedByPlayer 0 = " + isOccupiedByPlayer(0, 0, 0)); 
System.out.println("1x1 isOccupiedByPlayer 0 = " + isOccupiedByPlayer(0, 1, 1)); 
System.out.println("isSurrounded = " + isSurroundedBy(1, 0, 0)); 

board = new Integer[3][3]; 
board[0][0] = 0; 
board[1][0] = 1; 
board[1][1] = 0; 
board[0][1] = 1; 
System.out.println(""); 
System.out.println("0x0 isOccupiedByPlayer 0 = " + isOccupiedByPlayer(0, 0, 0)); 
System.out.println("1x1 isOccupiedByPlayer 0 = " + isOccupiedByPlayer(0, 1, 1)); 
System.out.println("isSurrounded = " + isSurroundedBy(1, 0, 0)); 

welche Ausgänge ...

1x1 isOccupiedByPlayer 0 = true 
isSurrounded = false 

0x0 isOccupiedByPlayer 0 = true 
isSurrounded = false 

0x0 isOccupiedByPlayer 0 = true 
1x1 isOccupiedByPlayer 0 = false 
isSurrounded = true 

0x0 isOccupiedByPlayer 0 = true 
1x1 isOccupiedByPlayer 0 = true 
isSurrounded = false 

Nun, dies kann man absolute Anforderungen nicht erfüllen, aber man sollte einen Startpunkt geben

0

Wenn Ihr mit setText(), um das eine oder Null auf die Zelle zuweisen. Ich würde getText() verwenden, um den zugewiesenen Wert abzurufen.

+0

Wie würde ich mit getText() im vorherigen Code gehen? Ich weiß nur nicht, wo ich es hinstellen soll. – DieselGV

+0

@DieselGV IHMO, Sie tun das Richtige, um damit zu beginnen, sollten Sie Logik des Modells und nicht den Zustand der Benutzeroberfläche basieren, sollte die Benutzeroberfläche nur den Zustand des Modells darstellen – MadProgrammer

Verwandte Themen