Крестики-нолики
Очень полезно в целях изучения языка программирования написать на нем несколько простых программ. Здесь мы представим игру крестики-нолики, которая написана на Python 3 с графическим интерфейсом.
О программе
В этой игре можно помериться силами с компьютером. Первый ход за игроком. Но победить искусственный интеллект в этом противостоянии будет не так уж и просто. Компьютер не делает «зевков» и если у него есть шанс победить, он непременно им воспользуется.
Внизу расположена кнопка для начала новой игры. По её нажатию игровое поле очистится и можно будет начать игру заново.
Игрок ставит крестики, а компьютер нолики. Как всегда, побеждает тот, кто первый составит линию из своих символов: по горизонтали, вертикали или диагонали.
Библиотеки и объявление переменных
Для отображения графики будем использовать стандартную библиотеку Tkinter, которая устанавливается вместе с Python. Так же нам потребуется библиотека random для того, чтобы получать случайные числа, благодаря которым ходы компьютера будут неожиданными.
Обработка нажатия кнопок
Функция click будет вызываться после нажатия на поле, то есть при попытки поставить крестик. Если игра еще не завершена, то крестик ставится. После этого увеличиваем счетчик количества выставленных крестиков.
Проверка победы
Проверяем все возможные варианты, так как теоретически можно одним ходом составить сразу 2 линии.
Действия компьютера
Графический интерфейс
Свойство colorspan у кнопки начала игры выставляем в 3, чтобы он занимал всю ширину таблицы
Игровое поле мы делали таким же образом как и кнопки в примере с калькулятором, размещённом в отдельной статье.
В целом, реализация игры крестики-нолики неплохо подходит для изучающих программирование на Python 3. Можно немного усложнить задачу, добавив уровни сложности. Например, на простом уровне сложности компьютер делает абсолютно случайные ходы. На более сложном не упускает возможности победить, но все еще может прозевать два крестика выставленных в ряд.
Играем в Крестики-Нолики с Python и GTK
Предисловие
Новый блог GTK+ порадовал статьёй для начинающих и я решил попробовать что-то более простое, чем C++/C. Python оказался как нельзя кстати. Объём кода на Python для работы с GTK значительно меньше чем на C++, что не может не радовать.
PyGTK
PyGTK — биндинг библиотеки GTK для языка Python, PyGTK используется во многих открытых программах (например IM Gajim). Библиотека может быть очень интересна для Python программистов, поскольку проста в обращении и полностью скрывает реализацию GTK.
Под катом пример приложения.
Пример приложения
Для изучения PyGTK я решил написать простой пример — игру Крестики-Нолики.
Окно игры будет максимально простым — квадрат из кнопок 3×3.
Окно игры:
Итак приступим к реализации. В программе есть пара классов: XO_Field и XO_Win, первый хранит информацию о поле, второй создаёт GUI для приложения и обрабатывает события.
Я использовал для примера модуль pygtk, установленный из пакетного менеджера в Ubuntu, на других системах стоит воспользоваться пакетами или python easy-install, а для Windows есть инсталлятор.
Используем модуль pygtk версии 2.0 или старше:
Создадим простое окно, по закрытию которого будем прерывать и цикл событий GTK. Функция destroy будет приведена чуть позже.
Для окна воспользуемся вертикальной компоновкой из трёх строк с горизонтальной.
Так кнопки будут расположены как раз в виде квадрата 3×3. Для каждой из кнопок добавляется обработчик события «clicked», синтаксис добавления очень похож на сигналы и слоты в Qt.
Функция, создающая кнопку:
Запуск основного цикла событий GTK и уничтожение окна:
По нажатию на кнопки происходит установка знака в указанную позицию и переход хода к следующему игроку, если ещё не определён победитель. Если игра завершена, результат выводится в заголовок окна.
Сама игра в Крестики-Нолики и её реализация довольно тривиальна, ссылка на исходный код приведена ниже. Больший интерес представляет сам цикл работы приложения Python в связке с GTK, так например сборщик мусора при сборке ссылок на объекты GTK также вызывает деструкторы для них, поскольку элементы UI содержат много ссылок на ресурсы.
Игра “Крестики-нолики” для двух игроков на Python.
В данной статье мы разработаем небольшую консольную программу “Крестики-нолики” для закрепления темы “Функции в Python“. Сначала рекомендуем изучить теорию создания функций и потом возвращаться к этой статье.
Используемые функции в программе
draw_board() – рисует игровое поле в привычном для человека формате.
take_input() – принимает ввод пользователя. Проверяет корректность ввода.
check_win – функция проверки игрового поля, проверяет, выиграл ли игрок.
main() – основная функция игры, которая будет запускать все ранее описанные функции. Данная функция запускает и управляет игровым процессом.
Полный листинг программы
Функция draw_board()
Внутри программы игровое поле представлено в виде одномерного списка с числами от 1 до 9.
Функция take_input()
Задачи данной функции:
1. Принять ввод пользователя.
2. Обработать некорректный ввод, например, введено не число. Для преобразования строки в число используем функцию int().
3. Обработать ситуации. когда клетка занята или когда введено число не из диапазона 1..9.
Для обработки некорректного ввода мы используем блок try…except. Если пользователь введет строку, то выполнение программы не прервется, а будет выведено сообщение “Некорректный ввод. Вы уверены, что ввели число?”, а затем цикл перейдет на следующую итерацию с возможностью по-новому ввести число.
Функция check_win()
Данная функция проверяет игровое поле. Мы создаем кортеж с выигрышными координатами и проходимся циклом for по нему.
Если символы во всех трех заданных клетках равны – возвращаем выигрышный символ, иначе – возвращаем значение False.
Непустая строка(выигрышный символ) при приведении ее к логическому типу вернет True.
Функция main()
В данной функции создаем цикл while. Цикл выполняется пока один из игроков не выиграл. В данном цикле мы выводим игровое поле, принимаем ввод пользователя, при этом определяя токен(икс или нолик) игрока.
Ждем, когда переменная counter станет больше 4 для того, чтобы избежать заведомо ненужного вызова функции check_win.
Переменная tmp была создана для того, чтобы лишний раз не вызывать функцию check_win, мы просто “запоминаем” ее значение и при необходимости используем в строке “print(tmp, “выиграл!”)”.
Наша игра получилась очень простой. Рекомендуется самостоятельно написать данный код для полного его понимания. Ждем ваших предложений по улучшению или модернизации данной игры.
Крестики-нолики на Python за 15 минут
Информацию об API вы можете найти тут.
Для начала работы нам потребуется библиотека kivy. Установить ее можно с помощью команды (Windows):
Либо с помощью команды (Linux, Python 3):
Импортируем необходимые нам элементы:
С помощью Config и функции set зададим параметры нашего окна:
Мы установили размер окна 300х300 и указали что окно нельзя перерастягивать.
Поговорим подробнее о каждой из них.
Также добавим виджет для кнопки Restart:
Весь код функции build целиком:
Поскольку мы добавили кнопку Restart, давайте поговорим об ее функционале. Добавим в функцию restart следующий код:
Переменная switch = True показывает, что ход снова возвращается к крестикам, как и было указано в начале игры. Далее мы проходимся в цикле по всем кнопкам, возвращая им цвет по умолчанию и стирая текст. Модификатор disabled показывает, что теперь вы снова можете нажать на кнопку.
После этого, разумеется, мы должны переключить ход:
Далее начнется самое сложное. Нам необходимо задать все возможные координаты кнопок, которые дадут выигрыш:
Также зададим и возможные вектора самих нажатых кнопок (в них будет храниться буквы ‘X’ либо ‘O’ ). Легче всего это сделать, написав короткую лямбда-функцию, которая будет возвращать список букв для каждого набора координат:
Такой объект является анонимной функцией, при выполнении которой возвратится список в котором будут храниться буквы. Если в таком списке все 3 буквы одинаковые, это означает выигрыш!
Теперь напишем цикл, который будет определять победную комбинацию нажатых кнопок. В переменной coordinate есть 8 комбинаций с победными сочетаниями кнопок. Пройдемся по ним в цикле:
Также необходимо залочить все кнопки в случае победы:
Внимательный читатель мог заметить, что переменная win в принципе и не нужна, а последний цикл можно переместить в цикл после перекрашивания цвета кнопок в зеленый. Полный код функции tic_tac_toe после рефакторинга:
Материал подготовлен образовательной организацией Python Academy.
Как написать игру на Python3
Самоучитель Python3 для начинающих
Глава 10.1 Исходный код игры «Крестики-Нолики».
Как всегда, я настоятельно советую набирать программу самостоятельно. Это и практика и программу понимать вы будете лучше. Впрочем, вы всегда можете скачать образец программы на странице «Загрузки«.
Итак, откройте новое окно текстового редактора Python Shell, наберите приведенный ниже код и сохраните в файле с названием ‘TicTacToe.py’ Впрочем, файл можете назвать как захотите. Но если вы потом решите конвертировать программу в *.exe — формат, то могут возникнуть проблемы с символами кириллицы в названии.
Поделиться ссылкой:
Понравилось это:
Похожее
2 комментария в “ Глава 10.1 Исходный код игры «Крестики-Нолики». ”
Добавь в начало кода
import time
import random
seconds=int(str(time.ctime()).split(‘:’)[2][0:3])
for a in range(seconds):
_random.randint(0,1)
Иначе первым всегда будет ходить один и тот же игрок,
а при добавлении данного кода в начало зависит от того момента, когда юзер открыл игру, сколько игра грузилась (а это уже зависит от компа)
Если вы используете другие функции этого модуля, надо повторять тот же код и для других функций:
import time
import random
seconds=int(str(time.ctime()).split(‘:’)[2][0:3])
for a in range(seconds):
_random.функция(аргументы)
Все это верно, но статья преследует максимально доступно и понятно объяснить концепт человеку, который еще не очень хорошо понимает Python. Кроме того, это, по сути, перевод из книги. Не хотелось ничего менять.
Но все что Вы написали, безусловно верно. И если человеку действительно будет интересно, как можно модифицировать программу, то как раз Ваш комментарий даст ему пищу для размышлений. Все останется как было.