【问题标题】:Tic Tac Toe console program - Java井字游戏控制台程序 - Java
【发布时间】:2015-03-07 01:11:06
【问题描述】:

对于基于控制台的井字游戏程序,我无法在以下代码中获得所需的输出。 谁能帮我找出错误:

import java.util.Scanner;

以下是井字游戏类:

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() 方法,它采用 2D 数组并返回布尔值,用于中断或继续前一个 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() 方法从用户那里获取输入坐标。它们将输入矩阵作为参数并返回一个 2D 矩阵。

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 代码或 发布任何链接,那将是非常有帮助的。 . 提前谢谢..

【问题讨论】:

  • 您遇到什么错误?另外,你真的应该提供一个MCVE 而不是一堆断开连接的sn-ps。
  • 线程 "main" java.lang.RuntimeException 中的异常:无法编译的源代码 - 在 tictactoe.TicTacToe.checkwin(TicTacToe.java:72) 处的 tictactoe.TicTacToe.main(TicTacToe. java:37) Java 结果:1
  • 那么第 72 行是哪一行?这就是你的错误所在。
  • 如何优化这段代码?谁能给我一个链接或任何相同的算法??
  • @JainamJhaveri 我已经编辑了my answer 做改进。

标签: java if-statement multidimensional-array tic-tac-toe


【解决方案1】:
if(m[0][0] == [1][1]...

应该是:

if(m[0][0] == m[1][1]...

【讨论】:

  • typo ... :) 我花了一个小时才弄清楚,但我还是找不到.. 谢谢@Kevin Workman
【解决方案2】:

您的 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就可以了)。

此外,您可以使用return 而不是break,而不是使用do 循环。

但我建议完全消除该位的重复:将其更改为 this,使用 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");

这看起来更干净,应该很好用。

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多