Проблема еще не решена, но ее нужно было снести.Check for Winner Tic Tac Toe игра Java
ответ
Вы не проверять, если «компьютер» выиграл, если компе все выиграл, и игрок либо, то вы можете включить флаг tieGame истинного
Проблема заключается в этом выражении в если утверждении:
GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player &&
GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player &&
GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player
Вы проверяете, находится ли игрок в каждой позиции на борту.
Вы хотите определить, что победителя не было. Это означает, что ни один из строк, столбцов и диагонали не имеет одного и того же игрока.
, но у меня есть инструкции для проверки диагоналей, выигрышей строк и столбцов, поэтому окончательная возможность заключается в том, что все места заняты там не было объявлено победителем, потому что другие операторы if не поймали его, поэтому не должно быть никаких победитель и это галстук-игра? Это имеет смысл, я не знаю, может быть, моя логика ошибочна. –
@JaneDoe Вы можете обнаружить галстук еще раньше. Если в каждой строке, столбце и диагонали есть один X и один O, игра привязана. – 4castle
Проверьте это: http://stackoverflow.com/a/24376236/315017 –
до GameBoard[0][0] != 0
для всех 9 условий.
Ошибка в главном коде/структуре функции. Ваша функция должна возвращать две переменные, finalwinner и галстук. Прямо сейчас ваша функция останавливается в первом операторе return и устанавливает значение, равное finalwinner в main.
попробовать что-то вроде этого:
public static boolean[] CheckForWinner(int player)
{
//Row and Column Check
if (GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player ||
GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player ||
GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player ||
GameBoard[0][0] == player && GameBoard[1][0] == player && GameBoard[2][0] == player ||
GameBoard[0][1] == player && GameBoard[1][1] == player && GameBoard[2][1] == player ||
GameBoard[0][2] == player && GameBoard[1][2] == player && GameBoard[2][2] == player)
{
boolean finalwinner=true;
}
//diagonal checks
if (GameBoard[0][0]==player && GameBoard[1][1]==player && GameBoard[2][2]==player)
{
boolean finalwinner=true;
}
if (GameBoard[2][0]==player && GameBoard[1][1]==player && GameBoard[0][2]==player)
{
boolean finalwinner=true;
}
//Tie Game Check
if (GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player &&
GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player &&
GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player)
{
boolean tieGame=true;
}
return new boolean [] {finalwinner, tiegame};
}
public static void main (String[] args)
{
System.out.println("Tic Tac Toe Game");
System.out.println("Player 1 is 1, Computer is 2");
Draw();
currentplayer=1;
while (winner!= true)
{
if(currentplayer==1)
{
System.out.println("Your Turn");
Player1Turn(currentplayer);
}
else
ComputerTurn(currentplayer);
boolean result[] = CheckForWinner(currentplayer);
if(result[0]==true && result[1]==false)
{
System.out.println("Winner is Player" +currentplayer+ "Congrats Champion!");
System.out.println("Beginning New Game! Press Cancel then Enter to Exit");
Reset();
}
if(result[1]==true)
{
System.out.println("It's a Tie! Play Again.");
System.out.println("Beginning New Game! Press Cancel then Enter to Exit");
Reset();
}
if(currentplayer==1)
currentplayer=2;
else if(currentplayer==2)
currentplayer=1;
}
}
Кстати, я думаю, что ваша логика в функции CheckForWinner является точной. –
Как вы предлагаете мне это исправить? –
http://stackoverflow.com/questions/2832472/how-to-return-2-values-from-a-java-function –
EDIT: Info on enums
Это, вероятно, не то, что вы предпочли бы, но я настоятельно рекомендую вам пойти на другое представление перемещения/платы:
КАК
Во-первых, я предлагаю вам реализовать свои ячейки платы как перечисления (грех из них только 9).
Затем осуществлять плату в виде набора из 9 перечислений, как таковые:
public enum Move {
A0, A1, A2, B0, B1, B2, C0, C1, C2; }
Кроме того, реализовать выигрышные комбинации (например, целую линию, в целом по диагонали), как наборы из 3 перечислений (т.е. подмножество от набора досок).
После этих изменений становится намного легче проверить, победил ли игрок (будь то вы или компьютер).
Я рекомендую вам добавить подмножества и метод, который проверяет, выиграл ли игрок внутри класса Move.
Подмножество может быть создано следующим образом: например.
static private final EnumSet<Move> lineA = EnumSet.of(A0,A1,A2);
И чек от вашего выигравшего метода (обратите внимание, что вам нужно проверить для всех подмножеств) могло бы быть:
moves.containsAll(lineA)
, где движется есть множество ходов, сделанных игроком (когда игрок делает перемещение, которое вы добавляете перечислением в его набор движений).
ПОЧЕМУ
Эта конструкция является более кратким, простым и элегантным. Вы не должны испытывать проблемы, о которых вы описали, если вы используете этот подход.
Я довольно простой, когда дело доходит до java, я все еще новичок, поэтому я не знаю, что перечислены, поэтому я использовал 2d-массив! –
Затем я отсылаю вас к https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html. Перечисления - лучший подход в вашем случае, поэтому, если бы я был вами, я бы взял 10-15 минут, чтобы прочитать и реализовать перечисления для вашего решения. –
Прежде всего, в вашем основном методе вы говорите finalwinner=CheckForWinner(currentplayer);
, поэтому вам не нужно устанавливать finalwinner=true;
каждый раз после проверки строки, столбца и диагонали. return true;
достаточно.
Ваша проблема в том, что вы проверяете галстук-игру, и если это так, вы также возвращаете истину, но это неправильно, потому что ни игрок, ни компьютер не побеждают! Таким образом, ваш метод checkForWinner всегда возвращает true.
Вам не нужно дополнительно проверять галстук-игру. Просто проверьте выигрыш для игрока, проверьте выигрыш для компьютера, если оба являются ложными и последний ход сделан - это игра в галстуке.
Этот код может в значительной степени выиграть от некоторых циклов 'for'. Это слишком повторяемо. – 4castle
У меня раньше были петли, но он не работал, и, долгое время пробовав, я дал уточнения для операторов –
Простейшей моделью платы TicTacToe является 9-ти сегментный массив. Использование версии 2-мерного массива является ненужной сложностью. Пища для размышлений. –