Connect 4 Java Win Conditions check [duplicate]

拥有回忆 提交于 2019-12-08 12:50:30

问题


I have programming assignment where a 2D board game needs to made. The game I am trying to make is a connect 4 game. The problem I have is that I can't seem to get the win conditions to work. Does anybody have any recommendations. I am still relatively new in programming so I am sorry if it is a simple fix. Here is my Code:

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

    }
 }

回答1:


(I'll write in pseudocode)

Start with a simple approach: you need to check for vertical, horizontal and diagonal win, then do three separate check code blocks (you do not need to solve all the problem at once).

One for the horizontal direction:

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

If no win detected, go for the vertical direction:

// 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;

If no win detected, go for the diagonal direction:

// 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;

When you have written and tested all there three pieces, if you want you can gradually improve the algorithm, i.e. starting from the bottom instead of the top row (as most superior cells will be empty for the most part of the game); next, as 4 consecutive cells with the same element must be found, if you, e.g. haven't found enough consecutive tokens when checking a row you may stop earlier instead of going through all the 7 cells in that row.

While I'm not giving you the complete solution with working code, I hope my answer will put you on the right track.



来源:https://stackoverflow.com/questions/21146940/connect-4-java-win-conditions-check

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!