2015-11-16 2 views
1

Ранее поста: How do I make my tictactoe program scalableКак определить победитель в моей Tic Tac Toe программы

Я попытался сделать программу Toe Tic Tac (человек против компьютера) масштабируемой (размер платы может быть изменен). Раньше у меня были серьезные проблемы, но большинство из них было исправлено.

Правила игры являются основными Tic Tac Toe, но одно другое правило заключается в том, что независимо от того, насколько велика плата (когда >= 5) игроку или компьютеру требуется только пять очков подряд, чтобы выиграть.

Теперь единственная проблема с моей программой - определить, кто победит в этой игре. Возможно только, что игра заканчивается «ничьей» в данный момент. (Также я еще не реализовал «>= 5»).

Специфическая проблема заключается в том, что мне нужно определить победитель и конечный экран для чего-то вроде «computer wins» и/или «player wins».

package tictactoe; 

import java.util.Scanner; 
import java.util.Random; 

public class TicTacToe { 

    public static int size; 
    public static char[][] board; 
    public static int score = 0; 
    public static Scanner scan = new Scanner(System.in); 

    /** 
    * Creates base for the game. 
    * 
    * @param args the command line parameters. Not used. 
    */ 
    public static void main(String[] args) { 

     System.out.println("Select board size"); 
     System.out.print("[int]: "); 
     size = Integer.parseInt(scan.nextLine()); 

     board = new char[size][size]; 
     setupBoard(); 

     int i = 1; 

     while (true) { 
      if (i % 2 == 1) { 
       displayBoard(); 
       getMove(); 
      } else { 
       computerTurn(); 
      } 

      // isWon() 
      if (isDraw()) { 
       System.err.println("Draw!"); 
       break; 
      } 

      i++; 
     } 

    } 

    /** 
    * Checks for draws. 
    * 
    * @return if this game is a draw 
    */ 
    public static boolean isDraw() { 
     for (int i = 0; i < size; i++) { 
      for (int j = 0; j < size; j++) { 
       if (board[i][j] == ' ') { 
        return false; 
       } 
      } 
     } 

     return true; 
    } 

    /** 
    * Displays the board. 
    * 
    * 
    */ 
    public static void displayBoard() { 
     for (int i = 0; i < size; i++) { 
      for (int j = 0; j < size; j++) { 
       System.out.printf("[%s]", board[i][j]); 
      } 

      System.out.println(); 
     } 
    } 

    /** 
    * Displays the board. 
    * 
    * 
    */ 
    public static void setupBoard() { 
     for (int i = 0; i < size; i++) { 
      for (int j = 0; j < size; j++) { 
       board[i][j] = ' '; 
      } 
     } 
    } 

    /* 
    * Checks if the move is allowed. 
    * 
    * 
    */ 
    public static void getMove() { 

     Scanner sc = new Scanner(System.in); 

     while (true) { 
      System.out.printf("ROW: [0-%d]: ", size - 1); 
      int x = Integer.parseInt(sc.nextLine()); 
      System.out.printf("COL: [0-%d]: ", size - 1); 
      int y = Integer.parseInt(sc.nextLine()); 

      if (isValidPlay(x, y)) { 
       board[x][y] = 'X'; 
       break; 
      } 
     } 
    } 

    /* 
    * Randomizes computer's turn - where it inputs the mark 'O'. 
    * 
    * 
    */ 
    public static void computerTurn() { 
     Random rgen = new Random(); // Random number generator       

     while (true) { 
      int x = (int) (Math.random() * size); 
      int y = (int) (Math.random() * size); 

      if (isValidPlay(x, y)) { 
       board[x][y] = 'O'; 
       break; 
      } 
     } 
    } 

    /** 
    * Checks if the move is possible. 
    * 
    * @param inX 
    * @param inY 
    * @return 
    */ 
    public static boolean isValidPlay(int inX, int inY) { 

     // Play is out of bounds and thus not valid. 
     if ((inX >= size) || (inY >= size)) { 
      return false; 
     } 

     // Checks if a play have already been made at the location, 
     // and the location is thus invalid. 
     return (board[inX][inY] == ' '); 
    } 
} 
+4

Проверяйте каждый ход, если кто-то выиграл? –

+0

@MuratK. Основываясь на своем коде (что противоречит тому, что он спрашивает), он уже пришел к такому выводу. У него '// isWon()' внутри его 'while (true)' после каждого поворота игрока/компьютера. Хотя OP явно не задал этого, я предполагаю, что он хочет знать, как реализовать 'isWon()', где будет производиться проверка для трех/четырех/пяти (в зависимости от размера платы) соседних X или O (горизонтально, вертикально или по диагонали). Опять же, это только мое предположение, поэтому, возможно, OP должен немного отредактировать свой вопрос, а также показать, что он пробовал до сих пор в 'isWon()' -методе. –

ответ

2

Вы уже петлю, чтобы играть, так, в каждой итерации, таким же образом проверить, если игра isDraw(), проверьте также, если некоторые из игроков выиграл:

while (true) { 
    if (i % 2 == 1) { 
     displayBoard(); 
     getMove(); 
    } else { 
     computerTurn(); 
    } 

    // isWon() 
    if (isDraw()) { 
     System.err.println("Draw!"); 
     break; 
    } else if (playerHasWon()){ 
     System.err.println("YOU WIN!"); 
     break; 
    } else if (computerHasWon()) { 
     System.err.println("Computer WINS!\nYOU LOOSE!!"); 
     break; 
    } 

    i++; 
} 

После создания необходимые методы:

public static boolean playerHasWon() { 
    boolean hasWon = false; 

    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size; j++) { 
       // check if 5 in a line 
     } 
    } 

    return hasWon ; 
} 

public static boolean computerHasWon() { 
    boolean hasWon = false; 

    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size; j++) { 
       // check if 5 in a line 
     } 
    } 

    return hasWon ; 
} 

Следующий вопрос, конечно, является кАК СОЗДАТЬ Этот метод ?? dunno, если у вас есть проблемы с этим, но с быстрой проверкой herehere и here вы найдете некоторые идеи.


ADD ON:

Для того, чтобы уточнить, я бы функция возвращая int вместо booleans, чтобы проверить, если игра закончена, используя некоторые константы:

private final int DRAW = 0; 
private final int COMPUTER = 1; 
private final int PLAYER = 2; 

private int isGameFinished() { 
    if (isDraw()) return DRAW; 
    else if (computerHasWon()) return COMPUTER; 
    else if (playerHasWon()) return PLAYER; 
} 

Затем просто проверьте с помощью кожуха выключателя (check here how to break the while insite the while)

loop: while (true) { 
    // other stufff 
    switch (isGameFinished()) { 
    case PLAYER: 
     System.err.println("YOU WIN!"); 
     break loop; 
    case COMPUTER: 
     System.err.println("Computer WINS!\nYOU LOOSE!!"); 
     break loop; 
    case DRW:  
     System.err.println("IT'S A DRAW"); 
     break loop; 
} 
+1

Забавный и полезный ответ, спасибо большое. Тем не менее, на самом деле программа не работает, но я добился определенного прогресса. Опять же, спасибо! – jjimih