Python Tkinter教程系列05:从头开始创建FLAMES游戏

作者 : IT 大叔 本文共5885个字,预计阅读时间需要15分钟 发布时间: 2020-09-23

Python Tkinter游戏编程系列

Python Tkinter教程系列01:编写简单版剪刀石头布游戏

Python Tkinter教程系列02:数字猜谜游戏

Python Tkinter教程系列03:随机排列字母猜单词游戏

Python Tkinter教程系列04:通过人名和回答问题自动计算爱情指数的游戏

FLAMES游戏演练

在本文中,我们将开发著名的童年游戏FLAMES。在此关系计算器中,用户将输入两个名称,作为输出,我们的程序将告诉我们它们是否为:

  • 友人
  • 恋人
  • 亲热
  • 已婚
  • 敌人
  • 兄弟姐妹

让我们使用Python 3和Tkinter开发相同的游戏!

规则和玩法

  1. 运行程序。
  2. 输入名称。
  3. 按下按钮。
  4. 查看结果。
  5. 再玩一次。

Python Tkinter教程系列05:从头开始创建FLAMES游戏插图

游戏流程图

程序演练

当用户运行该程序时,用户将输入要查找其关系的两个名称。用户输入详细信息后,我们的程序将基于算法计算关系状态。让我们尝试通过一个例子来理解它。首先,我们的算法将删除输入名称之间的所有公共字符。

例如,输入以下内容:

CHANDLER
MONICA

输出将是:

HDLERMOI

现在,我们的程序将计算最终输出列表中的字母总数,以确定如何遍历单词FLAME以获得结果。在上面的示例中,我们的最终列表中有8个字母,因此我们将遍历FLAMES中的字母并迭代删除第8个字符。让我们目视检查。

Python Tkinter教程系列05:从头开始创建FLAMES游戏插图(2)

在此请注意,最终结果为“ A”(深情)。我们的程序还将在各种事件中播放不同类型的声音文件。

用Python实现游戏(13个步骤)

现在我们已经了解了FLAMES游戏的含义,​​让我们逐步介绍Python的过程。如果您还不知道如何设置Tkinter,请查看本系列的第一篇文章   Python Tkinter教程系列01:编写简单版剪刀石头布游戏以获取简短的教程。

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)

首先,我们将proceed标志设置为True,以便我们的remove_common_char函数可以正常工作。之后,我们将删除通用字符,直到procede标志未设置为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行将出现空白。我们的名字将显示在第二行。之后,我们在第三行添加一个空格。

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())

 

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Python Tkinter教程系列05:从头开始创建FLAMES游戏

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论