Знакомимся с Java 3

Всем привет!

В прошлый раз мы реализовали ходы человека и ходы компьютера, а так же проверку возможности хода и вывод игрового поля на экран. Вроде бы все готово? Ан нет! Программа же еще должна проверять, есть ли у нас с вами победитель или его нет. Вот для этого и предназначен следующий метод:

	// Проерка состояния игры и есть ли победители
	// возвращает символ победителя или символ пробела если пока никто не
	// выиграл
	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 или писать здесь в комментариях :-). Жду отзывов!

Вам понравилось? Было полезно? Поделитесь!

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Запись опубликована в рубрике Знакомимся с Java с метками , , , , . Добавьте в закладки постоянную ссылку.

15 Responses to Знакомимся с Java 3

  1. Михаил говорит:

    В игре имеется косяк в методе CheckGame()
    Я проиграл имея такой расклад:
    0 + X
    + X 0
    X 0 +
    YOU LOSE!

  2. Михаил говорит:

    Я думаю вот в чём ошибка:
    // Проверка побочной диагонали если победитель пока не найден
    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]
    }

  3. Олег говорит:

    вот я искренне пытался сделать все как написано,
    но столкнулся с некоторой недосказанностью, которую пришлось устранять самому (я первый раз сегодня работаю с java и eclipse)
    1) в первом уроке не понятно какое имя давай проекту, это нигде не написано, только из последующего снимка можно понять, что это Hello
    2) мне стало не понятно, куда писать код со второго урока, в какое место нашего созданного документа?! это не очевидно.
    3) при копировании кода в проект Eclipse начал ругаться на «IOException», мол ничего не знаю о нём, я тем более, потому пришлось скачивать итоговый проект, подключать и смотреть чем мой код отличается от исходного, оказалось что не хватает 3 строк, о которых ничего не сказано в уроках. (может просто я не нашел)

    Спасибо за урок, но всё-таки, добавьте итоговый листинг на страницу, чтобы не приходилось скачивать архив программы.

  4. Михаил говорит:

    Думаю, стоит добавить проверку валидноти хода человека. В вышеуказанном коде допускается возможность сделать ход на ‘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

  5. Павел говорит:

    Огромное спасибо. Статьи очень хорошие, понятные даже такому нубу как я.
    Далее о том, что нубу показалось непонятным.

    1. Не хватило описания импорта…
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    3. Хорошо было бы пару слов про то как готовый проект затащить в Эклипс типа.
    Создать новый проект в eclipse.
    Скопировать исходники в папку src, сохранив при этом структуру пакетов из исходников.

  6. Тимур говорит:

    Здравствуйте!
    Пробовал свои навыки в Java с вашей игрой. Очень занимательно, спасибо.
    Но почему то у меня не выводится Ничья. Когда по идее игра должна была выдать, «STANDOFF!» у меня просто ничего не происходит. Никакие команды и клавиши не работают. Надеюсь, вы знаете ответ.

  7. EgorZP говорит:

    еще желательно поменять условие в 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)

  8. Александр говорит:

    Здравствуйте.
    Статья отличная, но я кое-что у себя добавил и исправил. Может будет интересно.
    1. Добавил запрос на повторение игры, чтобы не запускать игру каждый раз заново.
    2. Добавил рандомный выбор первого хода (человек или компьютер).
    3. Исправил ошибку, когда игра зацикливалась при отсутствии ходов. Поясню. Когда на поле остаётся одна пустая клетка и наступает ход игрока, то после ввода координат игра зацикливается, так как метод CompMove() однозначно вызывается после метода HumanMove() и наоборот.
    4. Добавил сообщение «GAME OVER!», если человек выбирает не продолжать играть.
    Ещё стоит добавить проверку на ввод данных пользователя, так как если ввести цифру больше 3 или меньше 0, то программа падает с ошибкой.
    А в остальном всё супер, спасибо =) Это, кстати, первая моя игра на Java =)
    Если интересно, пишите мне на почту, я отправлю исходник исправленного варианта.
    Всего хорошего.

  9. Oleg говорит:

    Ідея супер!!! Трохи хромає реалізація. Методи, наприклад, з малої букви пишуться: humanMove().

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *