Консольная программа Tic Tac Toe - 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(), который принимает двумерный массив и возвращает логическое значение, которое используется для прерывания или продолжения предыдущего цикла 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-код для игры в крестики-нолики на основе консоли или опубликовать любую ссылку для того же самого, это было бы очень полезно.. Спасибо, заблаговременно..


person Jainam Jhaveri    schedule 08.01.2015    source источник
comment
Какую ошибку вы получаете? Кроме того, вы действительно должны предоставить MCVE вместо набора несвязанных фрагментов.   -  person Kevin Workman    schedule 08.01.2015
comment
Исключение в потоке main java.lang.RuntimeException: Некомпилируемый исходный код - недопустимое начало выражения в tictactoe.TicTacToe.checkwin(TicTacToe.java:72) в tictactoe.TicTacToe.main(TicTacToe.java:37) Результат Java: 1   -  person Jainam Jhaveri    schedule 08.01.2015
comment
Итак, какая строка является строкой 72? Вот где твоя ошибка.   -  person forgivenson    schedule 08.01.2015
comment
Как я могу оптимизировать этот код? Может ли кто-нибудь прислать мне ссылку или какой-либо алгоритм для того же??   -  person Jainam Jhaveri    schedule 08.01.2015
comment
@JainamJhaveri Я отредактировал свой ответ, улучшите материал.   -  person Pokechu22    schedule 09.01.2015


Ответы (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]){ 

to

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

Это намного чище и должно работать хорошо.

person Pokechu22    schedule 08.01.2015

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

Должно быть:

if(m[0][0] == m[1][1]...
person Kevin Workman    schedule 08.01.2015
comment
опечатка ... :) и мне потребовался час, чтобы понять, но я так и не смог найти .. Спасибо @Kevin Workman - person Jainam Jhaveri; 08.01.2015