Как сделать крестики нолики

Обновлено: 08.07.2024

В данной статье мы разработаем небольшую консольную программу “Крестики-нолики” для закрепления темы “Функции в Python“. Сначала рекомендуем изучить теорию создания функций и потом возвращаться к этой статье.

Используемые функции в программе

draw_board() – рисует игровое поле в привычном для человека формате.

take_input() – принимает ввод пользователя. Проверяет корректность ввода.

check_win – функция проверки игрового поля, проверяет, выиграл ли игрок.

main() – основная функция игры, которая будет запускать все ранее описанные функции. Данная функция запускает и управляет игровым процессом.

Полный листинг программы

Функция draw_board()

Внутри программы игровое поле представлено в виде одномерного списка с числами от 1 до 9.

Функция take_input()

Задачи данной функции:

1. Принять ввод пользователя.

2. Обработать некорректный ввод, например, введено не число. Для преобразования строки в число используем функцию int().

3. Обработать ситуации. когда клетка занята или когда введено число не из диапазона 1..9.

Функция check_win()

Данная функция проверяет игровое поле. Мы создаем кортеж с выигрышными координатами и проходимся циклом for по нему.

Если символы во всех трех заданных клетках равны – возвращаем выигрышный символ, иначе – возвращаем значение False.

Непустая строка(выигрышный символ) при приведении ее к логическому типу вернет True.

Функция main()

В данной функции создаем цикл while. Цикл выполняется пока один из игроков не выиграл. В данном цикле мы выводим игровое поле, принимаем ввод пользователя, при этом определяя токен(икс или нолик) игрока.

Ждем, когда переменная counter станет больше 4 для того, чтобы избежать заведомо ненужного вызова функции check_win.

Переменная tmp была создана для того, чтобы лишний раз не вызывать функцию check_win, мы просто “запоминаем” ее значение и при необходимости используем в строке “print(tmp, “выиграл!”)”.


Игра

Наша игра получилась очень простой. Рекомендуется самостоятельно написать данный код для полного его понимания. Ждем ваших предложений по улучшению или модернизации данной игры.

Pythonicway - это образовательный портал, на котором мы будем обучаться основам языка программирования Python, делиться опытом написания программ и, конечно же, практиковаться в написании кода.

Почему именно язык программирования Python?

  • Python относительно прост в изучении, поэтому он отлично подходит как первый язык программирования для начинающих.

Python в топе самых популярных языков программирования 2013 года

Распространенность языка программирования Python среди пользователей сайтов StackOverflow и GitHub

Все это делает язык программирования Python отличным выбором не только для новичка в программировании, но и для опытных программистов.

В чем отличие нашего портала от других сервисов обучения программированию?

Все больше и больше людей хотят научиться программированию не обладая при этом узкоспециализированными математическими знаниями. Поэтому мы будем учить Python, ориентируясь на широкий круг пользователей, возьмем в качестве примеров программ самые наглядные задачи и снабдим их максимально подробными и понятными комментариями.

Очень полезно в целях изучения языка программирования написать на нем несколько простых программ. Здесь мы представим игру крестики-нолики, которая написана на Python 3 с графическим интерфейсом.

О программе


Внизу расположена кнопка для начала новой игры. По её нажатию игровое поле очистится и можно будет начать игру заново.

Игрок ставит крестики, а компьютер нолики. Как всегда, побеждает тот, кто первый составит линию из своих символов: по горизонтали, вертикали или диагонали.

Библиотеки и объявление переменных

Для отображения графики будем использовать стандартную библиотеку Tkinter, которая устанавливается вместе с Python. Так же нам потребуется библиотека random для того, чтобы получать случайные числа, благодаря которым ходы компьютера будут неожиданными.

Это также стандартная библиотека Python. Так что ничего дополнительно устанавливать не надо. Просто подключаем их с помощью import . Создаем окно root , устанавливаем ему заголовок и объявляем необходимые переменные:

Обработка нажатия кнопок

Функция new_game будет вызываться при нажатии кнопки начала новой игры. На поле убираются все крестики и нолики. Цвет кнопок делаем бледно-лиловым. Устанавливаем глобальные переменные game_run и cross_count в начальные значения. Это глобальные переменные к которым пытаемся обратиться из функции. Поэтому перед попыткой изменить их значение, в Python надо использовать ключевое слово global .

Функция click будет вызываться после нажатия на поле, то есть при попытки поставить крестик. Если игра еще не завершена, то крестик ставится. После этого увеличиваем счетчик количества выставленных крестиков.

Потом проверяем с помощью функции check_win , не победили ли мы этим ходом. Если еще не выявлен победитель и есть еще ходы, то выполняет ход компьютер функцией computer_move , и также после хода идет проверка выигрыша.

Проверка победы

Если зафиксирован выигрыш, то меняем цвет фона кнопок, составляющих линию на розовый. А также записываем в game_run значение False .

Проверяем все возможные варианты, так как теоретически можно одним ходом составить сразу 2 линии.

Действия компьютера

Ход компьютера рассчитывается в функции computer_move . Алгоритм его действий следующий:

  1. Проверка возможности победы. Если компьютеру представился шанс победы – он не должен его упустить. Сразу же делает победу.
  2. Проверка возможной победы противника за один ход. Если игрок выставил два крестика в ряд, компьютер пытается разрушить планы игрока.
  3. Случайный ход. Так как победить нет возможности и нет угрозы проигрыша, то выбирается случайное свободное поле. В бесконечном цикле wile перебираются случайные числа, пока они не выпадут на не занятое поле.

Графический интерфейс

Все элементы графического интерфейса мы будем размещать с помощью упаковщика grid . В цикле добавим кнопки игрового поля. Они будут храниться в двумерном список. В языке программирования Python добавляют элементы в список с помощью метода append .

Свойство colorspan у кнопки начала игры выставляем в 3, чтобы он занимал всю ширину таблицы

Игровое поле мы делали таким же образом как и кнопки в примере с калькулятором, размещённом в отдельной статье.

В целом, реализация игры крестики-нолики неплохо подходит для изучающих программирование на Python 3. Можно немного усложнить задачу, добавив уровни сложности. Например, на простом уровне сложности компьютер делает абсолютно случайные ходы. На более сложном не упускает возможности победить, но все еще может прозевать два крестика выставленных в ряд.

Задача заключается в реализации игры крестики-нолики на языке программирования Си++. Программа должна создавать поле для игры в крестики-нолики. Игроки поочерёдно вводят номер строки и столбца, в котором они хотят сделать ход. Игра проходит таким образом до тех пор, пока кто-либо из игроков не победит или не произойдёт ничья. Если клетка уже занята, то программа не должна дать сделать некорректный ход. Если кто-либо победит, программа должна уведомить об этом, после чего пользователь должен нажать кнопку, чтобы выйти из программы.


Переменные и массивы. Массив a[i][j] отвечает за номер строки и столбца каждой клетки. i – номер строки клетки, j – номер столбца клетки. Подробно о работе с массивами в Си

Если a[i][j] =0 то данная клетка свободна

Если a[i][j] =1 то данная клетка занята ноликом

Если a[i][j] =2 то данная клетка занята крестиком

В программе присутствует четыре процедуры. Подробно о процедурах в Си.

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

процедура обнуления массива

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

Алгоритм процедуры визаулизации поля

процедура визуализации

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

Для проверки корректности хода, клетка должна быть пуста и номер должен быть один из номеров таблицы 3 на 3

Алгоритм процедуры ход.

процедура хода

proverka() при каждом ходе проверяет, не победил ли какой-либо игрок, и возвращает одно из возможных значений. Если proverka() = 0, то никто пока не победил или случилась ничья, если proverka() = 1, то победил нолик, если 2 – крестик.

При проверке мы проверяем в цикле for все строки и ищем есть в какой либо строке все нолики

// пробегаем по всем строкам

// проверка все ли в строке нолики

Аналогично идет проверрка по всем столбцам и проверка диагоналей


Полный код программы.

int a[3][3];// объявляем текущее поле 3 строки и 3 столбца. если нет ничего то поле 0, если нолик, то 1, если крестик то 2

// пробегаем по всем строкам
for(i=1; i

// вывод поля на экран

void visual()
int i,j;
printf (" 1 2 3\n");

// пробегаем по всем строкам
for(i=1; i

// переходим на следующую строку

// Ход игрока n - номер игрока На выходе: 0 -

void hod (int n)
int hi;// ход игрока
int sto; // номер столбца в ходе
int str; // номер строки в ходе
int ver=0; // проверка на корректность хода, если нельзя сделать такой ход то 0, если можно то 1
// запрашиваем ход, пока не будет введен корректный ход

while (ver==0)
// ввод хода
printf ("Ваш ход. Введите номер строки и столбца. \n");
scanf("%d", &hi);

// определяем номер столбца - это последняя цифра в ходе
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

// пробегаем по всем столбцам
for (i=1; i

// проверка диагоналей
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

// пробегаем по всем столбцам
for (i=1; i

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();>

Читайте также: