@hellosaya

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Connect4 gameのコードエラー

Connect4 とは横7×縦6マスのフィールド上に、2人のプレイヤーが交代でコマ(赤と黄色)を積み上げていって、相手よりも先に四つのコマを並べた方が勝ちとなるゲームです。(縦・横・斜めどれでも良い)

上記のゲームを作成したのですが、赤と黄色のコマの表示が上手くいかず、行き詰まってしまっております。
不十分なコードで申し訳ないのですが、どなたかアドバイスをいただけると助かります。
どうぞよろしくお願いいたします。

class Main {
public static void main(String[] args) {
new MyConnectFour();
}
}

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MyConnectFour {

private BufferedReader input;
private char[][] board;

public MyConnectFour(){
    board = new char[6][7];
    input = new BufferedReader(new InputStreamReader(System.in));
    playGame();
}

private void playGame(){
    System.out.println("Welcome to Connect 4");
    System.out.println("There are 2 players red and yellow");
    System.out.println("Player 1 is Red, Player 2 is Yellow");
    System.out.println("To play the game type in the number of the column you want to drop you counter in");
    System.out.println("A player wins by connecting 4 counters in a row - vertically, horizontally or diagonally");
    System.out.println("");
    printBoard();
    boolean win = false;//ブール型変数を初期値falseで宣言 最初は誰も勝っていない
    while(!win){//winがfalseの場合にtrueを返すことを意味します。つまり、winがtrueになるまで(つまり、どちらかのプレイヤーが勝つまで)ループを実行します
        // player 1
        String userInput = getUserInput();
        int move = Integer.parseInt(userInput);
        placeCounter('r', Integer.parseInt(userInput));
        boolean hasWon = false;
        int count = 0;
        // check horizontal
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board[i].length; j++){
                if(board[i][j] == 'r'){
                    count = count + 1;
                    if(count >= 4){
                        hasWon = true;
                    }
                }
                else{
                    count = 0;
                }
            }

        }
        // check vertical
        count = 0;
        for(int i=0; i<board[0].length; i++){
            for(int j=0; j<board.length; j++){
                if(board[j][i] == 'r'){
                    count = count + 1;
                    if(count >= 4){
                        hasWon = true;
                    }
                }
                else{
                    count = 0;
                }
            }

        }
        printBoard();
        if(hasWon){
            win = true;
        }
        else{
            //player 2
            userInput = getUserInput();
            move = Integer.parseInt(userInput);
            placeCounter('y',move);
            hasWon = false;
            count = 0;
            // check horizontal
            for(int i=0; i<board.length; i++){
                for(int j=0; j<board[i].length; j++){
                    if(board[i][j] == 'y'){
                        count = count + 1;
                        if(count >= 4){
                            hasWon = true;
                        }
                    }
                    else{

                    }
                }
                count = 0;
            }
            // check vertical
            count = 0;
            for(int i=0; i<board[0].length; i++){
                for(int j=0; j<board.length; j++){
                    if(board[j][i] == 'y'){
                        count = count + 1;
                        if(count >= 4){
                            hasWon = true;
                        }
                    }
                    else{

                    }
                }
                count = 0;
            }
            printBoard();
            if(hasWon){
                win = true;
                System.out.println("You Have Won!!!");
                break;
            }
        }
    }

}

private String getUserInput(){
    String toReturn = null;
    try{
        toReturn = input.readLine();
    }
    catch(Exception e){

    }
    return toReturn;
}

private void printBoard(){
    for(int i=0; i<board.length-1; i++){
        for(int j=0; j<board[i].length-1; j++){
            if(board[j][i] == 'r'){
                System.out.print("| r ");
            }
            else if(board[j][i] == 'y'){
                System.out.print("| y ");
            }
            else{
                System.out.print("|   ");
            }
        }
        System.out.println("|");
    }
    System.out.println("  1   2   3   4   5   6   7");
}

private void placeCounter(char player, int position) {
    boolean placed = false;
    if (player == 'r') {
        for (int i = board.length - 1; i >= 0; i--) {
            if (!placed) {
                if (board[i][position] == 0) { // Check if the position is empty (0)
                    board[i][position] = 'r';
                    placed = true;
                }
            }
        }
    } else {
        for (int i = board.length - 1; i >= 0; i--) {
            if (!placed) {
                if (board[i][position] == 0) { // Check if the position is empty (0)
                    board[i][position] = 'y';
                    placed = true;
                }
            }
        }
    }
}

}

0 likes

2Answer

一番の原因はprintBoardメソッドでboard[j][i]としているところです。iとjが逆。
他にも問題があったので、色々直しちゃいました。

MyConnectFour.java
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MyConnectFour {

    public static void main(String[] args) {
        new MyConnectFour();
    }

    private BufferedReader input;
    private char[][] board;

    public MyConnectFour() {
        board = new char[6][7]; //行x列
        input = new BufferedReader(new InputStreamReader(System.in));
        playGame();
    }

    private void playGame() {
        System.out.println("Welcome to Connect 4");
        System.out.println("There are 2 players red and yellow");
        System.out.println("Player 1 is Red, Player 2 is Yellow");
        System.out.println("To play the game type in the number of the column you want to drop you counter in");
        System.out.println("A player wins by connecting 4 counters in a row - vertically, horizontally or diagonally");
        System.out.println("");
        printBoard();
        boolean win = false; //ブール型変数を初期値falseで宣言 最初は誰も勝っていない
        int playerNo = 1; //0:r, 1:y
        char[] players = { 'r', 'y' };
        while (!win) { //winがfalseの場合にtrueを返すことを意味します。つまり、winがtrueになるまで(つまり、どちらかのプレイヤーが勝つまで)ループを実行します
            playerNo = 1 - playerNo; //next plyer
            char player = players[playerNo];
            String userInput = getUserInput(player);
            int move = Integer.parseInt(userInput);
            placeCounter(player, move);
            printBoard();
            if (isWinner(player, board)) {
                win = true;
                System.out.println("You Have Won!!!");
            }
        }
    }

    private String getUserInput(char player) {
        String toReturn = null;
        System.out.print("\nPlayer: " + player + ", choose a column: ");
        try {
            toReturn = input.readLine();
        } catch (Exception e) {

        }
        return toReturn;
    }

    private void printBoard() {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                if (board[i][j] == 'r') {
                    System.out.print("| r ");
                } else if (board[i][j] == 'y') {
                    System.out.print("| y ");
                } else {
                    System.out.print("|   ");
                }
            }
            System.out.println("|");
        }
        System.out.println("  1   2   3   4   5   6   7");
    }

    private void placeCounter(char player, int position) {
        position--;
        for (int i = board.length - 1; i >= 0; i--) {
            if (board[i][position] == 0) { // Check if the position is empty (0)
                board[i][position] = player;
                break;
            }
        }
    }

    private boolean isWinner(char player, char[][] board) {
        //check for 4 across
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[0].length - 3; col++) {
                if (board[row][col] == player &&
                    board[row][col + 1] == player &&
                    board[row][col + 2] == player &&
                    board[row][col + 3] == player) {
                    return true;
                }
            }
        }
        //check for 4 up and down
        for (int row = 0; row < board.length - 3; row++) {
            for (int col = 0; col < board[0].length; col++) {
                if (board[row][col] == player &&
                    board[row + 1][col] == player &&
                    board[row + 2][col] == player &&
                    board[row + 3][col] == player) {
                    return true;
                }
            }
        }
        //check upward diagonal
        for (int row = 3; row < board.length; row++) {
            for (int col = 0; col < board[0].length - 3; col++) {
                if (board[row][col] == player &&
                    board[row - 1][col + 1] == player &&
                    board[row - 2][col + 2] == player &&
                    board[row - 3][col + 3] == player) {
                    return true;
                }
            }
        }
        //check downward diagonal
        for (int row = 0; row < board.length - 3; row++) {
            for (int col = 0; col < board[0].length - 3; col++) {
                if (board[row][col] == player &&
                    board[row + 1][col + 1] == player &&
                    board[row + 2][col + 2] == player &&
                    board[row + 3][col + 3] == player) {
                    return true;
                }
            }
        }
        return false;
    }
}
0Like

Your answer might help someone💌