Tic tac toe游戏循环在平局时停止-Java

Tic tac toe游戏循环在平局时停止-Java,java,methods,tic-tac-toe,game-loop,Java,Methods,Tic Tac Toe,Game Loop,根据我的学习平台的要求,除了输入命令是“开始容易”,结果是绘图程序没有停止,之后什么也没有发生,我不得不强制结束程序外,其他的都可以。在所有其他情况下,除非用户键入“退出”,否则程序将继续运行。请提供帮助,如果你能建议如何改进我的代码和OOP,那将非常好。多谢各位 import java.util.Arrays; import java.util.Scanner; import java.util.Random; public class Main { public final st

根据我的学习平台的要求,除了输入命令是“开始容易”,结果是绘图程序没有停止,之后什么也没有发生,我不得不强制结束程序外,其他的都可以。在所有其他情况下,除非用户键入“退出”,否则程序将继续运行。请提供帮助,如果你能建议如何改进我的代码和OOP,那将非常好。多谢各位


import java.util.Arrays;
import java.util.Scanner;
import java.util.Random;

public class Main {
    public final static Scanner scan = new Scanner(System.in);
    public static Random random = new Random();
    public static char[][] gameBoard;
    public static String level = "";
    public static void main(String[] args) {
        // write your code here
        menu();
    }

    public static String[] getParams() {
        String[] params = scan.nextLine().split(" ");
        return params;
    }

    public static void menu() {

        while (true) {
            System.out.println("Input command: ");
            String[] params = getParams();
            if (params.length == 3) {
                if ("start".equals(params[0])) {
                    level = params[1].equals("easy") ? params[1] : params[2];
                    start(params[1], params[2]);
                    continue;
                }
            } else if (params.length == 1) {
                if ("exit".equals(params[0])) {
                    break;
                } else {
                    System.out.println("Bad parameters!");
                    continue;
                }
            } else {
                System.out.println("Bad parameters!");
                continue;
            }
            break;
        }
    }

    public static void start(String str1, String str2) {
        gameBoard = to2dArray("_________");
        drawBoard(gameBoard);
        char player1 = 'X';
        char player2 = 'O';

        if ("user".equals(str1)) {
            while (!gameFinished(gameBoard)) {
                drawBoard(playerMove(gameBoard, player1));
                gameState(gameBoard);
                drawBoard(computerMove(gameBoard, player2));
                gameState(gameBoard);
            }
        } else if ("user".equals(str2)) {
            while (!gameFinished(gameBoard)) {
                gameState(computerMove(gameBoard, player2));
                drawBoard(gameBoard);
                gameState(playerMove(gameBoard, player1));
                drawBoard(gameBoard);
            }
        } else if ("user".equals(str1) && "user".equals(str2)) {
            while (!gameFinished(gameBoard)) {
                drawBoard(playerMove(gameBoard, player1));
                gameState(gameBoard);
                drawBoard(playerMove(gameBoard, player2));
                gameState(gameBoard);
            }
        } else {
            while (!gameFinished(gameBoard)) {
                drawBoard(computerMove(gameBoard, player1));
                gameState(gameBoard);
                drawBoard(computerMove(gameBoard, player2));
                gameState(gameBoard);
            }
        }

    }//startGame method

    public static int[] getRandomNumber() {
        int[] computerCoords = new int[2];
        while (true) {
            int a = random.nextInt((3 - 1) + 1) + 1;
            int b = random.nextInt((3 - 1) + 1) + 1;
            if (gameBoard[a - 1][b - 1] == 'X' || gameBoard[a - 1][b - 1] == 'O') {
                continue;
            } else {
                computerCoords[0] = a;
                computerCoords[1] = b;
                break;
            }
        }
        return computerCoords;
    }

    public static char[][] computerMove(char[][] gameBoard, char computer) {
        int[] arr = getRandomNumber();
        int row = arr[0] - 1;
        int col = arr[1] - 1;
        if (!gameFinished(gameBoard)) {
            System.out.println("Making move level \"" + level + "\"");
            gameBoard[row][col] = computer;
        }
      return gameBoard;
    }

    public static char[][] playerMove(char[][] gameBoard, char player) {
        int index = 0;
        int row, column;
        while (true) {
            System.out.println("Enter the coordinates: ");
            String[] coordinates = scan.nextLine().split(" ");

            try {

                row = Integer.parseInt(coordinates[0]);
                column = Integer.parseInt(coordinates[1]);

                if ((row < 1 || column < 1) || (row > 3 || column > 3)) {
                    System.out.println("Coordinates should be from 1 to 3!");
                    continue;
                }

                row -= 1;
                column -= 1;

                if (gameBoard[row][column] != '_') {
                    System.out.println("This cell is occupied! Choose another one!");
                    continue;
                }

                gameBoard[row][column] = player;
                return gameBoard;

            } catch (NumberFormatException e) {
                System.out.println("You should enter numbers!");
                continue;
            }

        }//while loop ends here

    }// playerMove() ends

    public static char[][] to2dArray(String s) {
        char[][] twoDArray = new char[3][3];
        int index = 0;
        for (int i = 0; i < twoDArray.length; i++) {
            for (int j = 0; j < twoDArray[i].length; j++) {

                twoDArray[i][j] = s.charAt(index);
                index++;
            }
        }
        return twoDArray;
    }// to2dArray method

    public static void drawBoard(char[][] arr) {
        System.out.println("---------");
        for (int i = 0; i < arr.length; i++) {
            System.out.print("| ");
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] == '_') {
                    System.out.print(" " + " ");
                } else {
                    System.out.print(arr[i][j] + " ");
                }
            }
            System.out.println("|");
        }
        System.out.println("---------");
    }//end drawBoard method

    public static boolean xWon (char[][] gameBoard) {
        char[] xWins = {'X', 'X', 'X'};
        char[][] winningCombos = {
                {gameBoard[0][0], gameBoard[0][1], gameBoard[0][2]}, //horizontal
                {gameBoard[1][0], gameBoard[1][1], gameBoard[1][2]}, //horizontal
                {gameBoard[2][0], gameBoard[2][1], gameBoard[2][2]}, //horizontal
                {gameBoard[0][0], gameBoard[1][0], gameBoard[2][0]}, //vertical
                {gameBoard[0][1], gameBoard[1][1], gameBoard[2][1]}, //vertical
                {gameBoard[0][2], gameBoard[1][2], gameBoard[2][2]}, //vertical
                {gameBoard[0][0], gameBoard[1][1], gameBoard[2][2]}, //diagonal
                {gameBoard[0][2], gameBoard[1][1], gameBoard[2][0]}  //diagonal
        };

        for (char[] charArray : winningCombos) {
            if (Arrays.equals(xWins, charArray)) {
                return true;
            }
        }

        return false;
    }// end xWon method

    public static boolean oWon (char[][] gameBoard) {
        char[] oWins = {'O', 'O', 'O'};
        char[][] winningCombos = {
                {gameBoard[0][0], gameBoard[0][1], gameBoard[0][2]}, //horizontal
                {gameBoard[1][0], gameBoard[1][1], gameBoard[1][2]}, //horizontal
                {gameBoard[2][0], gameBoard[2][1], gameBoard[2][2]}, //horizontal
                {gameBoard[0][0], gameBoard[1][0], gameBoard[2][0]}, //vertical
                {gameBoard[0][1], gameBoard[1][1], gameBoard[2][1]}, //vertical
                {gameBoard[0][2], gameBoard[1][2], gameBoard[2][2]}, //vertical
                {gameBoard[0][0], gameBoard[1][1], gameBoard[2][2]}, //diagonal
                {gameBoard[0][2], gameBoard[1][1], gameBoard[2][0]}  //diagonal
        };
        for (char[] charArray : winningCombos) {
            if (Arrays.equals(oWins, charArray)) {
                return true;
            }
        }

        return false;
    }// end oWon method

    public static boolean hasEmptyCells(char[][] gameBoard) {
        for (char[] arr : gameBoard) {
            for (char ch : arr) {
                if (ch == '_') {
                    return true;
                }
            }
        }
        return false;
    } //end of hasEmptyCells method;

    public static boolean gameFinished(char[][] gameBoard) {
         if (xWon(gameBoard) || oWon(gameBoard) || draw(gameBoard)) {
            return true;
        }

        return false;
    } //end of gameFinished method.
    
    public static boolean draw(char[][] gameBoard) {
        if(!xWon(gameBoard) && !oWon(gameBoard) && !hasEmptyCells(gameBoard)) {
            return true;
        }
        return false;
    }

    public static char[][] gameState(char[][] gameBoard) {
        if (xWon(gameBoard)) {
            System.out.println("X wins");
          return gameBoard;
        } else if (oWon(gameBoard)) {
            System.out.println("O wins");
          return gameBoard;
        } else if (draw(gameBoard)) {
            System.out.println("Draw");
          return gameBoard;
        }
      return gameBoard;
    }//gameState method
}// Main class

导入java.util.array;
导入java.util.Scanner;
导入java.util.Random;
公共班机{
公共最终静态扫描仪扫描=新扫描仪(System.in);
公共静态随机=新随机();
公共静态字符[][]游戏板;
公共静态字符串级别=”;
公共静态void main(字符串[]args){
//在这里编写代码
菜单();
}
公共静态字符串[]getParams(){
字符串[]params=scan.nextLine().split(“”);
返回参数;
}
公共静态无效菜单(){
while(true){
System.out.println(“输入命令:”);
字符串[]params=getParams();
如果(参数长度==3){
如果(“开始”。等于(参数[0])){
级别=参数[1]。等于(“容易”)?参数[1]:参数[2];
开始(参数[1],参数[2]);
继续;
}
}else if(params.length==1){
if(“exit”.equals(参数[0])){
打破
}否则{
System.out.println(“坏参数!”);
继续;
}
}否则{
System.out.println(“坏参数!”);
继续;
}
打破
}
}
公共静态无效开始(字符串str1、字符串str2){
gameBoard=to2dArray(“\uuuuuuuuuuuuuuuuuuuuuuuuu”);
抽板(游戏板);
char player1='X';
charplayer2='O';
如果(“用户”。等于(str1)){
而(!gameFinished(游戏板)){
抽板(playerMove(gameBoard,player1));
游戏状态(游戏板);
抽绳板(computerMove(gameBoard,player2));
游戏状态(游戏板);
}
}否则,如果(“用户”。等于(str2)){
而(!gameFinished(游戏板)){
游戏状态(computerMove(游戏板,玩家2));
抽板(游戏板);
游戏状态(玩家移动(游戏板,玩家1));
抽板(游戏板);
}
}如果(“用户”.equals(str1)&“用户”.equals(str2)){
而(!gameFinished(游戏板)){
抽板(playerMove(gameBoard,player1));
游戏状态(游戏板);
抽板(playerMove(gameBoard,player2));
游戏状态(游戏板);
}
}否则{
而(!gameFinished(游戏板)){
绘图板(computerMove(游戏板,播放器1));
游戏状态(游戏板);
抽绳板(computerMove(gameBoard,player2));
游戏状态(游戏板);
}
}
}//startGame法
公共静态int[]getRandomNumber(){
int[]computerCoords=新int[2];
while(true){
inta=random.nextInt((3-1)+1)+1;
intb=random.nextInt((3-1)+1)+1;
如果(游戏板[a-1][b-1]='X'| |游戏板[a-1][b-1]='O'){
继续;
}否则{
computerCoords[0]=a;
computerCoords[1]=b;
打破
}
}
返回计算机坐标;
}
公共静态字符[][]计算机移动(字符[][]游戏板,字符计算机){
int[]arr=getRandomNumber();
int row=arr[0]-1;
int col=arr[1]-1;
如果(!gameFinished(游戏板)){
System.out.println(“制作移动级别\”+级别+”\);
游戏板[行][列]=计算机;
}
返回游戏板;
}
公共静态字符[][]playerMove(字符[][]游戏板,字符播放器){
int指数=0;
int行,列;
while(true){
System.out.println(“输入坐标:”);
字符串[]坐标=scan.nextLine().split(“”);
试一试{
行=整数.parseInt(坐标[0]);
column=Integer.parseInt(坐标[1]);
如果((行<1 | |列<1)| |(行>3 | |列>3)){
System.out.println(“坐标应该在1到3之间!”);
继续;
}
行-=1;
列-=1;
如果(游戏板[行][列]!=''"{
System.out.println(“此单元格已被占用!请选择另一个!”);
继续;
}
游戏板[行][列]=玩家;
返回游戏板;
}捕获(数字格式){
System.out.println(“您应该输入数字!”);
继续;
}
}//而循环到此结束
}//playerMove()结束
公共静态字符[][]到2darray(字符串s){
char[]twoDArray=新字符[3][3];
int指数=0;
for(int i=0;i            while (!gameFinished(gameBoard)) {
                drawBoard(computerMove(gameBoard, player1));
                gameState(gameBoard);
// Result is now Draw
                drawBoard(computerMove(gameBoard, player2));
                gameState(gameBoard);
            }