Python логика крестики нолики
Don’t learn to code. Code to learn!
- Python — Обзор
- Основы синтаксиса Python
- Операторы в Python
- Типы данных в Python
- Условные конструкторы в Python
- Циклы в Python
- Функции в Python
- Функциональное программирование в Python
- ООП в Python
- Модули в Python
- Работа с файлами в Python
- Обработка исключительных ситуаций в Python
Сегодня перед нами стоит задача написать игру крестики-нолики на питоне. Напомним, что крестики-нолики это логическая игра для двух игроков на поле 3х3 клетки.
Для начала зададим поле. Поле у нас будет одномерным списком (list) с числами от 1 до 9. Для создания воспользуемся функцией range()
Теперь напишем функцию, которая будет выводить наше поле в привычном формате.
def draw_board(board): print "-------------" for i in range(3): print "|", board[0+i*3], "|", board[1+i*3], "|", board[2+i*3], "|" print "-------------"
Результат выполнения данного кода
Самое время дать пользователям возможность вводить данные в нашу игру. Пишем функцию take_input
def take_input(player_token): valid = False while not valid: player_answer = raw_input("Куда поставим " + player_token+"? ") try: player_answer = int(player_answer) except: print "Некорректный ввод. Вы уверены, что ввели число?" continue if player_answer >= 1 and player_answerКак вы видите, функция take_input принимает параметр player_token - крестик или нолик, в зависимости от того, чей сейчас ход. Нам важно ограничить выбор пользователя числами от 1 до 9. Для этого мы используем конструкции try/except и if/else, чтобы удостовериться, что выбранная клеточка не занята. Обратите внимание, что функция take_input не возвращает никакого значения, а только изменяет имеющийся список board.
Осталось написать функцию проверки игрового поля. Назовем эту функцию check_win.
def check_win(board): win_coord = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)) for each in win_coord: if board[each[0]] == board[each[1]] == board[each[2]]: return board[each[0]] return FalseПроверка результатов игры крестики-нолики достаточно распространенная задача по программированию. Как часто бывает, одно и то же задание в программировании можно решить несколькими способами. В данном случае мы просто создали кортеж (tuple) с выигрышными координатами и прошлись циклом for по нему. Если символы во всех трех заданных клетках равны - возвращаем выигрышный символ, иначе - возвращаем значение False. При этом важно помнить, что непустая строка (наш выигрышный символ) при приведении ее к логическому типу вернет True (это понадобится нам в дальнейшем).
Осталось создать функцию main, в которой мы соберем вместе все описанные функции.
def main(board): counter = 0 win = False while not win: draw_board(board) if counter % 2 == 0: take_input("X") else: take_input("O") counter += 1 if counter > 4: tmp = check_win(board) if tmp: print tmp, "выиграл!" win = True break if counter == 9: print "Ничья!" break draw_board(board)Работа функции main предельно понятна, разве что строки 45 и 46 могут вызвать непонимание. Мы ждем когда переменная counter станет больше 4 для того, чтобы избежать заведомо ненужного вызова функции check_win (до пятого хода никто точно не может выиграть). Переменная tmp была создана опять же для того, чтобы лишний раз не вызывать функцию check_win, мы просто "запоминаем" ее значение и при необходимости используем на строке 48. Польза от такого подхода не так заметна при работе с небольшими объемами данных, но в целом подобная экономия процессорного времени - хорошая практика.
Теперь мы можем спокойно играть, запустив main(board)
И последнее уточнение. Для того, чтобы у вас корректно отображались символы кириллицы вставьте следующий код в самое начало вашего файла.
PS. Исходный код игры крестики-нолики на Python 3 на github
Крестики-нолики на Python
Статьи
Введение
В статье напишем игру “Крестики-нолики” на Python.
Крестики-нолики — логическая игра между двумя соперниками на квадратном поле 3×3 клетки, или бо́льшего размера. Один из игроков играет за “крестики”, а второй за “нолики”.
Рисуем игровое поле
Начнём с того, что нарисуем само игровое поле для игры.
Для начала сгенерируем список с числами от одного, до 9:
Создадим функцию draw_board(), аргументом которой будет board:
def draw_board(board): print("-" * 13) for i in range(3): print("|", board[0 + i * 3], "|", board[1 + i * 3], "|", board[2 + i * 3], "|") print("-" * 13)
В функции выводим первую строку состоящую из 13 символов “тире”, после чего, в цикле прорисовываем остальные края поля.
При вызове функции будет следующий вывод:
Принимаем ввод пользователя
Теперь нам нужно создать функцию для приёма ввода.
Создадим функцию take_input() с аргументом player_token:
def take_input(player_token): valid = False while not valid: player_answer = input("Куда поставим " + player_token + "? ") try: player_answer = int(player_answer) except ValueError: print("Некорректный ввод. Вы уверены, что ввели число?") continue if 1
Внутри функции сначала задаётся переменная valid, которая равняется False, после чего идёт цикл while, который не закончится, пока valid не примет значение True. В цикле производится ввод пользователем определённой клетки, в которую будет ставиться крестик, либо нолик. Если же пользователь ввёл, а какой-либо другой символ, выведется ошибка.
Далее в условии проверяется, занята ли введённая клетка. Если клетка занята, то выведется соответствующая ошибка, если же введено число не в диапазоне от 1, до 10 – будет так же выведено соответствующее сообщение.
Проверка, выиграл ли игрок
Создадим функцию check_win(), в которой будем проверять, выиграл ли игрок. Аргументом функции будет board:
def check_win(board): win_coord = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)) for each in win_coord: if board[each[0]] == board[each[1]] == board[each[2]]: return board[each[0]] return False
Внутри функции создаётся кортеж win_coord, в котором хранятся победные комбинации. В цикле производится проверка на победу игрока, если он побеждает, то выводится сообщение о победе, если же нет – возвращается False, и игра продолжается.
Создание главной функции
Теперь создадим функцию main() с аргументом board:
def main(board): counter = 0 win = False while not win: draw_board(board) if counter % 2 == 0: take_input("X") else: take_input("O") counter += 1 tmp = check_win(board) if tmp: print(tmp, "выиграл!") win = True break if counter == 9: print("Ничья!") break draw_board(board)
Внутри функции, после обозначения переменных, создаётся цикл, который закончится после победы одного из игроков, или ничьей. Внутри цикла проводится проверка, какой игрок сходил, после чего вызывается функция take_input() с соответствующим символом игрока. Далее идёт проверка, какой игрок выиграл, или вышла ничья.
Итоговый код игры “Крестики-нолики” на Python
board = list(range(1, 10)) def draw_board(board): print("-" * 13) for i in range(3): print("|", board[0 + i * 3], "|", board[1 + i * 3], "|", board[2 + i * 3], "|") print("-" * 13) def take_input(player_token): valid = False while not valid: player_answer = input("Куда поставим " + player_token + "? ") try: player_answer = int(player_answer) except ValueError: print("Некорректный ввод. Вы уверены, что ввели число?") continue if 1
Заключение
В статье мы с Вами написали игру “Крестики-нолики” на Python! Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂