连接4个Java Win条件检查

我有编程任务需要制作2D棋盘游戏。 我想要制作的游戏是连接4游戏。 我遇到的问题是我似乎无法获得胜利条件。 有没有人有任何建议。 我还是比较新的编程,所以如果这是一个简单的修复我很抱歉。 这是我的代码:

import java.io.*; import java.net.*; class C4GameSession implements C4Constants { private Socket player1; private Socket player2; // Create and initialize cells private char[][] cell = new char[6][7]; private DataInputStream fromPlayer1; private DataOutputStream toPlayer1; private DataInputStream fromPlayer2; private DataOutputStream toPlayer2; // Continue to play private boolean continueToPlay = true; /** Construct a thread */ public C4GameSession(Socket player1, Socket player2) { this.player1 = player1; this.player2 = player2; // Initialize cells with a blank character for (int i = 0; i < 42; i++) for (int j = 0; j < 42; j++) cell[i][j] = ' '; } public void runGame() { try { // Create data input and output streams DataInputStream fromPlayer1 = new DataInputStream(player1.getInputStream()); DataOutputStream toPlayer1 = new DataOutputStream(player1.getOutputStream()); DataInputStream fromPlayer2 = new DataInputStream(player2.getInputStream()); DataOutputStream toPlayer2 = new DataOutputStream(player2.getOutputStream()); // Write anything to notify player 1 to start // This is just to let player 1 know to start // in other words, don't let the client start until the server is ready toPlayer1.writeInt(CONTINUE); // Continuously serve the players and determine and report // the game status to the players while (true) { // Receive a move from player 1 int row = fromPlayer1.readInt(); int column = fromPlayer1.readInt(); cell[row][column] = 'X'; // Check if Player 1 wins if (isWon('X')) { toPlayer1.writeInt(PLAYER1_WON); toPlayer2.writeInt(PLAYER1_WON); sendMove(toPlayer2, row, column); break; // Break the loop } else if (isFull()) { // Check if all cells are filled toPlayer1.writeInt(DRAW); toPlayer2.writeInt(DRAW); sendMove(toPlayer2, row, column); break; } else { // Notify player 2 to take the turn - as this message is not '1' then // this will swicth to the relevant player at the client side toPlayer2.writeInt(CONTINUE); // Send player 1's selected row and column to player 2 sendMove(toPlayer2, row, column); } // Receive a move from Player 2 row = fromPlayer2.readInt(); column = fromPlayer2.readInt(); cell[row][column] = 'O'; // Check if Player 2 wins if (isWon('O')) { toPlayer1.writeInt(PLAYER2_WON); toPlayer2.writeInt(PLAYER2_WON); sendMove(toPlayer1, row, column); break; } else { // Notify player 1 to take the turn toPlayer1.writeInt(CONTINUE); // Send player 2's selected row and column to player 1 sendMove(toPlayer1, row, column); } } } catch(IOException ex) { System.err.println(ex); } } /** Send the move to other player */ private void sendMove(DataOutputStream out, int row, int column) throws IOException { out.writeInt(row); // Send row index out.writeInt(column); // Send column index } /** Determine if the cells are all occupied */ private boolean isFull() { for (int i = 0; i < 43; i++) for (int j = 0; j < 43; j++) if (cell[i][j] == ' ') return false; // At least one cell is not filled // All cells are filled return true; } /** Determine if the player with the specified token wins */ private boolean isWon(char token) { /* int count = 0; for (int i = 0; i < 6; ++i) for (int j = 0; j < 7; ++j) if (cell[i][j] == token) ++count; if (count == 4) return true; // found /* else count = 0; // reset and count again if not consecutive */ int count_piece = 0; //Checking Horizontal Win for (int i = 0; i < 6; i++) { count_piece = 0; for (int j = 0; j < 7; j++) { if (cell[i][j] == 'X') { count_piece++; if (count_piece == 4) { System.out.println("you win"); return true; } } else { count_piece = 0; } } } return false; // no 4-in-a-line found } } 

(我会写伪代码)

从一个简单的方法开始:您需要检查垂直,水平和对角线的胜利,然后执行三个单独的检查代码块(您不需要立即解决所有问题)。

一个用于水平方向:

 for(every row) count = 0; for(each column) if(cell value = token) then count++; else // reset the counting, the eventual sequence has been interrupted count = 0; if(count >= 4) then win = 1; // you can break out here, when improving you can break out directly in the inner for loop if count is => 4 

如果未检测到胜利,请转到垂直方向:

 // similar comments for the previous block apply here for(every column) count = 0; for(each row) if(cell value = token) then count++; else count = 0; if(count >= 4) then win = 1 and break; 

如果未检测到胜利,请转到对角线方向:

 // a bit harder, you have to move diagonally from each cell for(every column from the left) for(each row from the top) count = 0 for(delta starting from 0 to 5) // add more checks to avoid checking outside the cell matrix bounds // when improving the code, you can compute a better end for the delta if(cell[row+delta][column+delta] = token) then count++; else count = 0; 

当你编写并测试了所有三个部分时,如果你想要你可以逐步改进算法,即从底部开始而不是从顶部开始(因为大多数优秀的单元格在游戏的大部分时间都是空的); 接下来,因为必须找到具有相同元素的4个连续单元格,如果您在检查行时没有找到足够的连续令牌,则可以提前停止而不是遍历该行中的所有7个单元格。

虽然我没有给你完整的工作代码解决方案,但我希望我的回答能让你走上正轨。