当前位置: 首页 > 知识库问答 >
问题:

显示井字游戏应用的结果

夏侯元忠
2023-03-14

我目前正在编写一个创建井字游戏的程序。目前的应用程序有两个人互相对战,轮流输入行号和列号。这个程序的主要问题是我无法让它显示一个人赢或输或两个玩家平局的结果。如果有人对我如何解决这个问题有任何建议,那就太好了。再次感谢您的时间。

import java.util.Scanner;

public class ticTacToeApp {
    // 1. GAME CONSTANTS
    static final int WIN = 1;
    static final int LOSE = 0;
    static final int TIE = 2;
    static final int GAME_IN_PROGRESS = 3;
    static final String PLAYER = "X";
    static final String OPPONENT = "O";
    static final String EMPTY = " ";
    // 2. INPUT STREAM
    static Scanner in;

    public static void main(String[] args) {
        // 3. BUILD THE TIC TAC TOE 3X3 BOARD OF STRINGS
        String[][] board = { { EMPTY, EMPTY, EMPTY }, { EMPTY, EMPTY, EMPTY },{EMPTY, EMPTY, EMPTY } };
        // 4. INSTANTIATE THE SCANNER FOR INPUT
        in = new Scanner(System.in);
        // 5. GAME ENGINE
        drawBoard(board);
        int moveResult = GAME_IN_PROGRESS; // STATUS OF THE GAME AND AFTER A
                                            // MOVE
        while (moveResult == GAME_IN_PROGRESS) {
            // PLAYER MOVES AND BOARD IS CHECKED FOR A RESULT
            getMove(board, PLAYER, in);
            drawBoard(board);
            if (moveResult != GAME_IN_PROGRESS)
                break;

            // OPPONENT MOVES AND THE BOARD IS CHECKED FOR A RESULT
            getMove(board, OPPONENT, in);
            drawBoard(board);
            moveResult = boardResults(board);
        }
        // 6. ONCE THE GAME HAS ENDED, DISPLAY IT IS AS A WIN, LOSE, OR TIE.
        if (moveResult == WIN)
            System.out.println("You win.");
        else if (moveResult == LOSE)
            System.out.println("You lost.");
        else
            System.out.println("You tied.");
    }

    public static int boardResults(String[][] board) {
        // TASK 1: BUILD AN ARRAY CONTAINING ALL THE ROW, COLUMN, AND
        // DIAGONAL STRING ARRANGEMENTS ON THE CURRENT
        // TIC TAC TOE BOARD.
        String[] waysToWin = new String[8];
        int i = 0; // INDEX TO wayToWin
        for (int r = 0; r < 3; r++) {
            String str = " ", stc = " ";
            for (int c = 0; c < 3; c++) {
                str += board[r][c];
                stc += board[c][r];
            }
            waysToWin[i++] = str;
            waysToWin[i++] = stc;

            // ADD 2 DIAGONALS
            waysToWin[i++] = board[0][0] + board[1][1] + board[2][2];
            waysToWin[i++] = board[0][2] + board[1][1] + board[2][0];
            // TASK 2. CHECK IF ANY OF THESE ARRANGEMENTS CONTAIN A WINNING
            // "XXX" OR
            // "OOO"
            // NOTE: AN "XXX" IS WIN AND AN "OOO" IS LOSE.
            for (int p = 0; p < 8; p++) {
                if (waysToWin[p].equals("XXX"))
                    return WIN;
                if (waysToWin[p].equals("OOO"))
                    return LOSE;
                // TASK 3. CHECK IF THE BOARD IS FULL (TIE) OR IF THE GAME IS
                // STILL IN
                // PROGRESS
                if (board[0][0] == EMPTY || board[0][1] == EMPTY || board[0][2] == EMPTY || board[1][0] == EMPTY
                        || board[1][1] == EMPTY || board[1][2] == EMPTY || board[2][0] == EMPTY || board[2][1] == EMPTY
                        || board[2][2] == EMPTY)
                    return GAME_IN_PROGRESS;

            }
        }
        return i;

    }

    public static void drawBoard(String[][] board) {
        for (int row = 0; row < board.length; row++) {
            System.out.println("___________");
            for (int col = 0; col < board[row].length; col++) {
                System.out.print("|" + board[row][col] + " ");
            }
            System.out.println("| ");
        }
        System.out.println("___________");
    }

    public static void getMove(String[][] board, String whoseMove, Scanner in) {
        int[] xy = new int[2];
        for (;;) {
            System.out.print("You are " + whoseMove + ". ");
            System.out.println("Enter the row and column of your move: ");
            xy[0] = in.nextInt();
            xy[1] = in.nextInt();
            if (board[xy[0]][xy[1]].equals(EMPTY))
                break;
            System.out.println("You must choose an empty space.");
        }
        board[xy[0]][xy[1]] = whoseMove;
    }
}

共有1个答案

龙越彬
2023-03-14

我将使用一个单维数组作为棋盘,并创建一个获胜组合数组,索引到棋盘中。然后循环通过获胜的组合,计算X和O。如果你有3个,那么宣布一个获胜者。下面是一段演示:

public class ticTacToeApp {
  static final String X = "X";
  static final String O = "O";
  static final String N = " ";

  public static void main(String[] args) {
    String[] board = { X,X,O,
        N,O,N,
        O,N,N };

    // combinations to win: 
    int[][] wins = { {0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,6,8}, {0,4,8}, {2,4,6} };

    // count x's and o's to win
    int x=0, o=0;

    // find the winner by indexing the board array from the combinations to win array
    // In each combination to win, if all 3 are X's or O's, declare a winner

    for(int i=0; i<8; i++) {
      x=0; o=0;
      for(int j=0;j<3;j++) {
        if (board[wins[i][j]] == X) x++;          
        if (board[wins[i][j]] == O) o++;    
      }
      if (o==3 || x==3) 
        System.out.println(((x==3) ? "X" : "O") + " wins");
    }
  }
}
 类似资料:
  • 我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4

  • 我正在制作一个名为SOS的游戏。这是一款3x3的棋盘游戏,与Tic Tac Toe的概念相同,但在这款游戏中,玩家无法选择是以X还是O的身份进行游戏,游戏中唯一的规则是形成“SOS”。 我们的项目应该在所有职位被填补后终止,每个组成的“SOS”将被添加到组成“SOS”的玩家中。 我的问题是关于得分。在第一行输入SOS后,即,我尝试在第二行第一列输入“O”,玩家2将递增。它不应该递增,因为它不满足我

  • 嗨,我正在编写一个井字游戏。我已经在代码中的注释中详细说明了我需要什么。我现在遇到的问题是制作一个getMobile方法。我想我需要在按下行和列后的if/else语句中调用getMobile方法? 我不确定如何从获取行/列编号并将其放入我的板上以获取用户输入的内容。 以下是我的代码:

  • 所以我为我的课做了一个抽动练习作业。我已经成功地创建了一个简单的Tic Tac Toe程序,但不知何故,检查绘制的方法有时并不正确。如果所有东西都填满了,但没有赢家,那就是平局。但如果除第0行第1列外,其他所有内容都已填满,则即使该框仍为空白,它仍将显示“Draw”。如果你不明白我的意思,就试着把所有的东西都填满,但不是赢,即使最后一个框没有填满,它也会说“平局”。我在代码中做错了什么????驱动

  • 问题内容: 我已经用Java编写了一个井字游戏,而我目前确定游戏结束的方法说明了游戏结束的以下可能情况: The board is full, and no winner has yet been declared: Game is a draw. Cross has won. Circle has won. 不幸的是,这样做的目的是从表中读取一组预定义的方案。考虑到一个棋盘上只有9个空格,这并不

  • 我写的神经网络可以玩井字游戏。网络有9个输入神经元,它们描述板的状态(1-代表网络移动,1.5-代表对手移动,0-代表空单元)和9个输出神经元(具有最高值的输出神经元表示给定状态下的最佳动作)。网络没有隐藏层。激活函数-乙状结肠。学习方法--Q学习+反向传播。 网络是经过训练的,但很差(继续踩在被占用的单元格上)。所以我决定添加一个隐藏层。我想问: 在隐藏层中使用多少个神经元,在隐藏层和输出层中使