Учебное пособие по Python Tkinter: создание игры FLAMES с нуля

Учебное пособие по Python Tkinter Изучение

Эта серия статей направлена ​​на расширение ваших знаний о Tkinter, стандартном интерфейсе Python для набора инструментов Tk GUI, путем создания интерактивных игр, которые вы можете добавить в свое резюме.

Прохождение игры FLAMES

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

  • Друзья
  • Любовники
  • Любящий
  • Замужем
  • Враги
  • Братья и сестры

Давайте разработаем ту же игру, используя Python 3 и Tkinter!

Правила и как играть

  1. Запустите программу.
  2. Введите имена.
  3. Нажать на кнопку.
  4. Смотрите результат.
  5. Играй снова.

Давайте разработаем ту же игру, используя Python 3 и Tkinter

Прохождение программы

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

Например, возьмите входные данные:

CHANDLER
MONICA

Результатом будет:

HDLERMOI

Теперь наша программа вычислит общее количество букв в этом окончательном выходном списке, чтобы определить, как перебирать слово FLAME для получения результата. В приведенном выше примере у нас есть 8 букв в нашем окончательном списке, поэтому мы будем проходить буквы в FLAMES и итеративно вычеркивать каждый 8-й символ. Проверим визуально.

Здесь обратите внимание, что конечный результат

Здесь обратите внимание, что конечный результат — «А» (ласковый). Наша программа также будет проигрывать различные типы звуковых файлов на различных мероприятиях.

Реализация игры на Python (13 шагов)

1. Импортируйте необходимые библиотеки.

from tkinter import *
import simpleaudio as sa
  • tkinter: Чтобы добавить виджеты в наше приложение.
  • simpleaudio: Для воспроизведения звуковых файлов.

2. Главное окно tkinter

root = Tk()
root.title(«FLAMES»)
root.geometry(«+100+0»)
root.configure(bg=»#000000″)
root.resizable(width=False,height=False)
root.iconphoto(True,PhotoImage(file=»flames.png»))
  • root = Tk( ): Это используется для инициализации нашего модуля tkinter.
  • root.title( ): Мы используем это, чтобы установить заголовок для нашего приложения.
  • root.geometry( ): Мы используем это, чтобы указать, в каком месте будет открываться окно нашего приложения. В нашем случае он откроется в 100 точках слева и в 0 точках вниз от верхнего левого угла.
  • root.configure( ): Мы используем это, чтобы указать цвет фона для нашего приложения. В нашем случае цвет фона будет черным.
  • root.resizable( ): Мы используем это, чтобы пользователь не мог изменять размер нашего главного окна.
  • root.iconphoto( ): Мы используем это, чтобы установить значок в строке заголовка для окна нашего приложения.

3. Загрузите звуковые файлы.

#Load audio files
start = sa.WaveObject.from_wave_file(«Start.wav»)
one = sa.WaveObject.from_wave_file(«Win.wav»)
two = sa.WaveObject.from_wave_file(«Lose.wav»)
three = sa.WaveObject.from_wave_file(«Draw.wav»)
four = sa.WaveObject.from_wave_file(«1.wav»)
five = sa.WaveObject.from_wave_file(«2.wav»)
six = sa.WaveObject.from_wave_file(«6.wav»)

Мы будем использовать несколько звуковых файлов, которые будут воспроизводиться на различных мероприятиях. Когда наша программа запускается, она воспроизводит стартовый файл. Мы собираемся воспроизводить разные файлы, когда у нас разные результаты для нашей игры. Следует отметить, что Tkinter принимает только.wavфайлы. Во-первых, нам нужно загрузить звуковой файл в объект. Затем мы можем воспроизвести его, используя.play( )метод, когда это необходимо.

4. Возьмите имена входов

#Take input from user :
name1 = input(«Player 1 name : «)
name1 = name1.upper()
# replace any space with empty string
name1.replace(» «, «»)
# make a list of letters or characters
name1_list = list(name1)
# take 2nd name
name2 = input(«Player 2 name : «)
name2 = name2.upper()
name2.replace(» «, «»)
name2_list = list(name2)

Здесь мы берем имена ввода от пользователя. Пользователь должен ввести 2 имени. После того, как пользователь введет имя, наша программа преобразует имена в верхний регистр. Наша программа также заменит пробел пустой строкой. Это необходимо сделать, если пользователь вводит свое имя и фамилию через пробел. Затем мы собираемся преобразовать его в список, чтобы мы могли применить к нему remove_comman_character( )функцию.

5. Удалите общие символы

# Remove comman characters :
def remove_comman_char(list1, list2):
    for i in range(len(list1)) :
        for j in range(len(list2)) :
            if list1[i] == list2[j] :
                c = list1[i]
                # Remove character from the list
                list1.remove(c)
                list2.remove(c)
                # Concate two lists with # in middle
                list3 = list1 + [«#»] + list2
                # Return the concatenated list with True flag
                return [list3, True]
    # No common characters are found
    list3 = list1 + [«#»] + list2
    return [list3, False]

Здесь мы собираемся удалить общие символы из наших двух имен, как мы это сделали в пошаговом руководстве. Мы воспользуемся для этого интерактивным методом.

Обратите внимание, что, когда есть общие символы в нашей строке, он будет возвращать оба имя строку, разделенную #с Trueфлагом. Когда нет общих символов в наших строках, он будет возвращать оба имя строку, разделенную #с Falseфлагом. Мы будем использовать это значение флага позже в нашем коде для вычисления отношения.

6. Вызов функции

# Taking a flag as True initially
proceed = True
while proceed :
    # Function call
    ret_list = remove_comman_char(name1_list, name2_list)
    #Final list :
    con_list = ret_list[0]
    #Flag value :
    proceed = ret_list[1]
    #Index of hash :
    hash_index = con_list.index(«#»)
    # all characters before * store in p1_list
    name1_list = con_list[ : hash_index]
    # all characters after * store in p2_list
    name2_list = con_list[hash_index + 1 : ]
# count total remaining characters
count = len(name1_list) + len(name2_list)

Во-первых, мы устанавливаем флаг продолжения как True, чтобы наша remove_common_charфункция могла работать. После этого мы собираемся удалить общие символы, пока флаг продолжения не будет установлен на False. Когда общих символов нет, наша программа установит флаг как false.

Затем мы находим индекс, #по которому мы объединили наши два имени после удаления общих символов. name1_listсодержит name1символы и name2_listхранит name2символы. Наконец, мы сохраняем общую длину обоих имен после удаления общих символов в переменной count.

Из примера прохождения мы получаем:

HDLER
MOI

  • Имя 1: Length of name_1 = 5
  • Имя 2: Length of name_2 = 3
  • Общая длина: 5 + 3 = 8

7. Расчет отношения

# list of FLAMES acronym
result = [«Friends», «Lovers», «Affectionate», «Marriage», «Enemies», «Siblings»]
while len(result) > 1 :
    ind = (count % len(result)) — 1
    if ind >= 0 :
        right = result[ind + 1 : ]
        left = result[ : ind]
        result = right + left
    else :
        result = result[ : len(result) — 1]

Давайте разберемся с этим на примере. Наша программа будет работать до тех пор, пока в результате не останется только один элемент.

8. Загрузите игровые изображения

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

#Load images for tkinter window :
surprise = PhotoImage(file=»Surprise.png»)
fingers = PhotoImage(file=»Fingers.png»)
Friends = PhotoImage(file=»F11.png»)
Lovers = PhotoImage(file=»L11.png»)
Affectionate = PhotoImage(file=»A11.png»)
Marriage = PhotoImage(file=»M11.png»)
Enemies = PhotoImage(file=»E11.png»)
Siblings = PhotoImage(file=»S11.png»)

9. Сгенерируйте список имен и загрузите изображения букв в именах.

Здесь мы генерируем списки имен, которые мы будем использовать для получения изображений для каждой буквы в имени. Мы также находим длину имени, которая будет полезна при запуске цикла for.

Затем мы хотим отображать каждую букву в имени, нам сначала нужно загрузить ее в наше приложение. Обратите внимание, что наши файлы изображений для алфавитов хранятся следующим образом:

  • A.png
  • B.png
  • C.png

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

#Length of names :
n_1 = len(name1)
n_2 = len(name2)
#Creaate list of names :
l1 = list(name1)
l2 = list(name2)
#Load the letters for name1 :
for i in range(n_1):
    l1[i] = PhotoImage(file=str(l1[i])+str(«.png»))
#Load the letters for name2 :
for j in range(n_2):
    l2[j] = PhotoImage(file=str(l2[j])+str(«.png»))

10. Отображение имен

r1=0
c1=0
r2=2
c2=0
#Display name1 :
for i in range(n_1):
    B = Label(root,image=l1[i])
    B.grid(row=r1,column=c1)
    c1 = c1+1
#Add blank space :
root.grid_rowconfigure(1, minsize=50)
#Display name2 :
for j in range(n_2):
    B = Label(root,image=l2[j])
    B.grid(row=r2,column=c2)
    c2 = c2+1
#Add blank space :
root.grid_rowconfigure(3, minsize=50)

Здесь мы отображаем имена в виде меток изображений. Наше имя будет отображаться в 0-й строке, а затем будет пустое место в 1-й строке. Наше второе имя будет отображаться во 2-й строке. После этого мы добавляем пустое место в 3-м ряду.

11. Добавить кнопку и метку результата

#Add button :
btn = Button(root,image=surprise,command=lambda:Reveal())
btn.grid(row=4,column=0,columnspan = n_1)
#Add result label :
res = Label(root,image=fingers)
res.grid(row=6,column=0,columnspan = n_1)
#Add blank space :
root.grid_rowconfigure(5, minsize=50)
#Play sound file :
start.play()

Поскольку мы отобразили имена, мы создаем кнопку и метку. Когда пользователь нажимает кнопку, запускается Reveal( )функция. Наша функция раскрытия отобразит отношения между двумя введенными именами в виде изображения.

12. Основная функция для отображения результата

#Reveal the result :
def Reveal():
    if result[0]==»Friends»:
        one.play()
        res.configure(image=Friends)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Lovers»:
        five.play()
        res.configure(image=Lovers)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Affectionate»:
        six.play()
        res.configure(image=Affectionate)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Marriage»:
        four.play()
        res.configure(image=Marriage)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Enemies»:
        two.play()
        res.configure(image=Enemies)
        btn.configure(command=lambda:root.destroy())
    else:
        three.play()
        res.configure(image=Siblings)
        btn.configure(command=lambda:root.destroy())

Это основная функция, которая изменяет изображение нашей метки в зависимости от результата отношения. Наша переменная результата хранит значение рассчитанного результата отношения. Остальная часть кода — это просто операторы if-else, которые не требуют пояснений.

13. Войдите в главный цикл

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

root.mainloop()

Собираем все вместе

Взгляните на полный код этой игры Python Tkinter.

Хотите скачать код и изображения? Вы можете скачать все необходимые изображения и код здесь.

from tkinter import *
import simpleaudio as sa
root = Tk()
root.title(«FLAMES»)
root.geometry(«+100+0»)
root.configure(bg=»#000000″)
root.resizable(width=False,height=False)
root.iconphoto(True,PhotoImage(file=»flames.png»))
#Load audio files :
start = sa.WaveObject.from_wave_file(«Start.wav»)
one = sa.WaveObject.from_wave_file(«Win.wav»)
two = sa.WaveObject.from_wave_file(«Lose.wav»)
three = sa.WaveObject.from_wave_file(«Draw.wav»)
four = sa.WaveObject.from_wave_file(«1.wav»)
five = sa.WaveObject.from_wave_file(«2.wav»)
six = sa.WaveObject.from_wave_file(«6.wav»)
#Take input from user :
name1 = input(«Player 1 name : «)
name1 = name1.upper()
# replace any space with empty string
name1.replace(» «, «»)
# make a list of letters or characters
name1_list = list(name1)
# take 2nd name
name2 = input(«Player 2 name : «)
name2 = name2.upper()
name2.replace(» «, «»)
name2_list = list(name2)
#Set the longer name as name1 :
if len(name2)>len(name1):
    name3 = name1
    name1 = name2
    name2 = name3
# Remove comman characters :
def remove_comman_char(list1, list2):
    for i in range(len(list1)) :
        for j in range(len(list2)) :
            if list1[i] == list2[j] :
                c = list1[i]
                # Remove character from the list
                list1.remove(c)
                list2.remove(c)
                # Concate two lists with # in middle
                list3 = list1 + [«#»] + list2
                # Return the concatenated list with True flag
                return [list3, True]
    # No common chcaracters found
    list3 = list1 + [«#»] + list2
    return [list3, False]
# Taking a flag as True initially
proceed = True
while proceed :
    # Function call
    ret_list = remove_comman_char(name1_list, name2_list)
    #Final list :
    con_list = ret_list[0]
    #Flag value :
    proceed = ret_list[1]
    #Index of hash :
    hash_index = con_list.index(«#»)
    # all characters before * store in p1_list
    name1_list = con_list[ : hash_index]
    # all characters after * store in p2_list
    name2_list = con_list[hash_index + 1 : ]
# count total remaining characters
count = len(name1_list) + len(name2_list)
# list of FLAMES acronym
result = [«Friends», «Lovers», «Affectionate», «Marriage», «Enemies», «Siblings»]
while len(result) > 1 :
    ind = (count % len(result)) — 1
    if ind >= 0 :
        right = result[ind + 1 : ]
        left = result[ : ind]
        result = right + left
    else :
        result = result[ : len(result) — 1]
#Load images for tkinter window :
surprise = PhotoImage(file=»Surprise.png»)
fingers = PhotoImage(file=»Fingers.png»)
Friends = PhotoImage(file=»F11.png»)
Lovers = PhotoImage(file=»L11.png»)
Affectionate = PhotoImage(file=»A11.png»)
Marriage = PhotoImage(file=»M11.png»)
Enemies = PhotoImage(file=»E11.png»)
Siblings = PhotoImage(file=»S11.png»)
#Length of names :
n_1 = len(name1)
n_2 = len(name2)
#Creaate list of names :
l1 = list(name1)
l2 = list(name2)
#Load the letters for name1 :
for i in range(n_1):
    l1[i] = PhotoImage(file=str(l1[i])+str(«.png»))
#Load the letters for name2 :
for j in range(n_2):
    l2[j] = PhotoImage(file=str(l2[j])+str(«.png»))
r1=0
c1=0
r2=2
c2=0
#Display name1 :
for i in range(n_1):
    B = Label(root,image=l1[i])
    B.grid(row=r1,column=c1)
    c1 = c1+1
#Add blank space :
root.grid_rowconfigure(1, minsize=50)
#Display name2 :
for j in range(n_2):
    B = Label(root,image=l2[j])
    B.grid(row=r2,column=c2)
    c2 = c2+1
#Add blank space :
root.grid_rowconfigure(3, minsize=50)
#Add button :
btn = Button(root,image=surprise,command=lambda:Reveal())
btn.grid(row=4,column=0,columnspan = n_1)
#Add result label :
res = Label(root,image=fingers)
res.grid(row=6,column=0,columnspan = n_1)
#Add blank space :
root.grid_rowconfigure(5, minsize=50)
#Play sound file :
start.play()
#Reveal the result :
def Reveal():
    if result[0]==»Friends»:
        one.play()
        res.configure(image=Friends)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Lovers»:
        five.play()
        res.configure(image=Lovers)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Affectionate»:
        six.play()
        res.configure(image=Affectionate)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Marriage»:
        four.play()
        res.configure(image=Marriage)
        btn.configure(command=lambda:root.destroy())
    elif result[0]==»Enemies»:
        two.play()
        res.configure(image=Enemies)
        btn.configure(command=lambda:root.destroy())
    else:
        three.play()
        res.configure(image=Siblings)
        btn.configure(command=lambda:root.destroy())
root.mainloop()

Заключение

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

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

Читайте также:  5 потоковых платформ, которые позволяют вам контролировать свой собственный контент
Оцените статью
bestprogrammer.ru
Добавить комментарий