详解Python GUI版24点游戏制作过程

本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com。

传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆。本项目模拟传统扑克24点算法,由计算机发4张牌,人工在下方输入算式,算式只能用加减乘除、左右括号和显示的4个数字(各个数字均用一次,且只能用一次),按“验证结果”即可判定你的输入是否正确有效;完成后,或无解题,可按“重新发牌”来继续游戏。本项目主要由tkinter界面、随机发牌、验证结果三大部分构成。游戏运行结果如图所示:


一、界面生成:

利用Page 4.7 for Python这款可视化tkinter GUI界面生成工具来布置界面,放Label1~Label4四个标签组件用于显示扑克牌,扑克牌用c1~c13.jpg(草花)、f1~f13.jpg(方块)、h1~h13.jpg(黑桃)和r1~r13.jpg(红桃)这些JPG文件来表达,放在image文件夹下。由于tkinter不能支持JPG文件,这里用了pillow库实现。下面这段代码实现显示一张红桃A:

from PIL import Image as pImage

from PIL import ImageTk as  pImageTk

from tkinter import *

root=Tk() 

Label1 = Label(root)   #建立标签

im1=pImage.open(".\\image\\r1.jpg")  #打开图片文件

p1=pImageTk.PhotoImage(im1)  #建立与tkinter适用的接口

Label1['image']=p1  #把图片放入标签

Label1.image=p1  #这句话不可不放,否则影响及时更新

Label1.pack()

除了Label组件外,还放入一个单行文本框(Text Var设置为myEval),验证结果按钮(text属性设置为'''验证结果'',command设置为judge),重新发牌按钮(text属性设置为'''重新发牌''',command设置为again)。界面设计完成后,使用菜单生成Python程序game24dian.py和相关的支持程序game24dian_support.py。


二、随机发牌

用Idle打开game24dian_support.py文件,修改完成again()函数。先随机选四个花色,再随机找四个数字,以组合成四张牌。直接上源码:

def again():

    '''发牌,从四种花色中抽1-10张牌中的4种'''

    global huase,shuzi

    #初始化表达式

    myEval.set("")

    

    #选花色

    huase=[random.choice("rhfc") for i in range(4)]

    #选牌

    shuzi=[random.randint(1,10) for i in range(4)]

    #组合生成四张牌的文件名,要用PIL库才能在tkinter中使用jpg文件

    im1=pImage.open(".\\image\\" + huase[0] + str(shuzi[0]) + ".jpg")

    im2=pImage.open(".\\image\\" + huase[1] + str(shuzi[1]) + ".jpg")

    im3=pImage.open(".\\image\\" + huase[2] + str(shuzi[2]) + ".jpg")

    im4=pImage.open(".\\image\\" + huase[3] + str(shuzi[3]) + ".jpg")

    p1=pImageTk.PhotoImage(im1)

    p2=pImageTk.PhotoImage(im2)

    p3=pImageTk.PhotoImage(im3)

    p4=pImageTk.PhotoImage(im4)

   

    #在标签中设置图片

    w.Label1['image'], w.Label2['image'], w.Label3['image'], w.Label4['image'] = p1, p2, p3, p4

    w.Label1.image, w.Label2.image, w.Label3.image, w.Label4.image = p1, p2, p3, p4

    sys.stdout.flush()

三、验证结果

用Idle打开game24dian_support.py文件,完成judge()函数。先判断输入的表达式值是否为24,如果是抽取表达式中的数字并排序,与发牌时生成的有序数字序列比较,完全相等,则说明用户输入正确,否则提示不正确。直接上源码:

def judge():

    '''判断计算输入是否正确'''

    if myEval.get() and eval(myEval.get())==24:

        #对输入的表达式中抽取数并排序

        lst1 = re.findall('\d', myEval.get())

        lst1 = sorted(map(int, lst1))

        #对生成的数字列表进行排序

        lst2=sorted(shuzi)

        #比较列表,进行判断

        if lst1==lst2:

            messagebox.showinfo("祝贺你!", myEval.get()+"=24,\n你算对了,真了不起!")

        else:

            messagebox.showinfo("注意:", "每个数字都要用,且只能用一次。")

    else:

        messagebox.showinfo("不正确:", "请输入正确的表达式,使得计算结果为24。")

    

    sys.stdout.flush()

长按下面的二维码关注本公众号,欢迎更多读者和Python爱好者投稿!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值