2015-01-08 37 views
1

我不能让下面的代码所需的输出,对于基于控制台的井字程序.. 谁能帮助我找出错误:井字控制台程序 - Java的

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); 
} 

以下是称取2D阵列的checkwin()方法,并返回其用于破坏或继续前面的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()方法获取用户输入的坐标。他们需要输入矩阵作为参数,并返回一个二维矩阵..

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代码或职位相同的任何一个环节,这将是很大的帮助..谢谢,提前..

+3

你有什么错误?此外,你应该真的提供一个[MCVE](http://stackoverflow.com/help/mcve),而不是一堆断开连接的片段。 –

+0

异常在线程 “主” 了java.lang.RuntimeException:不可编译的源代码 - 在tictactoe.TicTacToe.checkwin(TicTacToe.java:72)表达 \t的非法启动 \t在tictactoe.TicTacToe.main(TicTacToe.java:37 ) Java结果:1 –

+0

那么第72行是什么行?那是你的错误所在。 – forgivenson

回答

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"); 

这看起来更清洁,应该工作得很好。

2
​​

应该是:

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

错字... :),我花了一个小时才弄清楚,仍然无法找到..谢谢@Kevin Workman –