我正在使用 RMI 制作 2 人 connect4 游戏。我用来检查玩家是否获胜的方法 checkWin() 不起作用。如果玩家获胜,将返回
true
,否则返回 false
。方法是正确的,但行不通。以下是我在此方法中使用的类:
Server
课,
Client
课,
Piece
类(客户有自己的作品)。
Piece
有一个 Color
并且它有一个获取和设置颜色方法。
代码:
// ...Rest of code...
public void actionPerformed(ActionEvent e) {
int column = Integer.parseInt(e.getActionCommand());
try {
if(myTurn){
if(server.updateBoard(column)){
if(win(column)){
server.showWinner();
}
server.updateCurrentPlayer();
server.updateTitle();
}
// ....Rest of code...}
@Override
public synchronized boolean updateBoard(int col) throws RemoteException {
if(col >= 0 && col < columns){
for(int row = rows - 1;row >=0;row--){
if(this.board[row][col]==null){
this.board[row][col] = currentPlayer.getPiece();
player1.updateGui(currentPlayer.getPiece(), col, this.board);
player2.updateGui(currentPlayer.getPiece(), col, this.board);
currentPlayer.setBoard(this.board);
return true;
}
}
}
return false;
}
@Override
public synchronized boolean checkWin(int col) throws RemoteException {
//Vertical Check
int row = 0;
while (row < rows && this.board[row][col] == null) {
row++;
}
int streak = 1;
for (int i = row + 1; i < rows; i++) {
if (this.board[i][col] == currentPlayer.getPiece()) {
streak++;
if (streak == 4) {
return true; // Win condition met
}
} else {
streak = 1;
break; // Streak is broken
}
}
//...Rest of code...}
我通过交叉检查刚刚放置在棋盘上的棋子与玩家的棋子进行了一些测试,但它们都不匹配。为什么会这样,当它是一个玩家的棋子时,是以
updateBoard()
方法放置在棋盘上的。另外,如果我调用 board[][].getColor()
并且 board[][]
是 null
,它将进入永无止境的过程或循环。 updateBoard()
方法之所以有效,是因为客户端 GUI 都更新了,并且我的 Piece
类确实实现了 Serializable
。另外,currentPlayer
只是player1
或player2
,具体取决于轮到谁了。
我尝试使用
board[][].getColor() == currentPlayer.getColor()
代替,但它让我陷入永无止境的过程或循环。
您的代码缺少一些有趣的部分,尤其是
currentPlayer.getPiece()
和 board
的声明。
但是从您可以比较
this.board[row][col] == null
的事实来看,我推断 board
是某种形式的对象的数组。因此,比较this.board[i][col] == currentPlayer.getPiece()
很可能是错误的,因为它比较的是对象身份而不是内容。如果 board
或 currentPlayer.getPiece()
的结果通过 RMI 传输,那就更可疑了。
请实现正确的
equals
和 hashcode
方法(它们总是必须一起使用!),最好使用 IDE 工具或某种模式来创建代码。并使用 this.board[i][col].equals(currentPlayer.getPiece())
来代替,以便获得正确的比较。