Ранее поста: 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] == ' ');
}
}
Проверяйте каждый ход, если кто-то выиграл? –
@MuratK. Основываясь на своем коде (что противоречит тому, что он спрашивает), он уже пришел к такому выводу. У него '// isWon()' внутри его 'while (true)' после каждого поворота игрока/компьютера. Хотя OP явно не задал этого, я предполагаю, что он хочет знать, как реализовать 'isWon()', где будет производиться проверка для трех/четырех/пяти (в зависимости от размера платы) соседних X или O (горизонтально, вертикально или по диагонали). Опять же, это только мое предположение, поэтому, возможно, OP должен немного отредактировать свой вопрос, а также показать, что он пробовал до сих пор в 'isWon()' -методе. –