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

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

Python Tkinter游戏编程系列

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

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

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

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

计算爱情指数游戏演练

今天,我们将开发一款游戏,该游戏将计算两个输入名称之间的爱率。在这个游戏中,您只需要输入两个名称并回答一些基本的是或否问题。最后,您将生成这两个人之间的爱情百分比。

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

规则和玩法

  1. 运行程序。
  2. 输入所有必需的信息。
  3. 单击“ Tkinter”窗口中的“惊奇”按钮。
  4. 查看结果。
  5. 关闭并再次播放。

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

游戏流程图

程序演练

当用户运行该程序时,将要求他们输入两个名称来计算其爱情百分比。用户输入名称后,将要求他们回答五种不同的是或否。我们的程序将在稍后的程序中使用这些答案来计算爱百分比的值。

现在,我们的程序将根据输入的两个名称中的字母计算出爱率。然后,它将使用答案值来增加爱率。现在,在所有输入均得到回答之后,我们的程序将打开Tkinter窗口,该窗口将显示两个名称,并以“ LOVES”分隔。

例如:如果用户输入“ Chandler”和“ Monica”作为两个名称,我们的程序将显示“ Chandler Loves Monica”。

第二个名称下将有一个按钮。当用户按下按钮时,它将以图像形式显示出爱情百分比。然后,用户可以关闭程序并再次播放。

计算过程

让我们看一个示例,以了解程序如何通过名称中的字母来计算爱情百分比:

该程序将根据字符顺序对所有字符的出现进行计数。名称中共享的字母越多,评级越高。

例如:以钱德勒和莫妮卡为名。在这里,第一个字符是“ C”。因此,我们的程序将搜索列表以查找其他出现的“ C”。如果还有另一个“ C”,它将使“ C”的计数器增加1。我们的程序将继续进行,直到到达列表末尾。

那么,它将如何计算百分比?我们将使用先前计算的输出。我们的程序将采用第一个和最后一个数字并将其添加。如果添加量≥10,则将在内部添加它们。

例如:一个14个字母的分数将是1 + 4 = 5

一旦将第一个和最后一个数字相加,就会将相加的内容存储在第一位,并删除最后一个元素,直到最后只剩下两个数字为止。

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

号码细分示例

在获得爱情价值百分比后,我们将使用答案值来增加百分比。如果当前值较低,则将其增加5点。请记住,您可以通过指定各种条件来修改程序。

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

现在我们已经了解了爱情计算器的含义,让我们逐步介绍Python的过程。如果您还不知道如何设置Tkinter,请查看本系列的第一篇文章以获取简短的教程。

实施此游戏需要两个部分:

  • 接受用户输入
  • 在Tkinter窗口上显示输出

1.导入所需的库

from tkinter import *
import simpleaudio as sa
from collections import Counter
  • tkinter:在我们的应用程序中添加小部件。
  • simpleaudio:播放声音文件。
  • Counter:计算每个字符的出现。

2.输入名称

在这里,我们从用户那里输入两个名称。用户必须输入名称值。之后,我们将输入转换为大写,以使其与我们的文件名对齐。

name1 = input("NAME1 : ")
name2 = input("NAME2 : ")
name1 = name1.upper()
name2 = name2.upper()

3.将较长的名称设置为 name1

在这里,我们将长名称设置为name1,将短名称设置为,name2以免扭曲我们的Tkinter模块。如果两个名称的长度相等,那么我们将不进行此更改。

if len(name2)>len(name1):
    name3 = name1
    name1 = name2
    name2 = name3

4.获得问题的答案

在这里,我们接受用户的提问。稍后在程序中,我们将使用这些问题的结果来计算爱情百分比。用户必须输入是或否。

print("\n")
print("Reply the following questions in YES OR NO : \n")
answer1 = input("Does your partner makes you a better person? : \n")
answer2 = input("\nDoes it gives you butterflies in your stomach when you see him/her ? : \n")
answer3 = input("\nIs your partner your best friend? : \n")
answer4 = input("\nAre you willing to sacrifice your own need for him/her? : \n")
answer5 = input("\nDo you accept your partner for who he/she is? : \n")

5.最终字符串

在这里,我们通过将LOVES两个名称相加来计算最终字符串。

例如:如果我们的两个名字输入是“ Chandler”和“ Monica”,那么我们的最终字符串将是“ Chandler Loves Monica”。然后,我们将字符串转换为list。

#Get the final string 
final_string = name1+"LOVES"+name2

#Convert string into list 
l1 = list(final_string)
print(l1)

6.计算每个字符的出现

在这里,我们计算列表中每个字符的出现。结果,list2存储每个字符的出现次数。

#Count the number of occurance for each character 
list2 = l1

c = Counter( list2 )
list2 = list(c.values())
print (list2)

7.编写主要逻辑

现在,我们基于两个输入名称来计算爱情百分比的值。我们创建一个名为list 5的空列表。我们的程序将从列表中获取第一个和最后一个数字并将其添加。

如果数字≥10,它将在内部添加数字以形成一个数字。然后,我们从列表中删除最后一位数字。现在,我们插入在第0个索引处执行的加法运算的值。

在删除最后一个数字并在第0个索引处插入相加值之后,列表5将存储列表2的更新值。然后,我们用列表5更新列表2,以便此操作可以在新列表上继续进行。

该操作将继续进行,直到仅剩2个数字为止。清单5中应该只有两个数字。我们使用“是或否”问题来计算百分比。

n = len(list2)
list5 = []
i=0
while n>2:
    num = list2[i] +list2[n-1]

    if num>=10:
        sum = 0
        while(num!=0):
            sum = sum + int(num%10)
            num =int(num/10)
        num = sum

    list5 = list2[1:n-1]
    list5.insert(0,num)
    print(list5)
    list2 = list5
    n = n-1

8.将列表转换为int

现在,我们将两个数字的列表转换为字符串。然后,将其转换为整数,以便我们可以根据用户给出的问题的答案对其进行进一步修改。

#Convert the list of 2 numbers to string 
listToStr = "".join([str(elem) for elem in list5])   

#Convert the string to integer 
value = int(listToStr)
print(listToStr)

9.根据问题的答案修改价值

我们根据问题的答案来提高爱情分数。仅当该值小于95时才增加该值。如果第一个问题的答案为“是”,则将该值增加5。

如果该值小于90,则将其增加5。对于5个if语句,此过程继续进行。该代码的目的是强调嵌套if语句的结构。

请记住,有很多方法可以增加爱情的价值百分比。您可以在这里发挥创意想象力!

#Add points based on the questions asked 
if value<95:
    if answer1=="YES" or answer1=="yes" or answer1=="Yes":
        value = value+5
    if value<90:
        if answer2=="YES" or answer2=="yes" or answer2=="Yes":
            value = value+5
        if value<85:
            if answer3=="YES" or answer3=="yes" or answer3=="Yes":
                value = value+5
            if value<80:
                if answer4=="YES" or answer4=="yes" or answer4=="Yes":
                    value = value+5
                if value<75:
                    if answer5=="YES" or answer5=="yes" or answer5=="Yes":
                        value = value+5

print(value)

10. Tkinter和声音文件的主窗口

root = Tk()
root.geometry("+100+0")
root.configure(bg="#000000")
root.iconphoto(True,PhotoImage(file="Surprise.png"))
root.title("Love Percentage Game")
root.resizable(width=False,height=False)

#Load sound files 
start = sa.WaveObject.from_wave_file("Start.wav")
one = sa.WaveObject.from_wave_file("Win.wav")
two = sa.WaveObject.from_wave_file("6.wav")
  • root = Tk( ):用于初始化我们的tkinter模块。
  • root.title( ):我们使用它来设置应用程序的标题。
  • root.geometry( ):我们使用它来指定我们的应用程序窗口将在哪个位置打开。
  • root.configure( ):我们使用它来指定应用程序的背景色。
  • root.resizable( ):在这里我们使用它来防止用户调整主窗口的大小。
  • root.iconphoto( ):我们使用它来设置应用程序窗口标题栏中的图标。我们将第一个参数设置为True,以便所有窗口具有相同的图标。

然后,我们添加找到的文件,这些文件将在各种事件中播放。要注意的一件事是该程序仅接受.wav文件。我们需要将声音文件作为对象加载。然后我们可以使用.play( )方法播放它。

11.加载图像

surprise = PhotoImage(file="Surprise.png")
fingers = PhotoImage(file="fingers.png")

#Display the love percentage in label image 
result = PhotoImage(file=str(value)+str(".png"))
  • 我们将使用意外图像作为按钮。
  • 我们将使用手指图像作为标签。
  • 计算完爱率后,我们将其显示为图像。在这里请注意,我们的数字图像的存储方式如下:
    • 1.png
    • 2.png
    • 3.png

12.找到长度并列出清单

我们将每个字母显示为标签,因此需要列出列表。我们使用循环来显示每个字母的图像,因此我们需要找到每个名称的长度。注意,这里我们将“ LOVES”字符串转换为列表并找到其长度。

n_1 = len(name1)
n_2 = len(name2)

l1 = list(name1)
l2 = list(name2)

l3 = list("LOVES")
n_3 = len(l3)

13.加载并显示图像

在这里,我们加载了每个字母的图像name1name2loves。然后,我们显示的标签图像name1,然后在下一行添加空白。注意,我们的循环将针对每个字符运行。在运行时,它将使列值增加1,以便所有字母并排放置。我们对name2和都这样做loves

#Load the images for name1 
for i in range(n_1):
    l1[i] = PhotoImage(file=str(name1[i])+str("_P.png"))
    
#Load the images for name2 
for j in range(n_2):
    l2[j] = PhotoImage(file=str(name2[j])+str("_P.png"))
    
#Load the images for LOVES 
for k in range(n_3):
    l3[k] = PhotoImage(file=str(l3[k])+str("_P.png"))

#Show name1 as label image 
r1=0
c1=0
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=10)

#Show "LOVES" as image label 
r2 = 2
c2 = 0
for k in range(n_3):
    B = Label(root,image=l3[k])
    B.grid(row=r2,column=c2)
    c2 = c2+1

#Add blank space 
root.grid_rowconfigure(3, minsize=10)

#Show name2 as label image 
r4=4
c4=0
for j in range(n_2):
    B = Label(root,image=l2[j])
    B.grid(row=r4,column=c4)
    c4 = c4+1

#Add blank space 
root.grid_rowconfigure(5, minsize=10)

14.添加按钮

在这里,我们添加了一个将触发该Reveal( )功能的按钮。然后,通过使用columnpan将按钮设置在窗口的中央。然后,我们添加一个空格和一个标签,该标签将在用户按下按钮时显示结果。

#Add a button :
btn = Button(root,image=surprise,command=lambda:Reveal())
btn.grid(row=6,column=0,columnspan=n_1)

#Add blank space :
root.grid_rowconfigure(7, minsize=10)

#Add a label to show the result :
res = Label(root,image=fingers)
res.grid(row=8,column=0,columnspan=n_1)

15. Reveal( )close( )功能

当用户按下按钮时,此功能将被触发。在这里,我们显示图像标签,该图像标签将显示爱率。如果用户再次按下按钮,它将使用该close( )功能关闭我们的应用程序。该close( )功能将在关闭窗口之前播放声音文件。

#Function that reveals the love percentage as image label :
def Reveal():
    res.configure(image=result)
    one.play()
    btn.configure(command=lambda:close())
    two.play()
    
#Close function 
def close():
    two.play()
    root.destroy()

16.进入主循环

我们必须进入主循环才能运行程序。我们的程序将保持在主循环中,直到我们按下关闭按钮。

#Enter the main loop 
root.mainloop()

放在一起

查看此Python Tkinter游戏的完整代码。

#!/usr/bin/env python
# coding: utf-8

# In[4]:


#Import required libraries 
from tkinter import *
import simpleaudio as sa
from collections import Counter


#Take 2 names as input 
name1 = input("NAME1 : ")
name2 = input("NAME2 : ")

#Convert the names to upper case 
name1 = name1.upper()
name2 = name2.upper()
    
#Set the longer name as name1 
if len(name2)>len(name1):
    name3 = name1
    name1 = name2
    name2 = name3

#Get answers to the few questions 
print("\n")
print("Reply the following questions in YES OR NO : \n")
answer1 = input("Does your partner makes you a better person? : \n")
answer2 = input("\nDoes it gives you butterflies in your stomach when you see him/her ? : \n")
answer3 = input("\nIs your partner your best friend? : \n")
answer4 = input("\nAre you willing to sacrifice your own need for him/her? : \n")
answer5 = input("\nDo you accept your partner for who he/she is? : \n")


#Get the final string 
final_string = name1+"LOVES"+name2

#Convert string into list 
l1 = list(final_string)
print(l1)

#Count the number of occurance for each character 
list2 = l1

c = Counter( list2 )
list2 = list(c.values())
print (list2)

#Main logic to calculate the value 
n = len(list2)
list5 = []
i=0
while n>2:
    num = list2[i] +list2[n-1]

    if num>=10:
        sum = 0
        while(num!=0):
            sum = sum + int(num%10)
            num =int(num/10)
        num = sum

    list5 = list2[1:n-1]
    list5.insert(0,num)
    print(list5)
    list2 = list5
    n = n-1


#Convert the list of 2 numbers to string 
listToStr = "".join([str(elem) for elem in list5])   

#Convert the string to integer 
value = int(listToStr)
print(listToStr)       


#Add points based on the questions asked 
if value<95:
    if answer1=="YES" or answer1=="yes" or answer1=="Yes":
        value = value+5
    if value<90:
        if answer2=="YES" or answer2=="yes" or answer2=="Yes":
            value = value+5
        if value<85:
            if answer3=="YES" or answer3=="yes" or answer3=="Yes":
                value = value+5
            if value<80:
                if answer4=="YES" or answer4=="yes" or answer4=="Yes":
                    value = value+5
                if value<75:
                    if answer5=="YES" or answer5=="yes" or answer5=="Yes":
                        value = value+5

print(value)
    

#=================================================================================================================#
    
#Configure tkinter window 
root = Tk()
root.geometry("+100+0")
root.configure(bg="#000000")
root.iconphoto(True,PhotoImage(file="Surprise.png"))
root.title("Love Percentage Game")
root.resizable(width=False,height=False)

#Load sound files 
start = sa.WaveObject.from_wave_file("Start.wav")
one = sa.WaveObject.from_wave_file("Win.wav")
two = sa.WaveObject.from_wave_file("6.wav")

#Load images we're going to use 
surprise = PhotoImage(file="Surprise.png")
fingers = PhotoImage(file="fingers.png")

#Display the love percentage in label image 
result = PhotoImage(file=str(value)+str(".png"))

#Play the sound file 
start.play()

n_1 = len(name1)
n_2 = len(name2)

l1 = list(name1)
l2 = list(name2)

l3 = list("LOVES")
n_3 = len(l3)

#Load the images for name1 
for i in range(n_1):
    l1[i] = PhotoImage(file=str(name1[i])+str("_P.png"))
    
#Load the images for name2 
for j in range(n_2):
    l2[j] = PhotoImage(file=str(name2[j])+str("_P.png"))
    
#Load the images for LOVES :
for k in range(n_3):
    l3[k] = PhotoImage(file=str(l3[k])+str("_P.png"))
    
    
#Show name1 as label image 
r1=0
c1=0
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=10)

#Show "LOVES" as image label 
r2 = 2
c2 = 0
for k in range(n_3):
    B = Label(root,image=l3[k])
    B.grid(row=r2,column=c2)
    c2 = c2+1

#Add blank space 
root.grid_rowconfigure(3, minsize=10)

#Show name2 as label image 
r4=4
c4=0
for j in range(n_2):
    B = Label(root,image=l2[j])
    B.grid(row=r4,column=c4)
    c4 = c4+1

#Add blank space 
root.grid_rowconfigure(5, minsize=10)    

#n = len(name1)

#Add a button 
btn = Button(root,image=surprise,command=lambda:Reveal())
btn.grid(row=6,column=0,columnspan=n_1)

#Add blank space 
root.grid_rowconfigure(7, minsize=10)

#Add a label to show the result 
res = Label(root,image=fingers)
res.grid(row=8,column=0,columnspan=n_1)



#Function that reveals the love percentage as image label 
def Reveal():
    res.configure(image=result)
    one.play()
    btn.configure(command=lambda:close())
    two.play()

#Close function 
def close():
    two.play()
    root.destroy()
    
#Enter the main loop 
root.mainloop()

包装和资源

恭喜!您已经结束并建立了成功的Python Tkinter游戏。应用您的Python知识的出色工作。希望您喜欢本文并从中学到新东西。

Python是一种直观的编程语言,掌握它的最简单方法是通过这样的动手实践。继续努力,继续建设!

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

常见问题FAQ

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

发表评论