2014-02-15 2 views
-1

Я пытаюсь сделать игру Go-Moku. Игра компилируется, но не работает должным образом. Когда я запускаю игру, я могу напечатать пустую доску, а затем мне будет предложено ввести целые числа строк и столбцов, но после того, как я нажму на enter, чтобы отправить столбец int, ничего больше не произойдет.Как мне заставить свою игру Go-Moku продолжать цикл?

Вот мой код:

import java.util.Scanner; 
public class GoMoku extends Board{ 

Scanner input = new Scanner(System.in); 
//play turn method 
boolean play (int player){ 
    this.printBoard(); 
    System.out.println("It's Player "+ player + "'s turn."); 
    System.out.print("Choose Row: "); 
    int row = input.nextInt(); 
    System.out.print("Choose Column: "); 
    int column = input.nextInt(); 
    return this.place(row, column, player); 


} 

public static void main(String[] args) { 

    System.out.println("Welcome to Go-Moku!"); 
    GoMoku gomoku = new GoMoku(); 
    int gameLoop = 1; 

    //Turn taking Loop 
    while (gameLoop != 0) { 
     //Player 1 Loop 
     while (gameLoop == 1) { 
      gameLoop++; 
      if (gomoku.play(1) == true) gameLoop = 0; 
     } 
     //Player 2 Loop 
     while (gameLoop == 2) { 
      gameLoop--; 
      if (gomoku.play(2) == true) gameLoop = 0; 
     } 
    } 
} 
public class Board { 

    int[][] board = new int[19][19]; 


    //Board Contructor 
    public Board() { 
     for (int i = 0; i < 19; i++) { 
      for (int j = 0; j < 19; j++) { 
       board[i][j] = 0; 
      } 
     } 
    } 

    //Places token for player 
    public boolean place(int row, int column, int player) { 
      if (board[row][column] == 0) { 
       board[row][column] = player; 
      } 
      return this.hasWin(row, column, player); 
    } 

    //Checks to see if the player won the game horizontally 
    public boolean hasHorizontalWin(int row, int column,int player) { 
     int left = 0; 
     int right = 0; 
     //Counts connections made on left side of placement 
     for (int k = 1; k < 6; k++){ 
      if (board[row - k][column] == player) left++; 
     } 
     //Counts connectons made on right side of placement 
     for (int l = 1; l < 6; l++) { 
      if (board[row + l][column] == player) right++; 
     } 
     int count = left + right; 
     if (count == 5) { 
      return true; 
     } else return false; 
    } 

    //Checks to see if the player won the game vertically 
    public boolean hasVerticalWin(int row, int column, int player) { 
     int down = 0; 
     int up = 0; 
     //Counts connections made on down side of placement 
     for (int n = 1; n < 6; n++){ 
      if (board[row][column - n] == player) down++; 
     } 
     //Counts connections made on up side of placement 
     for (int p = 1; p < 6; p++) { 
      if (board[row][column + p] == player) up++; 
     } 
     int count = up + down; 
     if (count == 5) { 
      return true; 
     } else return false; 
    } 
    //Player wins method 
    boolean hasWin(int row, int column, int player) { 
     if (this.hasHorizontalWin(row, column, player) == true || 
      this.hasVerticalWin(row, column, player) == true) { 
       System.out.println("Player " + player + " wins!"); 
       return true; 
     } else return false; 
    } 

    //Prints board as string 
    public void printBoard(){ 
     for (int m = 0; m < 19; m++){ 
      for (int b = 0 ; b < 19; b++){ 
       if (board[m][b] == 0) System.out.print("-"); 
       if (board[m][b] == 1) System.out.print("o"); 
       if (board[m][b] == 2) System.out.print("x"); 
      } 
      System.out.println(); 
     } 
    } 
} 
} 

благодаря

+0

Вы четко понимаете использование * while * конструкций? Потому что ваше использование их отличает повороты игроков, не имеет для меня большого смысла. – Warlord

ответ

0

Проблема в том, в Board классе - когда вы проверяете для выигрышных линий вы можете получить ArrayOutOfBounds исключение.

Вы можете исправить это с чем-то вроде этого:

public class Board { 

    static final int WIDTH = 19; 
    static final int HEIGHT = 19; 
    int[][] board = new int[HEIGHT][WIDTH]; 


    //Board Contructor 
    public Board() { 
     for (int i = 0; i < HEIGHT; i++) { 
      for (int j = 0; j < WIDTH; j++) { 
       board[i][j] = 0; 
      } 
     } 
    } 

    //Places token for player 
    public boolean place(int row, int column, int player) { 
      if (board[row][column] == 0) { 
       board[row][column] = player; 
      } 
      return this.hasWin(row, column, player); 
    } 

    //Checks to see if the player won the game horizontally 
    public boolean hasHorizontalWin(int row, int column,int player) { 
     int total = 1; 
     //Counts connections made on left side of placement 
     for (int k = row - 1; k >= 0 && k > row - 5; --k) { 
      if (board[k][column] != player) break; 
      ++total; 
     } 
     for (int k = row + 1; k < HEIGHT && k < row + 5; ++k) { 
      if (board[k][column] != player) break; 
      ++total; 
     } 
     return total >= 5; 
    } 

    //Checks to see if the player won the game vertically 
    public boolean hasVerticalWin(int row, int column, int player) { 
     int total = 1; 
     //Counts connections made on left side of placement 
     for (int k = column - 1; k >= 0 && k > column - 5; --k) { 
      if (board[row][k] != player) break; 
      ++total; 
     } 
     for (int k = column + 1; k < WIDTH && k < column + 5; ++k) { 
      if (board[row][k] != player) break; 
      ++total; 
     } 
     return total >= 5; 
    } 
    //Player wins method 
    boolean hasWin(int row, int column, int player) { 
     if (this.hasHorizontalWin(row, column, player) == true || 
      this.hasVerticalWin(row, column, player) == true) { 
       System.out.println("Player " + player + " wins!"); 
       return true; 
     } else return false; 
    } 

    //Prints board as string 
    public void printBoard(){ 
     for (int m = 0; m < HEIGHT; m++){ 
      for (int b = 0 ; b < WIDTH; b++){ 
       if (board[m][b] == 0) System.out.print("-"); 
       if (board[m][b] == 1) System.out.print("o"); 
       if (board[m][b] == 2) System.out.print("x"); 
      } 
      System.out.println(); 
     } 
    } 
} 

Вы также можете упростить основной метод:

public static void main(String[] args) { 
    System.out.println("Welcome to Go-Moku!"); 
    GoMoku gomoku = new GoMoku(); 
    int player = 1; 

    //Turn taking Loop 
    while (true) { 
     if (gomoku.play(player)) break; 
     player = 3 - player; 
    } 
} 

Помимо этого есть еще и другие места, где вы можете получить ошибки (т.е. если пользователь вводит строку или столбец, которые являются отрицательными или больше размера платы), и игроки могут снова и снова вводить одни и те же координаты.

+0

Я принял ваш совет по коду, но он не изменил результат, когда я его запустил. – MrVic

Смежные вопросы