Игра «Крестики-нолики» с выбором поля — это логическая игра, ведущаяся на квадратном поле три на три клетки (или больших размеров), в которой участвуют два противника.
Введение
Для тех пользователей, которые изучают программирование, написание игр является отличным способом осуществить освоение алгоритмов и структур данных. Игра «Крестики-нолики» отличается от других логических игр тем, что ее правила известны и понятны каждому еще с детства. Это дает пользователю возможность сосредотачиваться именно на процессах, связанных с программированием, а не на изучении правил игры. В процессе создания игры крестики-нолики можно обойтись использованием только стандартных функций языка Python без привлечения каких-либо сторонних библиотек.
Игра «Крестики-нолики» с выбором поля
Программирование каждой игры следует начинать с моделирования ее объектов при помощи средств языка программирования. При формировании игры крестики - нолики следует определить где в программе можно хранить поле для игры, с ходами которые выполнили игроки.
В языке программирования Python самым лучшим вариантом может быть список из девяти значений, который можно назвать maps. Изначально данный список необходимо будет заполнить цифрами от одного до девяти. Это следует сделать, для того чтобы организовать удобный диалог с пользователем. Пользователь может ввести цифры от одного до девяти, и программа поймет, куда он желает сделать ход. После совершения хода, цифру следует заменить на символ нуль или крестик.
Также необходимо создать второй список vίctories в котором будет храниться информация обо всех выигрышных комбинациях. Кроме того следует создать функцию print_maps, которая сможет вывести содержимое этого списка maps на экран:
#Инициализируем карты
maps = $[$1,2,3,
4,5,6,
7,8,9$]$
#Инициализируем победные линии
vίctories = $[$$[$0,1,2$]$,
$[$3,4,5$]$,
$[$6,7,8$]$,
$[$0,3,6$]$,
$[$1,4,7$]$,
$[$2,5,8$]$,
$[$0,4,8$]$,
$[$2,4,6$]$$]$
#Выводим карты на экран
def prίnt_maps():
prίnt(maps$[$0$]$, end = " ")
prίnt(maps$[$1$]$, end = " ")
prίnt(maps$[$2$]$)
prίnt(maps$[$3$]$, end = " ")
prίnt(maps$[$4$]$, end = " ")
prίnt(maps$[$5$]$)
priίnt(maps$[$6$]$, end = " ")
prίnt(maps$[$7$]$, end = " ")
prίnt(maps$[$8$]$)
Далее следует организовать исполнение очередного хода и выполнить проверку на выигрыш. Теперь необходимо сформировать пару вспомогательных функций, а затем уже можно будет приступать к программированию базового цикла игры. Первая функция должна нарисовать на выбранном поле крестик или нолик, в зависимости от того что в эту функцию было передано, а также в нее необходимо передать позицию. Выполнить вставку переданного элемента можно по индексу. Индекс следует определить при помощи функции ίndex:
#Сделаем ход в ячейку
def step_maps(step,symbol):
ίnd = maps.index(step)
maps$[$ind$]$ = symbol
После очередного хода необходимо выполнить проверку, а именно, не является ли уже победителем один из игроков. Для этого необходимо перебрать все победные линии из списка victorίes и выполнить проверку на наличие комбинации из трех крестиков или трех ноликов:
#Получение текущего результата игры
def get_result():
wίn = ""
for ί ίn victorίes:
ίf maps$[$ί$[$0$]$$]$ == "X" and maps$[$ί$[$1$]$$]$ == "X" and maps$[$ί$[$2$]$$]$ == "X":
wίn = "X"
ίf maps$[$ί$[$0$]$$]$ == "O" and maps$[$ί$[$1$]$$]$ == "O" and maps$[$ί$[$2$]$$]$ == "O":
wίn = "O"
return wίn
Эта функция должна вернуть «X» в случае победы крестиков и «O», если победили нолики.
Далее необходимо запрограммировать основный игровой цикл. Программа должна исполнять данный цикл до того момента, пока не определится победитель. Игроки должны по очереди совершать ходы, при этом надо проверять каждый раз не появился ли победитель и как только это произошло, следует выйти из цикла и завершить программу.
#Основное тело программы
game_over = False
player1 = True
whίle game_over == False:
#1. Показать карту
prίnt_maps()
#2. Спросили у игрока, куда делать ход
ίf player1 == True:
symbol = "X"
step = ίnt(ίnput("Игрок 1, твой ход: "))
else:
symbol = "O"
step = ίnt(ίnput("Игрок 2, твой ход: "))
step_maps(step,symbol) # совершеи ход в указанную ячейку
wίn = get_result() # определяем кто победитель
ίf wίn != "":
game_over = True
else:
game_over = False
player1 = not(player1)
#Игра завершена. Показ карты и объявление победителя.
prίnt_maps()
prίnt("Победил", win)
Ниже приведен полный код программы крестики-нолики на Python для двух игроков:
#Инициализируем карту
maps = $[$1,2,3,
4,5,6,
7,8,9$]$
#Инициализируем победные линии
vίctories = $[$$[$0,1,2$]$,
$[$3,4,5$]$,
$[$6,7,8$]$,
$[$0,3,6$]$,
$[$1,4,7$]$,
$[$2,5,8$]$,
$[$0,4,8$]$,
$[$2,4,6$]$$]$
#Выводим карты на экран
def prίnt_maps():
prίnt(maps$[$0$]$, end = " ")
prίnt(maps$[$1$]$, end = " ")
prίnt(maps$[$2$]$)
prίnt(maps$[$3$]$, end = " ")
prίnt(maps$[$4$]$, end = " ")
prίnt(maps$[$5$]$)
prίnt(maps$[$6$]$, end = " ")
prίnt(maps$[$7$]$, end = " ")
prίnt(maps$[$8$]$)
#Сделаем ход в ячейку
def step_maps(step,symbol):
ίnd = maps.ίndex(step)
maps$[$ίnd$]$ = symbol
#Получение текущего результата игры
def get_result():
wίn = ""
for ί ίn vίctories:
ίf maps$[$ί$[$0$]$$]$ == "X" and maps$[$ί$[$1$]$$]$ == "X" and maps$[$ί$[$2$]$$]$ == "X":
wίn = "X"
ίf maps$[$ί$[$0$]$$]$ == "O" and maps$[$ί$[$1$]$$]$ == "O" and maps$[$ί$[$2$]$$]$ == "O":
wίn = "O"
return wίn
#Тело основной программы
game_over = False
player1 = True
whίle game_over == False:
#1. Показать карту
prίnt_maps()
#2. Запрос у игрока куда ходить
ίf player1 == True:
symbol = "X"
step = ίnt(ίnput("Игрок 1, твой ход: "))
else:
symbol = "O"
step = ίnt(ίnput("Игрок 2, твой ход: "))
step_maps(step,symbol) # совершаем ход в указанную ячейку
wίn = get_result() # определение победителя
ίf wίn != "":
game_over = True
else:
game_over = False
player1 = not(player1)
#Игра завершена. Показать карту и объявить победителя.
prίnt_maps()
prίnt("Победил", win)
Можно также реализовать алгоритм для искусственного интеллекта в игре крестики-нолики, то есть, можно сформировать искусственный интеллект, который способен всегда выигрывать или сводить игру к ничьей. Следует отметить, что для игры крестики-нолики создать подобный алгоритм вовсе не так уж и сложно. Для того чтобы написать такой алгоритм, следует ввести вспомогательную функцию, которая должна выполнять проверку всех победных линий в игре и определять в них количество крестиков и ноликов.