В данном руководстве мы создадим игру, известную как Tic-Tac-Toe (крестики-нолики), используя язык программирования Python с нуля. Мы разделили всю программу на несколько этапов для лучшего понимания. Но прежде чем мы перейдем к процедуре, давайте разберемся с игрой.
Что такое крестики-нолики?
Крестики-нолики на Python – одна из игр, в которые играют два игрока на квадратной сетке 3 x 3. Каждый игрок заселяет клетку в свои ходы, стараясь поставить три одинаковых метки по вертикали, горизонтали или диагонали. Первый игрок использует Крестик (X) как маркер, а другой использует Ноль (O).
Теперь давайте разберемся с ее дизайном.
Дизайн крестиков-ноликов
Игра крестики нолики на Си
Задача заключается в реализации игры крестики-нолики на языке программирования Си++. Программа должна создавать поле для игры в крестики-нолики. Игроки поочерёдно вводят номер строки и столбца, в котором они хотят сделать ход. Игра проходит таким образом до тех пор, пока кто-либо из игроков не победит или не произойдёт ничья.
Игра Крестики-нолики на Python ИИ
Если клетка уже занята, то программа не должна дать сделать некорректный ход. Если кто-либо победит, программа должна уведомить об этом, после чего пользователь должен нажать кнопку, чтобы выйти из программы.
Краткое описание алгоритма программы крестики нолики на си. При запуске программы показывается игровое поле, после чего первый игрок должен ввести номер строки и столбца клетки, на которой он хочет сделать ход. Затем такие же действия должен совершить второй игрок. Программа считывает номер строки и столбца, введённые пользователем, проверяет, занято ли выбранное место, если занято, то предлагает сделать ход заново, если нет, то ход будет сделан. Если кто-либо из игроков победил, программа выводит сообщение о том, кто из игроков победил, после чего пользователь нажимают любую кнопку, чтобы выйти из программы.

Переменные и массивы. Массив a[i][j] отвечает за номер строки и столбца каждой клетки. i – номер строки клетки, j – номер столбца клетки. Подробно о работе с массивами в Си
Если a[i][j] =0 то данная клетка свободна
Если a[i][j] =1 то данная клетка занята ноликом
Если a[i][j] =2 то данная клетка занята крестиком
Переменные igra и res отвечают за состояние игры, если эти переменные равны нулю, то пока никто не победил, если 1 – победил нолик, если 2 – победил крестик. В переменную hi записывается ход игрока, например, «12» — первая строка, второй столбец. str и sto отвечают за номер выбранных строки и столбца. ver – проверяет возможность хода, если ход невозможен – 0, если возможен – 1.
В программе присутствует четыре процедуры. Подробно о процедурах в Си.
nul() обнуляет находящиеся элементы каждой клетки на поле, это нужно для начала игры. Если клетка была пустой, то процедура оставит её пустой, если клетка была занята крестиком или ноликом, процедура уберёт их оттуда.
Непобедимый соперник в игре крестики-нолики — решение задачи на Python

visual() предназначена для визуализации поля при каждом ходе. Если клетка пуста, то ничего в ней не нарисуется, если на клетке сделали ход, то процедура нарисует этот ход крестик или нолик.
Алгоритм процедуры визаулизации поля

Процедура hod(n). Процедура запрашивает номер строки и столбца в клетки, в которую ходит игрок и назначает на выбранную клетку нолик или крестик. n – номер игрока, который должен ходить в данный момент. Если n = 1 то ходит нолик, если n = 2, то ходит крестик.
Для проверки корректности хода, клетка должна быть пуста и номер должен быть один из номеров таблицы 3 на 3
Алгоритм процедуры ход.

// вывод поля на экран
void visual()
int i,j;
printf (» 1 2 3n»);
// переходим на следующую строку
// Ход игрока n — номер игрока На выходе: 0 —
void hod (int n)
int hi;// ход игрока
int sto; // номер столбца в ходе
int str; // номер строки в ходе
int ver=0; // проверка на корректность хода, если нельзя сделать такой ход то 0, если можно то 1
// запрашиваем ход, пока не будет введен корректный ход
while (ver==0)
// ввод хода
printf («Ваш ход. Введите номер строки и столбца. n»);
scanf(«%d»,
// определяем номер столбца — это последняя цифра в ходе
sto=hi%10;
// определяем номер строки хода — это первая цифра
str=(hi-sto)/10;
// проверка корректности хода, клетка должна быть пуста и номер должен быть один из номеров таблицы 3 на 3
if (a[str][sto]==0 (hi==11 || hi==12 || hi==13 || hi==21 || hi==22 || hi==23 || hi==31 || hi==32 || hi==33 )) (ver=1);
>
// если ходил игрок 1 то поле хода 1
if ( n==1)
// если ходил игрок 2 то поле хода 2
if ( n==2)
>
// Проверка Если ни один игрок не выиграл то 0, если выиграл нолик то 1 если выиграл крестик то 2
int proverka()
< int i;
int res; // значение функции. Если ни один игрок не выиграл то 0, если выиграл нолик то 1 если выиграл крестик то 2
res=0;
// проверяем выигрыш первого игрока
// пробегаем по всем строкам
for (i=1; i // проверка все ли в строке нолики
if (a[i][1]==1 a[i][2]==1 a[i][3]==1 )
>
// пробегаем по всем столбцам
for (i=1; i // проверка все ли в столбце нолики
if (a[1][i]==1 a[2][i]==1 a[3][i]==1 )
>
// проверка диагоналей
if (a[1][1]==1 a[2][2]==1 a[3][3]==1 )
if (a[1][3]==1 a[2][2]==1 a[3][1]==1 )
// проверяем выигрыш второго игрока
// пробегаем по всем строкам
for (i=1; i // проверка все ли в строке крестики
if (a[i][1]==2 a[i][2]==2 a[i][3]==2 )
>
// пробегаем по всем столбцам
for (i=1; i // проверка все ли в столбце крестики
if (a[1][i]==2 a[2][i]==2 a[3][i]==2 )
>
main()
int igra;// состояние игры если победил нолик то 1 , если победил крестик то 2 если никто пока не победил то 0
// обнуляем очищаем поле
nul();
// отображаем игровое поле
visual();
igra=0;
// пока никто не победил продолжается игра
while (igra==0)
// ход 1 го игрока нолика
hod(1);
// отображаем игровое поле
visual();
// проверка на победу первого игрока
igra=proverka();
// если первый игрок не победил , то ходит второй игрок
if (igra==0)
// ход второго игрока
hod(2);
// отображаем игровое поле
visual();
// проверка на победу второго игрока
igra=proverka();>
Задание для самостоятельной работы.
Расширьте игровое поле до размеров 5×5 клеток.
Источник: itrobo.ru
Играем в Крестики-Нолики с 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 или старше:
import pygtk pygtk.require(‘2.0’) import gtk
Создадим простое окно, по закрытию которого будем прерывать и цикл событий GTK. Функция destroy будет приведена чуть позже.
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect(«destroy», self.destroy) self.window.set_title(«Крестики-Нолики.py!») self.window.set_border_width(10) self.window.set_size_request(400,400)
Для окна воспользуемся вертикальной компоновкой из трёх строк с горизонтальной.
Так кнопки будут расположены как раз в виде квадрата 3×3. Для каждой из кнопок добавляется обработчик события «clicked», синтаксис добавления очень похож на сигналы и слоты в Qt.
self.vbox = gtk.VBox(False,0) self.window.add(self.vbox) for i in range(3): box = gtk.HBox(False,0) self.boxes.append(box) for j in range(3): self.buttons[i].append(self.create_button(box)) self.buttons[i][j].connect(«clicked»,self.on_btn_click,i,j) self.vbox.pack_start(box,True,True,0) box.show()
Функция, создающая кнопку:
def create_button(self,box): button = gtk.Button(self.field.chr) box.pack_start(button,True,True,0) button.show() return button
Запуск основного цикла событий GTK и уничтожение окна:
def main(self): gtk.main() def destroy(self, widget, data=None): gtk.main_quit()
По нажатию на кнопки происходит установка знака в указанную позицию и переход хода к следующему игроку, если ещё не определён победитель. Если игра завершена, результат выводится в заголовок окна.
Сама игра в Крестики-Нолики и её реализация довольно тривиальна, ссылка на исходный код приведена ниже. Больший интерес представляет сам цикл работы приложения Python в связке с GTK, так например сборщик мусора при сборке ссылок на объекты GTK также вызывает деструкторы для них, поскольку элементы UI содержат много ссылок на ресурсы.
P.S.
Лучшим решением было бы использовать GtkTable (контейнер для выравнивания виджетов по сетке) с 3 строками и 3 столбцами, но как-то вспомнил о нём поздно.
Со временем API GTK обновляется, как было замечено в комментариях, есть уже биндинг для gtk 3. Стоит постепенно переходить на него, но не до конца ясен вопрос с поддержкой gtk 3 на платформах, отличных от linux.
Источники
- PyGTK на Wiki
- Сайт проекта PyGTK
- О компоновке и виджетах
Источник: habr.com