我有一个编程任务,需要制作 2D 棋盘游戏。我想做的游戏是一款四连游戏。我遇到的问题是我似乎无法使获胜条件发挥作用。有没有人有什么建议。我在编程方面还比较陌生,所以如果这是一个简单的修复,我很抱歉。这是我的代码:
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 个单元格。
虽然我没有为您提供包含工作代码的完整解决方案,但我希望我的答案能让您走上正轨。
关于java - Connect 4 Java Win 条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146940/