Всем привет!
В прошлый раз мы реализовали ходы человека и ходы компьютера, а так же проверку возможности хода и вывод игрового поля на экран. Вроде бы все готово? Ан нет! Программа же еще должна проверять, есть ли у нас с вами победитель или его нет. Вот для этого и предназначен следующий метод:
// Проерка состояния игры и есть ли победители // возвращает символ победителя или символ пробела если пока никто не // выиграл public static char CheckGame() { char winner = ' '; // Проверка по горизонтали for (int i = 0; i < 3; i++) { if (field[i][0] == field[i][1] && field[i][1] == field[i][2] && field[i][0] != '+') { winner = field[i][0]; break; } } // Проверка по вертикали если победитель пока не найден if (winner == ' ') { for (int i = 0; i < 3; i++) { if (field[0][i] == field[1][i] && field[1][i] == field[2][i] && field[0][i] != '+') { winner = field[0][i]; break; } } } // Проверка главной диагонали если победитель пока не найден if (winner == ' ') { if (field[0][0] == field[1][1] && field[1][1] == field[2][2] && field[0][0] != '+') { winner = field[0][0]; } } // Проверка побочной диагонали если победитель пока не найден if (winner == ' ') { if (field[0][2] == field[1][1] && field[1][1] == field[2][0] && field[0][2] != '+') { //UPD: Спасибо Михаилу! Вот здесь ошибочка!: //winner = field[0][0]; // Должно быть так: winner = field[0][2]; } } // Возвращаем победителя или проебл, если такового пока нет return winner; }
Хотя он кажется немного громоздким, но ничего сложного в нем нет. Поскольку игровое поле у нас маленькое, то сначала мы просто проверяем каждую горизноталь, потому каждую вертикаль, а потом поочередно две диагонали. При этом в самом начале в переменную winner записан символ пробела, который говорит о том, что победителя нет. А если где-то при проверке мы встретили победную ситуацию (все клетки по горизонтали, вертикали или диагонали равны), то в переменную winner записывается символ победителя. И этот символ и возвращается методом.
Ну и на последок, код метода main() с которого и начинается выполнение любой программы на Java.
public static void main(String[] args) throws IOException { System.out.println("Game Started!!!"); PrintField(); while (CheckGame() == ' ' && CanMove()) { HumanMove(); CompMove(); PrintField(); } if (CheckGame() == 'X') { System.out.println("YOU WIN!"); } if (CheckGame() == '0') { System.out.println("YOU LOSE!"); } if (CheckGame() == ' ' && !CanMove()) { System.out.println("STANDOFF!"); } }
Здесь в третьей строке мы вызываем написаный нами в прошлый раз метод вывода на экран, затем в цикле до тех пор, пока есть свободные клетки и пока не определится победитель, мы вызываем ход игрока, потом ход компьютера и затем выводим на экран игровое поле.
Когда же наш цикл прервется, мы проверяем, кто выиграл и в зависимости от того какой результат получаем выводим на экран соответствующую надпись. Вот и все! Наша программа полностью готова! Можно скомпилировать и запустить! Проект в Eclipse можно взять здесь. Проекты и пожелания направлять на мою почту david@davidmd.ru или писать здесь в комментариях :-). Жду отзывов!
В игре имеется косяк в методе CheckGame()
Я проиграл имея такой расклад:
0 + X
+ X 0
X 0 +
YOU LOSE!
Спасибо. Сча посмотрю в чем дело.
Посмотрел ошибку в коде исправил 🙂
Я думаю вот в чём ошибка:
// Проверка побочной диагонали если победитель пока не найден
if (winner == ‘ ‘) {
if (field[0][2] == field[1][1] && field[1][1] == field[2][0]
&& field[0][2] != ‘+’) {
winner = field[0][0]; ЗДЕСЬ ДОЛЖНО БЫТЬ winner = field[0][2]
}
Ну да, именно в этом я уже поправил 🙂
вот я искренне пытался сделать все как написано,
но столкнулся с некоторой недосказанностью, которую пришлось устранять самому (я первый раз сегодня работаю с java и eclipse)
1) в первом уроке не понятно какое имя давай проекту, это нигде не написано, только из последующего снимка можно понять, что это Hello
2) мне стало не понятно, куда писать код со второго урока, в какое место нашего созданного документа?! это не очевидно.
3) при копировании кода в проект Eclipse начал ругаться на «IOException», мол ничего не знаю о нём, я тем более, потому пришлось скачивать итоговый проект, подключать и смотреть чем мой код отличается от исходного, оказалось что не хватает 3 строк, о которых ничего не сказано в уроках. (может просто я не нашел)
Спасибо за урок, но всё-таки, добавьте итоговый листинг на страницу, чтобы не приходилось скачивать архив программы.
Думаю, стоит добавить проверку валидноти хода человека. В вышеуказанном коде допускается возможность сделать ход на ‘O’.
Предлагаю добавить:
//Сразу после PrintField();
boolean validate;
while( CanMove() && CheckGame() == ' ' ){
validate = false;
while( !validate ){ validate = HumanMove(); };
BotMove();
PrintField();
}
и
//Сразу после y = Integer.parseInt( br.readLine() ) - 1;
if( field[ x ][ y ] == '+' ){
field[ x ][ y ] = 'X';
return true;
}
System.out.println( "Forbidden move!" );
return false;
заменив тип void метода HumanMove() на boolean
Было бы вполне логично )))
Огромное спасибо. Статьи очень хорошие, понятные даже такому нубу как я.
Далее о том, что нубу показалось непонятным.
1. Не хватило описания импорта…
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
3. Хорошо было бы пару слов про то как готовый проект затащить в Эклипс типа.
Создать новый проект в eclipse.
Скопировать исходники в папку src, сохранив при этом структуру пакетов из исходников.
Здравствуйте!
Пробовал свои навыки в Java с вашей игрой. Очень занимательно, спасибо.
Но почему то у меня не выводится Ничья. Когда по идее игра должна была выдать, «STANDOFF!» у меня просто ничего не происходит. Никакие команды и клавиши не работают. Надеюсь, вы знаете ответ.
Хм, боюсь что нет… А вы что-то меняли в коде игры?
еще желательно поменять условие в while на такое
while (x 2 || y 2 || field[x][y] == ‘0’ || field[x][y] == ‘X’)
иначе после первого ввода икс и игрик можно улететь за пределы массива.
Enter x (1..3):
12
Enter y (1..3):
12
Exception in thread «main» java.lang.ArrayIndexOutOfBoundsException: 11
at Hello.HumanMove(Hello.java:41)
at Hello.main(Hello.java:18)
Счас с мобильника, как только будет комп, поменяю!
Здравствуйте.
Статья отличная, но я кое-что у себя добавил и исправил. Может будет интересно.
1. Добавил запрос на повторение игры, чтобы не запускать игру каждый раз заново.
2. Добавил рандомный выбор первого хода (человек или компьютер).
3. Исправил ошибку, когда игра зацикливалась при отсутствии ходов. Поясню. Когда на поле остаётся одна пустая клетка и наступает ход игрока, то после ввода координат игра зацикливается, так как метод CompMove() однозначно вызывается после метода HumanMove() и наоборот.
4. Добавил сообщение «GAME OVER!», если человек выбирает не продолжать играть.
Ещё стоит добавить проверку на ввод данных пользователя, так как если ввести цифру больше 3 или меньше 0, то программа падает с ошибкой.
А в остальном всё супер, спасибо =) Это, кстати, первая моя игра на Java =)
Если интересно, пишите мне на почту, я отправлю исходник исправленного варианта.
Всего хорошего.
Александр , не могли бы вы мне прислать код на email?vladyslav.borodin@gmail.com
Ідея супер!!! Трохи хромає реалізація. Методи, наприклад, з малої букви пишуться: humanMove().