питон игра крестики нолики код
Как написать игру на 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. Кроме того, это, по сути, перевод из книги. Не хотелось ничего менять.
Но все что Вы написали, безусловно верно. И если человеку действительно будет интересно, как можно модифицировать программу, то как раз Ваш комментарий даст ему пищу для размышлений. Все останется как было.
Крестики-нолики
Очень полезно в целях изучения языка программирования написать на нем несколько простых программ. Здесь мы представим игру крестики-нолики, которая написана на 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: нестандартные функции. Игра «Крестики-нолики».
Продолжаем учить язык программирования пайтон Python. Переходим к изучению 6 главы «Функции. Игра Крестики-нолики» по книге: Майкл Доусон “Программируем на Python”, 2014 (Michael Dawson “Python Programming for the Absolute Beginner”, 3rd Edition), чтобы создавать собственные функции и работать с глобальными переменными.
Как создать функцию?
Общий вид функции в Python: название_функции()
Чтобы создать собственную функцию, нужно ее объявить.
Общий вид объявления функции
def название_функции(параметр1, параметр2. ):
»’Документирующая строка»’
Блок выражений функции
Функции могут:
Параметр функции
— это имя переменной в скобках после названия функции. В момент объявления функции параметр может не иметь конкретного значения. При вызове функции параметру нужно присвоить значение.
Позиционные параметры функции
В функции можно перечислить несколько параметров:
def название_функции(параметр1, параметр2. ):
Вызов этой функции с позиционными аргументами :
название_функции(‘значение параметра1’,значение параметра2. )
Вызов этой функции с именованными аргументами (для них не важен порядок!) :
название_функции(параметр1=’значение параметра1′, параметр2=значение параметра2. )
название_функции(параметр2=значение параметра2, параметр1=’значение параметра1′. )
Параметры по умолчанию
def название_функции(параметр1=’значение’, параметр2=значение. ):
Если при вызове функции никакие другие значения параметрам не присвоятся, то отобразятся значения параметров по умолчанию.
Присваивая значение по умолчанию одному параметру, это нужно сделать для всех остальных параметров в объявляемой функции.
Параметры по умолчанию можно переопределить при вызове функции, при чем переопределять их можно и по отдельности, а не все сразу. Например, так:
def название_функции(параметр1=’значение’, параметр2=значение):
Функция, которая возвращает значения
def vozvrat():
imya=’kot’
return imya
Запуск программы дает:
Можно возвращать несколько значений через запись return p1,p2,p3.
Функция main()
Основной код программы можно не оставлять в глобальной зоне видимости, а поместить в функцию, которое можно дать любое имя, например, main()
Тогда код запуска программы будет выглядеть так:
main()
input(‘Нажмите Entr, чтобы выйти’)
Глобальные переменные
Переменные внутри функции доступны только там. Есть глобальные переменные, которые объявляются вне функций, при этом они доступны внутри функций тоже, то только для «чтения», если не указано обратное.
Глобальная переменная — создается в общей области видимости.
Локальная переменная — создается внутри функции.
Изменение глобальной переменной внутри функции
Чтобы менять глобальные переменные, находясь внутри функции, пишем global
Затенение глобальной переменной
Так как в общем случае внутри функции нельзя изменить значение глобальной переменной, но можно создать одноименную переменную внутри функции. Это и будет затенение. Новая одноименная переменная будет работать только внутри функции. Но это вносит путаницу, лучше так не делать.
Глобальные константы
Переменные мы изменяем по ходу кода. А константы — это переменные, записанные большими буквами ( CONSTANTA ), которые мы решили не менять. В общем случае лучше использовать глобальные константы, чем глобальные переменные.
Игра «Крестики-нолики»
Задача: написать программу, в которой пользователь может играть с компьютером в крестики-нолики на поле 3х3. Сначала показывается инструкция к игре. Далее идет выбор, кто будет ходить первым. Начинается игра, игроки делают ходы по очереди. Когда кто-то выигрывает или игра сыграна вничью, выводятся результаты и программа завершает работу.
Начнем с создания собственной функции, которая будет показывать пользователю инструкцию к игре :
Чтобы реализовать этот блок программы, сначала объявим первую общую функцию, которая будет задавать вопрос и получать ответ «да» или «нет»:
Вторая часть функции присваивает игрокам тип фишек в зависимости от того, кто ходит первый, и будет состоять из уже объявленной функции nachalo(vopros) :
Сделаем функцию, которая генерирует игровые поля :
Функция, создающая каждый раз новую доску с ходами выглядит так:
Теперь нужно сделать функцию, которая будет показывать пользователю доску с результатом каждого хода:
Нам еще потребуется функция, которая проверяет, куда можно пойти. Для этого нужно сделать функцию с перебором всех пустых клеток, чтобы все незанятые места добавились в список, который и есть «доступные ходы»:
Следующая функция учитывает ходы пользователя, для этого нужно сначала понять, куда можно пойти, затем ожидается ввод пользователя числа из доступных. Функция принимает доску и тип фишек пользователя. В итоге работы функции пользователь делает ход:
Пришло время самой сложной для меня функции — это ходы компьютера. Нужно, чтобы компьютер делал «хорошие» ходы, старался выиграть у пользователя. Ходить наугад можно, если компьютер будет выбирать любое свободное место на поле. Но тогда ему будет трудно выиграть.
Чтобы не «испортить» исходную доску, опытные программисты советуют создавать внутри функции «копию» доски, в которую мы и будем вносить изменения:
Чтобы компьютер не ходил «от балды», учтем следующую стратегию:
Лучшие поля задаются константой внутри функции:
В итоге вся функция ходов компьютера получается такой:
Нужна еще одна функция, которая будет давать сделать ход следующему игроку, определяя какими фишками был сделан последний ход и передавая ход другим фишкам:
Потребуется еще функция, которая выявит победителя и поздравит пользователя с окончанием игры. Эта функция будет использоваться только в самом конце игры:
Попробуем запустить программу с игрой «Крестики-Нолики», для запуска потребуется всего две строки кода:
Запуск программы показал, что игра не работает как надо. Несмотря на то, что логика построения программы верная, в самих функциях где-то допущены ошибки. Нужно их исправить.
Исправление ошибок в игре «Крестики-нолики».
Тестирование программы игры и исправление ошибок оказалось довольно трудной задачей, чтобы сделать это «на глаз». Как искать ошибки в программе? Наверное, лучший способ — это протестировать работу каждой функции отдельно. Запустим каждую функцию и посмотрим, где есть проблемы:
Функция instrukciya() работает:
В функции hod(low,high) я решила добавить конкретный вопрос, и ее запуск тоже прошел успешно со значениями 0-8 hod(0,8) :
Запуск функции new_doska() ошибок не выдал, но и результата тоже, так как изначально этот блок пустой.
Спустя еще пару часов блужданий по коду, поиска ошибок, запусков отдельных функций и групп функций, я обнаружила, что в нескольких местах знак «крестика» X был написан разными символами, а также кое-где крестик стоял в кавычках. Еще некоторые мелочи были исправлены. Конечный вариант кода программы (которая заработала и выиграла у меня!) выглядит так:
Мой первый матч в крестики-нолики с компьютером выглядел так: