Автор оригинала: Team Python Pool.
Создание графического интерфейса с поддержкой Tic Tac Toe в Python
Лучший способ изучения языка программирования-это выполнение увлекательных проектов. А что может быть лучше, чем сделать наши любимые<сильные> крестики-нолики в игре Python, да еще и с графикой? Разве это не здорово! И если вы думаете, что это будет трудно, вы ошибаетесь, мой друг. Очень легко сделать крестики-нолики на python. Все, что вам нужно, – это базовое понимание языка программирования python.
Для создания этого проекта с графическим интерфейсом (где возможно взаимодействие с пользователем) мы будем использовать модуль python Tkinter, который очень прост в реализации. Кроме того, мы будем использовать фундаментальные понятия python, такие как списки, условия if и функции. Так чего же мы ждем? Давайте узнаем, как сделать крестики-нолики на python.
Примечание: Этот код предназначен для python версии 3 и выше. Логика будет такой же для версии 2, но будут внесены синтаксические изменения.
Создание графического интерфейса для Tic Tac Toe в python
Наша цель-создать интерфейс, подобный описанному выше. Для этого в python у нас есть предустановленная библиотека под названием Tkinter, которая используется для создания такой графики.Поскольку этот модуль поставляется с предустановленным python, мы можем напрямую импортировать его.
from tkinter import *
Использование * after import означает, что мы импортировали все методы, переменные библиотеки tkinter.
Здесь мы создали виджет Tk и назначили его корню переменной. Tk-это родительское окно, содержащее строку заголовка и некоторые другие украшения, предоставляемые оконным менеджером. Мы должны создать этот виджет раньше любого другого виджета, и может быть только один такой тип виджета.
Приведенная выше строка кода создает виджет метки, где мы можем написать что-то в родительском окне. В первом параметре мы даем значение родительского окна, в данном случае root. В качестве второго параметра мы указываем, какой текст мы должны отобразить. В третьем параметре мы установили тип шрифта "times 15". Вы можете изменить его в соответствии с вашим желанием.
После этого мы хотим отобразить этот текст в 0-й строке 1-го столбца, и для этого мы использовали).Поскольку крестики-нолики-это игра для двух игроков, нам нужны две такие метки. Итак, мы создали label2, похожий на label1.
Создание ячеек в крестики-нолики
В крестиках-ноликах всего 9 клеток. И для каждой ячейки нам нужно создать кнопку. Так что, когда игрок нажимает кнопку, мы будем знать, какая ячейка. В приведенном выше коде мы использовали метод кнопок Tkinter. В качестве первого параметра мы задали значение root, так как хотим, чтобы кнопка находилась внутри родительского окна. Во втором и третьем параметрах мы задали значения ширины и высоты кнопки. Вы можете играть с этими ценностями для лучшего понимания. После этого нам нужно что-то сделать, когда эта кнопка получает щелчок, поэтому в 4-м параметре мы даем команду вызвать 'define_sign()' с помощью ключевого слова lambda всякий раз, когда эта кнопка нажата
Не запутывайтесь, если вы не знаете, что такое ключевое слово lambda. А пока подумайте об этом как о способе вызова метода define_sign() при нажатии кнопки button1. Мы передали '1' методу define_sign (), потому что была нажата кнопка button1. И не беспокойтесь о методе define_sign (). Мы поймем это, когда узнаем концепцию, лежащую в основе игры.
После этого мы поместим кнопку в 1-ю строку и 1 столбец точно так же, как мы поместили виджет метки. Аналогично, мы должны создать еще 8 кнопок, таких же, как button1.
Вуаля! Мы успешно создали графический интерфейс для нашей игры. Разве это не просто? Поверьте мне, остальная часть кода так же проста, как и эта.
Как определяется Победитель в Крестики-нолики?
В крестики-нолики играют два игрока. "X" - это знак, используемый Игроком 1, а "Player2 использует O". href="https://en.wikipedia.org/wiki/Winner">Победитель определяется, если все значения любой строки или столбца имеют одинаковую метку ("X" или "O"). Если знак в любой из диагоналей идентичен, победитель определяется. href="https://en.wikipedia.org/wiki/Winner">Победитель определяется, если все значения любой строки или столбца имеют одинаковую метку ("X" или "O"). Если знак в любой из диагоналей идентичен, победитель определяется.
Итак, есть восемь комбинаций, когда Победитель может быть определен.
Реализация логики Tic Tac Toe в Python –
def result(boards,mark): return ((boards[1][2] [3]) or (boards[4][5] [6]) or (boards[7][8] [9]) or (boards[1][4] [7]) or (boards[2][5] [8]) or (boards[3][6] [9]) or (boards[1][5] [9]) or (boards[3][5] [7]))
Здесь мы создадим функцию с именем result (), которая вернет True, если метка во всех трех ячейках одинакова. В первом параметре "доски" мы дадим список, который содержит отметку на каждой ячейке. Например, если игрок 1 нажал на кнопку 3, то этот список будет иметь индекс at 3.
Второй параметр, "mark", содержит значение либо "X", либо " O. " Эта функция проверит, имеет ли переданный список (доски) метку ("X" или "O") в этих ячейках или нет. Если да, то он вернет True, в противном случае False
Доска всегда будет содержать " 1 " в индексе 0, потому что индекс списка начинается с 0, поэтому мы должны приспособиться к этому.
Например, если значение, переданное в первом параметре, равно -[1, 'X', 'O', 'O', 'X', 'O', 'O', 'X', 'X'], то наша функция проверит, удовлетворяют ли эти значения условиям в нашей функции.
Реализация функции Constants и define_sign()
Этот список содержит все номера ячеек доски tic tac toe. С помощью этих цифр вы можете получить соответствующую отметку.
#A list containing all the cell numbers numbers=[1,2,3,4,5,6,7,8,9]
Мы инициализируем игровые иконки для игроков. "X" будет для игрока 1, а " O " - для игрока 2. По ходу игры значение этой переменной меняется в зависимости от того, какой игрок в данный момент играет.
Мы инициализируем переменную x, которая подсчитывает количество шансов, сыгранных игроками. Логика игры будет обновлять эту переменную всякий раз, когда игрок нажимает на нее.
#x is the counter to keep counting the number of chances
Доска-это массив, в котором хранится соответствующая отметка, сделанная каждым игроком. Доступ к этому списку осуществляется с помощью списка чисел, и таким образом python понимает значения платы.
"""boards is a list to store the mark with respect to the cell number""" boards=["board"]*10
Destroys-это функция, которая очищает все виджеты Tkinter и уничтожает их. Всякий раз, когда игра заканчивается, эта функция срабатывает, заставляя окно Tkinter закрываться.
def destroys(): # destroys the window when called root.destroy()
Теперь все, что осталось, - это функция define_sign (). Всякий раз, когда производится щелчок по какой-либо из кнопок, вызывается этот метод (проверьте параметр "command" метода Button Tkinter), содержащий информацию о кнопке в ее аргументе.
def define_sign(number): global x,y,numbers """ Checking which button has been clicked and checking if the button has been already clicked or not to avoid over-writing """ if and number in numbers: numbers.remove(number) # If the value of x is even, Person1 will play and vivee versa if: elif: #Using config, we write mark the button with appropriate value. ) +1 # Here we are calling the result() to decide whether we have got the winner or not if(result(boards,mark) and ): #If Player1 is the winner show a dialog box stating the winner showinfo("Result","Player1 wins") #Call the destroy function to close the GUI destroys() elif(result(boards,mark) and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and ): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark)and ): showinfo("Reuslt","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and ): showinfo("Result","Player1 wins") destroys() elif(result(boards,"O")and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark)and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and ): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): print("Player2 wins") showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and): print("Player1 wins") showinfo("Result","Player1 wins") destroys() elif(result(boards,"O")and): print("Player2 wins") showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and): print("Player1 wins") showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): print("Player2 wins") showinfo("Result","Player2 wins") destroys() # If we have not got any winner, display the dialogbox stating the match has bee tied. if(x>8 and and): showinfo("Result","Match Tied") destroys()
Полный код для Tic Tac Toe в Python
from tkinter import * from tkinter.messagebox import showinfo import warnings #Removes all the warning from the output warnings.filterwarnings('ignore') () numbers=[1,2,3,4,5,6,7,8,9] # for player1 and 'O' for player2 # x is the counter to keep counting the number of chances #boards is a list to store the mark with respect to the cell number boards=["board"]*10 def result(boards,mark): return ((boards[1][2] [3]) or (boards[4][5] [6]) or (boards[7][8] [9]) or (boards[1][4] [7]) or (boards[2][5] [8]) or (boards[3][6] [9]) or (boards[1][5] [9]) or (boards[3][5] [7])) def define_sign(number): global x,y,numbers """ Checking which button has been clicked and checking if the button has been already clicked or not to avoid over-writing""" if and number in numbers: numbers.remove(number) # If the value of x is even, Person1 will play and vivee versa if: elif: #Using config, we write mark the button with appropriate value. ) +1 # Here we are calling the result() to decide whether we have got the winner or not if(result(boards,mark) and ): #If Player1 is the winner show a dialog box stating the winner showinfo("Result","Player1 wins") #Call the destroy function to close the GUI destroys() elif(result(boards,mark) and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and ): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark)and ): showinfo("Reuslt","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark)and ): showinfo("Result","Player1 wins") destroys() elif(result(boards,"O")and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark)and): showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and ): showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): print("Player2 wins") showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and): print("Player1 wins") showinfo("Result","Player1 wins") destroys() elif(result(boards,"O")and): print("Player2 wins") showinfo("Result","Player2 wins") destroys() if and number in numbers: numbers.remove(number) if: elif: ) +1 if(result(boards,mark) and): print("Player1 wins") showinfo("Result","Player1 wins") destroys() elif(result(boards,mark) and): print("Player2 wins") showinfo("Result","Player2 wins") destroys() # If we have not got any winner, display the dialogbox stating the match has bee tied. if(x>8 and and): showinfo("Result","Match Tied") destroys() ,font="times 15")) ,font="times 15")) def destroys(): # destroys the window when called root.destroy() :define_sign(1))):define_sign(2))): define_sign(3))): define_sign(4))): define_sign(5))): define_sign(6))): define_sign(7))): define_sign(8))): define_sign(9))) root.mainloop()
Должен Читать:
- Как преобразовать строку в нижний регистр в
- Как вычислить Квадратный корень
- Пользовательский ввод | Функция ввода () | Ввод с клавиатуры
- Лучшая книга для изучения Python
Вывод-
- Временная сложность реализации tic tac toe в python равна O(1).
- Минимальное количество ходов, необходимое для победы, - 5.
- Если оба игрока играют оптимально, то результат закончится вничью.
- Вы можете добавить в этот проект много интересного, например, попросить сыграть еще раз, или добавить табло, показывающее количество побед каждого игрока. Вы можете спросить у игроков их имена. Вы так много можете сделать, чтобы улучшить свой код и, следовательно, себя. Попробуйте запустить этот tic tac toe на python в вашей локальной системе, и мы всегда будем рядом, если у вас возникнут какие-либо проблемы.
Попробуйте запустить программы на вашей стороне и дайте мне знать, если у вас есть какие-либо вопросы.
Счастливого кодирования!