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

ticTacToe:检查对角线赢取的方法

太叔京
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

您可以使用以下方法检查对角线。
请注意:
主要对角线位置为:0,0,1,1,2,2
次要对角线位置为:0,2,1,1,2,0

    public static int checkforDiagonalWin(char [][] board)
    {
        // If `player` wins : return 1
        if (board[0][0] = 'X' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
            return 1;
        if (board[0][2] = 'X' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
            return 1;
        
        // If `computer` wins : return -1
        if (board[0][0] = 'O' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
            return -1;
        if (board[0][2] = 'O' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
            return -1;
        return 0; // No one wins
    }

-1表示计算机获胜。
1表示玩家的获胜。
0表示未找到赢家。

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

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

  • 对角线从右到左 在这里,支票中奖者代码结束。

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

  • 有人给了我一个井字游戏的代码。我制作了代码来检查垂直方向是否会赢,并尝试检查对角线。我能够检查主对角线,但似乎无法确定如何检查辅助对角线。我以为我拥有的代码会起作用,但事实并非如此。我的问题从第172行开始

  • 目录类 驱动程序类