Рубрики
Без рубрики

Создание графического интерфейса с поддержкой Tic Tac Toe в Python

Крестики-нолики в Python-популярная игра, и ее действительно интересно кодировать. В этом посте мы создаем графический интерфейс на основе Крестиков-ноликов с использованием Python и Tkinter.

Автор оригинала: Team Python Pool.

Создание графического интерфейса с поддержкой Tic Tac Toe в Python

Лучший способ изучения языка программирования-это выполнение увлекательных проектов. А что может быть лучше, чем сделать наши любимые<сильные> крестики-нолики в игре Python, да еще и с графикой? Разве это не здорово! И если вы думаете, что это будет трудно, вы ошибаетесь, мой друг. Очень легко сделать крестики-нолики на python. Все, что вам нужно, – это базовое понимание языка программирования python.

Для создания этого проекта с графическим интерфейсом (где возможно взаимодействие с пользователем) мы будем использовать модуль python Tkinter, который очень прост в реализации. Кроме того, мы будем использовать фундаментальные понятия python, такие как списки, условия if и функции. Так чего же мы ждем? Давайте узнаем, как сделать крестики-нолики на python.

Примечание: Этот код предназначен для python версии 3 и выше. Логика будет такой же для версии 2, но будут внесены синтаксические изменения.

Создание графического интерфейса для Tic Tac Toe в python

крестики нолики в python
крестики нолики в 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 в вашей локальной системе, и мы всегда будем рядом, если у вас возникнут какие-либо проблемы.

Попробуйте запустить программы на вашей стороне и дайте мне знать, если у вас есть какие-либо вопросы.

Счастливого кодирования!