井字游戏控制台程序 - Java
Tic Tac Toe console program - Java
对于基于控制台的 Tic Tac Toe 程序,我无法在以下代码中获得所需的输出。
谁能帮我找出错误:
import java.util.Scanner;
以下是 TicTacToe 类:
public class TicTacToe {
TicTacToe(){
System.out.println("---------------------");
System.out.println(" Tic Tac Toe ");
System.out.println("---------------------");
System.out.println();
}
public static void main(String[] args) {
TicTacToe t = new TicTacToe();
Scanner sc = new Scanner(System.in);
int a[][] = new int [3][3];
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
a[i][j] = 2;
System.out.print(" "+a[i][j]+" ");
}
System.out.println();
}
int count = 0;
我使用了 do-while 循环来执行 break 语句。虽然效率低下,但当时没有其他让我印象深刻的东西。
do{
int[][] turn1 = t.player1(a);
t.display(turn1);
int[][] turn2 = t.player2(turn1);
t.display(turn2);
int[][] turn3 = t.player1(turn2);
t.display(turn3);
int[][] turn4 = t.player2(turn3);
t.display(turn4);
int[][] turn5 = t.player1(turn4);
t.display(turn5);
if(t.checkwin(turn5))
break;
int[][] turn6 = t.player2(turn5);
t.display(turn6);
if(t.checkwin(turn6))
break;
int[][] turn7 = t.player1(turn6);
t.display(turn7);
if(t.checkwin(turn5))
break;
int[][] turn8 = t.player2(turn7);
t.display(turn8);
if(t.checkwin(turn5))
break;
int[][] turn9 = t.player1(turn8);
t.display(turn9);
if(t.checkwin(turn5))
break;
System.out.println("Game Draw");
count++;
}while(count ==1);
}
以下是 checkwin() 方法,它采用二维数组和 returns 布尔值,用于中断或继续之前的 do-while 循环。
public boolean checkwin(int m[][]){
for(int i=0; i<3; i++){
if(m[i][0] == m[i][1] && m[i][1] == m[i][2]){
if(m[i][0] == 1){
player1wins();
return true;
}
else if(m[i][0] == 0){
player2wins();
return true;
}
}
后面if语句显示错误的条件..
if(m[0][i] == [1][i] && m[1][i] == m[2][i]){
if(m[0][i] == 1){
player1wins();
return true;
}
else if(m[0][i] == 0){
player2wins();
return true;
}
}
}
后面if语句显示错误的条件..
if(m[0][0] == [1][1] && m[1][1] == m[2][2]){
if(m[0][0] == 1){
player1wins();
return true;
}
else if(m[0][0] == 0){
player2wins();
return true;
}
}
return false;
}
以下 player1wins(), player2wins() 方法显示,如果他们中的任何一个赢了..
public static void player1wins(){
System.out.println("1st player wins");
}
public static void player2wins(){
System.out.println("2nd player wins");
}
以下每转一圈打印矩阵的显示方法..
public void display(int matrix[][]){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
System.out.print(" "+matrix[i][j]+" ");
}
System.out.println();
}
}
以下 player1() 和 player2() 方法从用户那里获取输入坐标。它们将输入矩阵作为参数,returns 一个二维矩阵..
public int[][] player1(int matrix[][]){
Scanner sc = new Scanner(System.in);
System.out.println("1st player's turn...");
System.out.print("Enter x coordinate: ");
int x = sc.nextInt();
System.out.print("Enter y coordinate: ");
int y = sc.nextInt();
matrix[x][y] = 1;
return matrix;
}
public int[][] player2(int matrix[][]){
Scanner sc = new Scanner(System.in);
System.out.println("2nd player's turn...");
System.out.print("Enter x coordinate: ");
int x = sc.nextInt();
System.out.print("Enter y coordinate: ");
int y = sc.nextInt();
matrix[x][y] = 0;
return matrix;
}
}
此外,如果有人可以帮助我优化这个基于控制台的井字游戏java代码或发布任何链接 同样,这将有很大的帮助..提前谢谢..
if(m[0][0] == [1][1]...
应该是:
if(m[0][0] == m[1][1]...
您的 if 语句在语法上似乎不正确:
if(m[0][i] == [1][i] && m[1][i] == m[2][i]){
[1][i]
前面少了一个 m
。应该是这样的:
if(m[0][i] == m[1][i] && m[1][i] == m[2][i]){
同样适用于另一个if语句:
改变
if(m[0][0] == [1][1] && m[1][1] == m[2][2]){
到
if(m[0][0] == m[1][1] && m[1][1] == m[2][2]){
这些都在您的 checkwin() 方法中。
编辑:另一个错误:您的代码每回合都会检查棋盘的第 5 回合。 (7、8、9转都是这样,6转就可以了)
此外,除了使用 do 循环,您还可以使用 return
而不是 break
。
但我建议完全消除该位的重复:将其更改为此,使用 for 和 3d 数组。
int[][][] turns = new int[10][][];
turns[0] = a;
// We start at 1 rather than 0 because the first value is a.
for (int i = 1; i <= 9; i++) {
if (i % 2 == 1) { // Odd-numbered turn
turns[i] = t.player1(turns[i - 1]);
} else { // Even-numbered turn
turns[i] = t.player2(turns[i - 1]);
}
t.display(turns[i]);
if (t.checkwin(turns[i])) {
return;
}
}
System.out.println("Game Draw");
这看起来更干净,应该会很好用。
对于基于控制台的 Tic Tac Toe 程序,我无法在以下代码中获得所需的输出。 谁能帮我找出错误:
import java.util.Scanner;
以下是 TicTacToe 类:
public class TicTacToe {
TicTacToe(){
System.out.println("---------------------");
System.out.println(" Tic Tac Toe ");
System.out.println("---------------------");
System.out.println();
}
public static void main(String[] args) {
TicTacToe t = new TicTacToe();
Scanner sc = new Scanner(System.in);
int a[][] = new int [3][3];
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
a[i][j] = 2;
System.out.print(" "+a[i][j]+" ");
}
System.out.println();
}
int count = 0;
我使用了 do-while 循环来执行 break 语句。虽然效率低下,但当时没有其他让我印象深刻的东西。
do{
int[][] turn1 = t.player1(a);
t.display(turn1);
int[][] turn2 = t.player2(turn1);
t.display(turn2);
int[][] turn3 = t.player1(turn2);
t.display(turn3);
int[][] turn4 = t.player2(turn3);
t.display(turn4);
int[][] turn5 = t.player1(turn4);
t.display(turn5);
if(t.checkwin(turn5))
break;
int[][] turn6 = t.player2(turn5);
t.display(turn6);
if(t.checkwin(turn6))
break;
int[][] turn7 = t.player1(turn6);
t.display(turn7);
if(t.checkwin(turn5))
break;
int[][] turn8 = t.player2(turn7);
t.display(turn8);
if(t.checkwin(turn5))
break;
int[][] turn9 = t.player1(turn8);
t.display(turn9);
if(t.checkwin(turn5))
break;
System.out.println("Game Draw");
count++;
}while(count ==1);
}
以下是 checkwin() 方法,它采用二维数组和 returns 布尔值,用于中断或继续之前的 do-while 循环。
public boolean checkwin(int m[][]){
for(int i=0; i<3; i++){
if(m[i][0] == m[i][1] && m[i][1] == m[i][2]){
if(m[i][0] == 1){
player1wins();
return true;
}
else if(m[i][0] == 0){
player2wins();
return true;
}
}
后面if语句显示错误的条件..
if(m[0][i] == [1][i] && m[1][i] == m[2][i]){
if(m[0][i] == 1){
player1wins();
return true;
}
else if(m[0][i] == 0){
player2wins();
return true;
}
}
}
后面if语句显示错误的条件..
if(m[0][0] == [1][1] && m[1][1] == m[2][2]){
if(m[0][0] == 1){
player1wins();
return true;
}
else if(m[0][0] == 0){
player2wins();
return true;
}
}
return false;
}
以下 player1wins(), player2wins() 方法显示,如果他们中的任何一个赢了..
public static void player1wins(){
System.out.println("1st player wins");
}
public static void player2wins(){
System.out.println("2nd player wins");
}
以下每转一圈打印矩阵的显示方法..
public void display(int matrix[][]){
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
System.out.print(" "+matrix[i][j]+" ");
}
System.out.println();
}
}
以下 player1() 和 player2() 方法从用户那里获取输入坐标。它们将输入矩阵作为参数,returns 一个二维矩阵..
public int[][] player1(int matrix[][]){
Scanner sc = new Scanner(System.in);
System.out.println("1st player's turn...");
System.out.print("Enter x coordinate: ");
int x = sc.nextInt();
System.out.print("Enter y coordinate: ");
int y = sc.nextInt();
matrix[x][y] = 1;
return matrix;
}
public int[][] player2(int matrix[][]){
Scanner sc = new Scanner(System.in);
System.out.println("2nd player's turn...");
System.out.print("Enter x coordinate: ");
int x = sc.nextInt();
System.out.print("Enter y coordinate: ");
int y = sc.nextInt();
matrix[x][y] = 0;
return matrix;
}
}
此外,如果有人可以帮助我优化这个基于控制台的井字游戏java代码或发布任何链接 同样,这将有很大的帮助..提前谢谢..
if(m[0][0] == [1][1]...
应该是:
if(m[0][0] == m[1][1]...
您的 if 语句在语法上似乎不正确:
if(m[0][i] == [1][i] && m[1][i] == m[2][i]){
[1][i]
前面少了一个 m
。应该是这样的:
if(m[0][i] == m[1][i] && m[1][i] == m[2][i]){
同样适用于另一个if语句:
改变
if(m[0][0] == [1][1] && m[1][1] == m[2][2]){
到
if(m[0][0] == m[1][1] && m[1][1] == m[2][2]){
这些都在您的 checkwin() 方法中。
编辑:另一个错误:您的代码每回合都会检查棋盘的第 5 回合。 (7、8、9转都是这样,6转就可以了)
此外,除了使用 do 循环,您还可以使用 return
而不是 break
。
但我建议完全消除该位的重复:将其更改为此,使用 for 和 3d 数组。
int[][][] turns = new int[10][][];
turns[0] = a;
// We start at 1 rather than 0 because the first value is a.
for (int i = 1; i <= 9; i++) {
if (i % 2 == 1) { // Odd-numbered turn
turns[i] = t.player1(turns[i - 1]);
} else { // Even-numbered turn
turns[i] = t.player2(turns[i - 1]);
}
t.display(turns[i]);
if (t.checkwin(turns[i])) {
return;
}
}
System.out.println("Game Draw");
这看起来更干净,应该会很好用。