Учебное пособие по Python Tkinter: создание F.L.A.M.E.S. игра с нуля

Python Tkinter Games Series

  • Создайте игру по угадыванию чисел

  • Создайте игру с беспорядочными словами с нуля

  • Создайте игру камень-ножницы-бумага

  • Создайте игру-калькулятор процента любви

  • Создайте ОГОНЬ игра с нуля

Эта статья является частью серии статей о Python Tkinter, написанной Pratik Shukla. Посетите его аккаунт на Medium, чтобы прочитать другие его статьи. И следите за новостями, чтобы увидеть больше статей о Tkinker от Pratik!

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

Сегодня мы рассмотрим:

  • ПЛАМЯ пошаговое руководство по игре
  • Реализация игры на Python
  • Собираем все вместе
  • Заключение и ресурсы

ОГОНЬ прохождение игры

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

  • Друзья
  • Любовники
  • Ласковые
  • Женатые
  • Враги
  • Братья и сестры

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

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

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

Пошаговое руководство программа

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

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

  CHANDLERMONICA  

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

  HDLERMOI  

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

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

Конечный результат

1. Стартовое окно. Что увидит пользователь после ввода имен.

1 из 3

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

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

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. Загрузите звуковые файлы

 # Загрузить аудиофайлы 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. Взять имена входов

 # Ввести ввод от пользователя: name1 = input ("Player 1 name:") name1 = name1.upper () # заменить любой пробел пустой строкой name1.replace ("", "") # составить список букв или  символы name1_list = list (name1) # взять второе имя name2 = input ("Player 2 name:") name2 = name2.upper () name2.replace ("", "") name2_list = list (name2) 

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

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

 # Удалить символы командной строки: 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] # Удалить символ из списка list1.remove (c) list2.remove (c) # Объединить два списка с помощью # в среднем list3 = list1 + ["#"] + list2 # Вернуть объединенный список с флагом True  return [list3, True] # Общие символы не найдены list3 = list1 + ["#"] + list2 return [list3, False] 

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

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

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

 # Принятие флага как True сначала continue = Truewhile: # Вызов функции ret_list = remove_comman_char (name1_list, name2_list) # Окончательный список: con_list = ret_list [0] # Значение флага: continue = ret_list [1] # Индекс хэша:  hash_index = con_list.index ("#") # все символы до * сохранить в p1_list name1_list = con_list [: hash_index] # все символы после * сохранить в p2_list name2_list = con_list [hash_index + 1:] # подсчитать общее количество оставшихся символов count = len  (name1_list) + len (name2_list) 

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

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

Из примера пошагового руководства получаем:

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

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

 # list of FLAMES acronym result = ["Друзья", "Любовники", "Ласковые", "Брак", "Враги", "Братья и сестры"] while len (result)> 1: ind = (count% len (result  )) - 1, если ind> = 0: right = result [ind + 1:] left = result [: ind] result = right + left else: result = result [: len (result) - 1] 

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

Первая итерация

1 из 5

8. Загрузка изображений игры

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

 # Загрузить изображения для окна tkinter: Surprise = PhotoImage (file = "Surprise.png") finger = PhotoImage (file = "Fingers.png") Friends = PhotoImage (file = "  F11.png ") Lovers = PhotoImage (file =" L11.png ") Affectionate = PhotoImage (file =" A11.png ") Брак = PhotoImage (file =" M11.png ") Враги = PhotoImage (file =" E11.  png ") Siblings = PhotoImage (file =" S11.png ") 

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

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

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

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

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

 # Длина имен: n_1 =  len (name1) n_2 = len (name2) # Создать список имен: l1 = list (name1) l2 = list (name2) # Загрузить буквы для name1: for i in range (n_1): l1 [i] = PhotoImage (  file = str (l1 [i]) + str (". png")) # Загрузить буквы для name2: for j в диапазоне (n_2): l2 [j] = PhotoImage (file = str (l2 [j]) +  str (". png")) 

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

 r1 = 0c1 = 0r2 = 2c2 = 0 # Отображаемое имя1: для i в диапазоне (n_1): B = Label (root, image = l1 [i]) B.grid (row = r1, column = c1) c1 =  c1 + 1 # Добавить пробел: root.grid_rowconfigure (1, minsize = 50) # Отображать имя2: для j в диапазоне (n_2): B = Label (root, image = l2 [j]) B.grid (row = r2  , column = c2) c2 = c2 + 1 # Добавить пробел: root.grid_rowconfigure (3, minsize = 50) 

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

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

 # Добавить кнопку: btn = Button (root, image = неожиданность, command = lambda: Reveal ()) btn.grid (row = 4, column = 0, columnspan = n_1) # Добавить метку результата: res = Label  (корень, изображение = пальцы) res.grid (row = 6, column = 0, columnspan = n_1) # Добавить пробел: root.grid_rowconfigure (5, minsize = 50) # Воспроизвести звуковой файл: start.play () 

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

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

 # Выявить результат: def Reveal (): if result [0] == "Друзья": 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] == "  Ласковый ": six.play () res.configure (image = Affectionate) btn.configure (command = lambda: root.destroy ()) elif result [0] ==" Брак ": four.play () res.configure (  image = Брак) btn.configure (command = lambda: root.destroy ()) elif result [0] == "Враги": 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.

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

 из tkinter import * import simpleaudio как saroot = 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")) # Загрузить аудиофайлы: 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") # Принимаем ввод от пользователя: name1 = input ("Player 1 name:") name1 = name1.upper () # заменяем любой пробел пустой строкой name1.replace (  "", "") # составить список букв или символов name1_list = list (name1) # взять второе имя name2 = input ("Player 2 name:") name2 = name2.upper () name2. replace ("", "") name2_list = list (name2) # Установить более длинное имя как name1: if len (name2)> len (name1): name3 = name1 name1 = name2 name2 = name3 # Удалить символы запятой: 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] # Удалить символ из  list list1.remove (c) list2.remove (c) # Объединить два списка с # в середине list3 = list1 + ["#"] + list2 # Вернуть объединенный список с флагом True return [list3, True] # Общие символы отсутствуют  найден list3 = list1 + ["#"] + list2 return [list3, False] # Первоначально принять флаг как True (True), пока продолжить: # Вызов функции ret_list = remove_comman_char (name1_list, name2_list) # Окончательный список: con_list = ret_list [0  ] # Значение флага: continue = ret_list [1] # Индекс хэша: hash_index = con_list.index ("#") # все символы перед * сохранить в p1_list name1_list = con_list [: hash_index] # все символы после * s  tore in p2_list name2_list = con_list [hash_index + 1:] # count всего оставшихся символов count = len (name1_list) + len (name2_list) # список сокращений FLAMES result = ["Друзья", "Любовники", "Ласковые", "Брак  "," Enemies "," Siblings "] while len (result)> 1: ind = (count% len (result)) - 1, если ind> = 0: right = result [ind + 1:] left = result [:  ind] result = right + left else: result = result [: len (result) - 1] # Загрузить изображения для окна tkinter: Surprise = PhotoImage (file = "Surprise.png") finger = PhotoImage (file = "Fingers.png  ") Друзья = PhotoImage (file =" F11.png ") Lovers = PhotoImage (file =" L11.png ") Affectionate = PhotoImage (file =" A11.png ") Брак = PhotoImage (file =" M11.png ")  Enemies = PhotoImage (file = "E11.png") Siblings = PhotoImage (file = "S11.png") # Длина имен: n_1 = len (name1) n_2 = len (name2) # Создать список имен: l1 = list  (name1) l2 = list (name2) # Загрузить буквы для name1: for i в диапазоне (n_1): l1 [i] = PhotoImage (file = str (l1 [i]) + str (". png")) #  Загрузите буквы для имени  e2: для j в диапазоне (n_2): l2 [j] = PhotoImage (file = str (l2 [j]) + str (". png")) r1 = 0c1 = 0r2 = 2c2 = 0 # Отображаемое имя1: для i  in range (n_1): B = Label (root, image = l1 [i]) B.grid (row = r1, column = c1) c1 = c1 + 1 # Добавить пробел: root.grid_rowconfigure (1, minsize = 50  ) # Отображать имя2: для j в диапазоне (n_2): B = Label (root, image = l2 [j]) B.grid (row = r2, column = c2) c2 = c2 + 1 # Добавить пробел: root.  grid_rowconfigure (3, minsize = 50) # Добавить кнопку: btn = Button (root, image = неожиданность, command = lambda: Reveal ()) btn.grid (row = 4, column = 0, columnspan = n_1) # Добавить метку результата  : res = Label (root, image = пальцы) res.grid (row = 6, column = 0, columnspan = n_1) # Добавить пробел: root.grid_rowconfigure (5, minsize = 50) # Воспроизвести звуковой файл: start.play  () # Выявить результат: def Reveal (): if result [0] == "Друзья": 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] == "Ласковый": six.play () res.configure (image = Ласковый) btn.configure (command = lambda: root.destroy ()) elif result [0] == "Брак": четыре  .play () res.configure (image = Marriage) btn.configure (command = lambda: root.destroy ()) elif result [0] == "Враги": 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 — настолько интуитивно понятный язык программирования, что самый простой способ овладеть им — это на практике, подобной этой. Продолжайте в том же духе и продолжайте строить!

Это последняя статья в моей серии статей о Tkinter. Надеюсь, вам понравился сериал. Продолжайте использовать Python и создавайте свое резюме с помощью таких забавных игр!

Если у вас есть какие-либо сомнения, вопросы или мысли относительно этой статьи, не стесняйтесь обращаться ко мне по адресу shuklapratik22@gmail.com

Продолжить обучение

  • Повысьте свои навыки Python с помощью этих 6 задач.
  • Как изучить Python в 5 простых шагов (для начинающих)
  • Учебник по динамическому программированию: создание эффективных программ на Python
Оцените статью
nanomode.ru
Добавить комментарий