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