Java 我看不出我的逻辑错误
当游戏执行时,玩家可以输入一个移动,但是它会陷入一个循环中,逻辑错误出现在isWinner方法中,但是如果不使用一堆长if语句,我想不出怎么做?请帮忙Java 我看不出我的逻辑错误,java,arrays,methods,Java,Arrays,Methods,当游戏执行时,玩家可以输入一个移动,但是它会陷入一个循环中,逻辑错误出现在isWinner方法中,但是如果不使用一堆长if语句,我想不出怎么做?请帮忙 public class TicTacToe { public static char board[] = new char[10]; public static void resetgame(){ for (int x = 0; x < board.length; x++) b
public class TicTacToe {
public static char board[] = new char[10];
public static void resetgame(){
for (int x = 0; x < board.length; x++)
board[x] = '-'; // resets board to all -
}
public static void displayBoard(){
for (int x = 1; x < board.length; x++){
if (board[x] == '-')
System.out.print(x + " ");
else
System.out.print(board[x] + " ");
if (x % 3 == 0)
System.out.println();
}
}
public static boolean isSpotEmpty(int m){
return (board[m] == '-');
}
public static void getPlayerMove(){
Scanner input = new Scanner(System.in);
System.out.print("Enter your move (1-9): ");
int move = input.nextInt();
while (move < 1 || move > 9 || !isSpotEmpty(move)){ //validate move
System.out.print("Move is not valid. Reenter move (1-9): ");
move = input.nextInt();
}
board[move] = 'X';
}
public static void computerMove(){
int move = ((int)(Math.random() * 9)+1);
while (isSpotEmpty(move)==false)
move = ((int)(Math.random() * 9)+1);
board[move] = 'O';
}
public static boolean isWinner(char ch){
for(int x = 1; x < 4; x++){
while (board[x] != ch)
return false;}
for(int x = 4; x < 7; x++){
while (board[x] != ch)
return false;}
for (int x = 7; x < board.length; x++){
while (board[x] != ch)
return false;}
for (int x = 1; x < 8; x += 3){
while (board[x] != ch)
return false;}
for (int x = 2; x < 9; x += 3){
while (board[x] != ch)
return false;}
for (int x = 3; x < board.length; x += 3){
while (board[x] != ch)
return false;}
for (int x = 1; x < board.length; x += 4){
while (board[x] != ch)
return false;}
for (int x = 3; x < 8; x += 2){
while (board[x] != ch)
return false;}
return true;
}
public static boolean isFull(){
boolean draw = false;
for (int x = 0; x < board.length; x++){
while (board[x] != '-')
draw = true;
}
return draw;
}
public static boolean isGameDone(){
if (isWinner('X')){
System.out.println("Player wins!");
return true;
}
if (isWinner('O')){
System.out.println("You suck! Computer wins!");
return true;
}
if (isFull()){
System.out.println("Draw!");
return true;
}
return false;
}
public static void tictactoe(){
resetgame();
displayBoard();
while (true){
getPlayerMove();
displayBoard();
if (isGameDone()==true) return;
System.out.println("Computer's move!");
computerMove();
displayBoard();
if (isGameDone()==true) return;
System.out.println("Your move!");
}
}
public static void main(String[] args) {
tictactoe();
}
}
公共类TicTacToe{
公共静态字符板[]=新字符[10];
公共静态游戏(){
用于(int x=0;x9 | |!isSpotEmpty(移动)){//验证移动
系统输出打印(“移动无效。重新输入移动(1-9):”;
move=input.nextInt();
}
板[移动]=“X”;
}
公共静态无效计算机移动(){
int move=((int)(Math.random()*9)+1);
while(isSpotEmpty(move)=false)
move=((int)(Math.random()*9)+1);
板[移动]=“O”;
}
公共静态布尔值(char-ch){
对于(int x=1;x<4;x++){
while(板[x]!=ch)
返回false;}
对于(int x=4;x<7;x++){
while(板[x]!=ch)
返回false;}
对于(int x=7;x
更新代码:
下面的代码经过测试并正常工作
isWinner
方法
public static boolean isWinner(char ch){
boolean finishFlag = true;
for(int x = 1; x < 4; x++){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for(int x = 4; x < 7; x++){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for (int x = 7; x < board.length; x++){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for (int x = 1; x < 8; x += 3){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for (int x = 2; x < 9; x += 3){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for (int x = 3; x < board.length; x += 3){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for (int x = 1; x < board.length; x += 4){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
if (finishFlag)
return finishFlag;
finishFlag = true;
for (int x = 3; x < 8; x += 2){
if (board[x] != ch) {
finishFlag = false;
break;
}
}
return finishFlag;
}
public static boolean isFull(){
boolean draw = false;
for (int x = 1; x < board.length; x++){
if (board[x] == '-') {
draw = false;
break;
} else {
draw = true;
}
}
return draw;
}
编辑:在isFull()中将x初始化为1而不是0您需要重构
isWinner()
和isFull()方法。您被困在无限循环中,因为您在检查第一个水平行后立即返回。如果这恰好是错误的,那么其他循环都无法执行
我还没有做完整的代码检查,但是上面提到的错误可以通过下面的代码修复
boolean finishedFlag = true;
for(int x = 1; x < 4; x++){
if (board[x] != ch){
finishedFlag = false;
break;
}
}
if(finishedFlag) return finishedFlag;
/*
...
Check similarly for all horizontal,vertical and diagonal
...
*/
return finishedFlag;
我在这里会有点迟钝。您的问题是由于误用while
操作员造成的。让我们来看看其中的一个问题:
while (board[x] != '-')
draw = true;
当我们看循环时,我们想问:
循环开始时我的条件为真吗
在循环过程中有什么变化
循环结束时我的条件是真的吗
条件是板[x]!='-'代码>。在循环开始时,board[x]
必须不等于'-'
在while
循环结束时,'-'
肯定不会更改,因为它是一个常量字符串
board[x]
是否会更改?让我们看看while
循环的主体。唯一要做的就是将true
赋值给draw
x
不会更改,而且板[x]
也不会更改
那么,这个
循环需要多长时间?查看您使用while
的其余代码,并检查它们的运行方式。您可以使用switch
语句。将所有while
替换为if
,看看它是否解决了问题。尝试过了……没有试过使用调试器跟踪吗?我知道无限循环在哪里,因为如果我在程序中注释isWinner方法,它运行得很好,只是无法确定winnerresult是否是相同的无限循环。我打算使用for循环来检查电路板上的每一行、每一列和每一对角线是否有3个X或O的组合……它不喜欢我这样做,你需要重构isWinner(),这个函数需要很长时间。我应该如何重构它?你只有一个条件board[X]
while (board[x] != '-')
draw = true;