java - Connect 4 Java Win 条件检查

标签 java game-engine

我有一个编程任务,需要制作 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/

相关文章:

java - 我如何使用 Guice 定义动态和即时绑定(bind)?

Java 3D 游戏开发

animation - 如何使用新的Unity4.3 2D框架正确翻转2D角色? (动画期间游戏对象的旋转)

go - 如何在 2d 游戏中处理全屏?

java - 打开失败 : EACCES (Permission denied) on SD card

java - 如何在java中的泛型中给出And条件

java - 如何从我的 Jframe 按钮调用访问 main 中的 LinkedList

java - spring-test 和mockito Controller 测试

java - 检查矩形是否相交仅在第一次检查时相交时才起作用

java - 如何处理多点触控?