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

tictactoe:检查对角线win[关闭]的方法

巫新知
2023-03-14

我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码:

import java.util.*;
public class TicTacToeNeu {
    static public char playerPiece = 'X';
    static public char computerPiece = 'O'; 
    static char[] [] board = {{'_','|','_','|','_'},
            {'_', '|', '_','|','_'},
            {' ','|',' ','|',' '}};
    static boolean gameOver = false;
    /**
     * @param args
     */
    public static void main(String[] args) {
        Scanner imputScanner = new Scanner(System.in); 
        System.out.println("Would you like to start?"); // "Would you like to start (Yes/No)"               
        String firstImput = imputScanner.nextLine(); // input user      
        boolean playersTurn = start(firstImput);
        if (!playersTurn) { //it's the computers turn first
            int rand = (int) (Math.random() * 4); //random number between 0 and 3
            switch (rand) {
            case 0:
                board[0][0] = computerPiece;
                break;
            case 1:
                board[0][4] = computerPiece;
                break;
            case 2:
                board[2][0] = computerPiece;
                break;
            case 3:
                board[2][4] = computerPiece;
                break;
            }    
            playersTurn = true;
        }
        while(true) {
            if(playersTurn) {
                printBoard(board);
                System.out.println("Give a number from 1 to 9");
                int secondImput = imputScanner.nextInt();
                playerMove(board, secondImput);
                boolean playerWinner = checkforWin(board);
                if(playerWinner == true) {
                    gameOver = true;
                    System.out.println("You won!");
                }
            }
            else {
                computerMove(board);
                boolean computerWinner = checkforWin(board);
                if(computerWinner == true && gameOver == false) {
                    System.out.println("Computer won!");
                }
            }   
            playersTurn = !playersTurn;
        }       
    }
    public static boolean checkforWin(char [] [] board) {
        for(int r = 0; r < 3; r ++) {
            //check horizontal winner
            if(board[r][0] == 'X' && board[r][2] == 'X' && board[r][4] == 'X') {        
                return true;
            }
            else if(board[r][0] == 'O' && board[r][2] == 'O' && board[r][4] == 'O') {       
                return true;
            }
        }
        // check vertical winner    
        for(int c = 0; c <= 4; c += 2 ) {
            if(board[0][c] == 'X' && board[1][c] == 'X' && board[2][c] == 'X') {
                return true;
            }
            else if(board[0][c] == 'O' && board[1][c] == 'O' && board[2][c] == 'O') {
                return true;
            }
        }
        //check diagonal winner X (player)
        if(board[1][2]=='X') {
            for(int x = 0; x <= board.length; x ++){
                if((board[0][0] == 'X' && board[2][4]=='X')||(board[0][4]=='X'&&board[2][0]=='X')) {
                    return true;
                }   
            }
        }
        else if (board[1][2]=='O') {  //check diagonal winner O (computer)
            for(int x = 0; x <= board.length; x ++){
                if((board[0][0] == 'O' && board[2][4]=='O')||(board[0][4]=='O'&&board[2][0]=='O')) {
                    return true;
                }
            }
        }
        else {
            return false;
        }
        return false;
    }
    //  public static boolean validateImputUser(String imputUser) {
    //      
    //      Scanner in = new Scanner(System.in);
    //      imputUser = in.nextLine();
    //      while (imputUser.length() != 2) {
    //      return false;
    //      System.out.println("Geben Ihr Eingabe wieder");
    //      imputUser = in.nextLine();
    //  }
    //      return true;    
    //  }
    public static void computerMove(char [] [] board) {
        char character = 'O';   
        int position = (int)(Math.random() * 9);
        boolean result = validateMove(position, board); // controls open space on the board 
        while(!result) {
            position = (int) (Math.random() * 9);
            result = validateMove(position, board);         
        }
        switch (position){
        case 1:
            board[0][0] = character;
            break;
        case 2:
            board[0][2] = character;
            break;
        case 3:
            board[0][4] = character;
            break;
        case 4:
            board[1][0] = character;
            break;
        case 5:
            board[1][2] = character;
            break;
        case 6:
            board[1][4] = character;
            break;
        case 7:
            board[2][0] = character;
            break;
        case 8:
            board[2][2] = character;
            break;
        case 9:
            board[2][4] = character;
            break;
        default:
            break;
        }
    }
    public static boolean validateMove(int position, char[][] board) {
        switch (position){
        case 1:
            if(board[0][0] == '_'){
                return true;
            } else{
                return false;
            }
        case 2:
            if(board[0][2] == '_'){
                return true;
            } else{
                return false;
            }
        case 3:
            if(board[0][4] == '_'){
                return true;
            } else{
                return false;
            }
        case 4:
            if(board[1][0] == '_'){
                return true;
            } else{
                return false;
            }
        case 5:
            if(board[1][2] == '_'){
                return true;
            } else{
                return false;
            }
        case 6:
            if(board[1][4] == '_'){
                return true;
            } else{
                return false;
            }
        case 7:
            if(board[2][0] == ' '){
                return true;
            } else{
                return false;
            }
        case 8:
            if(board[2][2] == ' '){
                return true;
            } else{
                return false;
            }
        case 9:
            if(board[2][4] == ' '){
                return true;
            } else{
                return false;
            }
        default:
            return false;
        }
    }
    public static void playerMove(char [] [] board, int position) {
        char character = 'X';       
        boolean result = validateMove(position, board);
        while(!result) {
            System.out.println("Invalid");
            System.out.println("Give a number between 1 and 9");
            Scanner scan = new Scanner(System.in);
            position = scan.nextInt();
            result = validateMove(position, board);
        }
        switch (position){
        case 1:
            board[0][0] = character;
            break;
        case 2:
            board[0][2] = character;
            break;
        case 3:
            board[0][4] = character;
            break;
        case 4:
            board[1][0] = character;
            break;
        case 5:
            board[1][2] = character;
            break;
        case 6:
            board[1][4] = character;
            break;
        case 7:
            board[2][0] = character;
            break;
        case 8:
            board[2][2] = character;
            break;
        case 9:
            board[2][4] = character;
            break;
        default:
            break;
        }
    }
    public static boolean start (String imput) {
        if(imput.equals("Yes")) {
            return true;
        }   
        return false;
    }
    public static void printBoard(char [] [] board) {   
        for(char [] row: board) {
            for(char column: row) { 
                System.out.print(column);   
            }
            System.out.println();   
        }
    }
}

问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心位置(板子[1][2])。每一个改进这部分代码的提示都将非常感谢。

共有1个答案

慕朝明
2023-03-14

问题的根本原因是您将数据模型与“可视化”“融合”了。用于计算游戏(棋盘)状态的数据结构不应与游戏的可视化方式相联系,即不应在每列的奇数点中有空格。

电路板需要为3×3阵列。为使其可视化而插入的任何空格都应添加到printboard方法中。此外,电路板不需要char[][]-您可以创建一个特殊的枚举来表示x0和未占用的单元格。除非你计划将游戏扩展到更大的网格,否则你也不需要一个循环来做对角线。

最后,通过观察位置1..9可以很容易地用/%运算符解码成一行和列,您可以消除代码中的大多数switch语句,如下所示:

int row = (position-1) / 3;
int col = (position-1) % 3;
 类似资料:
  • 我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码: 问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心

  • 我正在创建一个固定大小的线程池,包含10个线程,如下所示: 现在,在生成10个线程之后,每个线程都会执行一个runnable。这里的Runnable由工厂提供。得到() 现在,我想做一件事,一旦一个线程被关闭,也就是说,它完成了一个任务,它就会再次选择另一个runnable并开始运行它。因此,基本上检查所有10个线程的状态,并在线程关闭时再次执行runnable。 我知道我可以这样做,在其中我可以

  • 我有一个连接四个“板”,它是一个6*7的二维字符数组,填充了空格X或o。当在垂直、水平或对角线上有四个X或四个Os在一行中时,满足win条件。我已经成功地检查了垂直和水平的win条件,其中win字符通过如下所示的一些方法返回:

  • 问题内容: 目前,我正在开发在8x8 2D阵列板上生成随机0和1的程序。我要做的是检查对角线上的所有数字是否都相同(从角开始,而不仅仅是对角线)。 例: 因此,如果偶然从左上角(0,0),(1,1)…(7,7)开始的所有数字均为0或1,那么我必须输出到扫描仪,指示“是0“的主要对角线(来自上面的示例)。 同样从该示例中,我们可以看到从右上角向左下角对角重复数字“ 1”,然后我还必须显示“有一个较小

  • 请原谅长标题。StackOverflow不会接受较短的。 我试图在科特林制作一个井字游戏。到目前为止,除了对角线检查之外,一切都运行得非常好。 基本上, 函数的作用是创建一个矩阵,其中包含井字棋棋盘中的所有容器,然后检查棋盘的行,列和对角线值是否相等。如果检测到获胜者,该函数会将文本设置为“您获胜”。行和列检查工作正常,但是如果我在对角线上有3个X-s,则没有任何反应。 代码对我来说似乎很好,所以

  • 我正在写一个井字游戏,“编码规则”的一部分是应该有一个“checkwin”函数来查看玩家是否赢了。我定义了两个名为“tttXArray”和“tttOArray”的变量,以查看一个玩家是否连续获得三个水平,垂直或对角线输入。这是以 tttXArray 为例放置的函数: Checkwin是time循环的一部分: 我得到的错误是: 问题是什么?