基于Python/Tkinter的拼图单机小游戏

这是很早之前写的拼图游戏,基于Py/Tk,今天翻出来,然后重新整理,并且发布出来,供大家参考学习,自己看CSDN里有很多了类似的游戏代码,虽然代码逻辑上大同小异,但每个开发者都有自己独特的开发个性和习惯,这并无优劣,而且都可以从代码中都可以一窥究竟。下午整理代码的时候才发现之前写Code的时候,居然一句注释也没有加,搞得自己又重新梳理了一遍Code逻辑,才将注释全部添加上,不添加注释实在不是个好的习惯。虽然拼图小游戏虽然只有几百行的代码,但是对于了解Tkinter的模块以及熟悉Py编程却是既有好处,废话少说,直接上代码吧

主界面
主界面

4*3模式

3*3模式

游戏图片选择弹窗

配置文件包

1.类初始化

import random
import os
import Pmw
import time
from Tkinter import *
from PIL import Image,ImageTk

class image_crop():
    #拼图游戏
    def __init__(self):
        self.now_path=os.getcwd()
        self.num_page=0

2.设置--图片设置界面--游戏图片的选择

    def image_set(self):
       #设置界面关于拼图游戏中--游戏图片的选择
        path1=[]
        path_flod=self.now_path+"\image_\\"
        for i in(os.listdir(path_flod)):
            path1.append(path_flod+i)
        main_frame1=self.root.grid_slaves(row=1,column=0)
        main_frame1[0].grid_remove()
        self.imageset_toplevel=Frame(self.root)
        self.imageset_toplevel.grid(row=1,column=0,columnspan=3,rowspan=3,sticky=NSEW)
        frame_titleimage=Frame(self.imageset_toplevel)
        frame_titleimage.pack(side=TOP)
        label_tag=Label(frame_titleimage,text=u"图片名称:",width=10,font=('Verdana bold',10))
        label_tag.grid(row=0,column=0,sticky='ws')
        self.image_name=StringVar()
        label_name=Label(frame_titleimage,textvariable=self.image_name,width=20,font=('Verdana bold',10))
        label_name.grid(row=0,column=1)
        self.image_name.set(' ')
        but=Button(frame_titleimage,text=u"确定",width=10,font=('Verdana bold',9),command=sure_comd)
        but.grid(row=0,column=2)
        self.widgets_group=Pmw.ScrolledFrame(self.imageset_toplevel,usehullsize=1,frame_relief="flat",hull_width=500,
                                             hull_height=400,
                                             scrollmargin=0)
        self.widgets_group.pack(side=TOP,fill=BOTH,expand=1)
        frame_page=Frame(self.imageset_toplevel)
        frame_page.pack(side=TOP)
        up_page=Button(frame_page,text=u"上一页",width=10,font=('Verdana bold',9),command=test_up)
        up_page.pack(side=LEFT)
        self.ent=StringVar()
        entry_page=Entry(frame_page,width=10,font=('Verdana bold',10),textvariable=self.ent,state='readonly')
        entry_page.pack(side=LEFT)
        self.ent.set(u"第1页")
        down_page=Button(frame_page,text=u"下一页",width=10,font=('Verdana bold',9),command=test_down)
        down_page.pack(side=LEFT)
        
        for i in range(3):
            for j in range(3):
                #生成图片标签Label
                
        img_labelq=Label(self.widgets_group.interior(),borderwidth=2,relief='groove')
                img_labelq.grid(row=i,column=j)
        #加载图片
        image_1(path1[0])
        image_2(path1[1])
        image_3(path1[2])
        image_4(path1[3])
        image_5(path1[4])
        image_6(path1[5])
        image_7(path1[6])
        image_8(path1[7])
        image_9(path1[8])
        #注意:这里需要注意一下,图片文件至少需要大于9张,如果不是,系统报错,因为时间关系这块没有修改

3.设置---图片设置界面--鼠标选中图片后的操作

        def comd_show(event,fr_,path_img):
            #左键-选中图片后--加载图片名称
            fr_.configure(relief='solid')
            self.root.update()
            time.sleep(0.2)
            fr_.configure(relief='groove')
            image_path=os.path.basename(path_img)
            self.image_name.set(image_path.decode("cp936"))
        def doublue_comd(event,path_img):
            #右键-选中图片后--弹窗显示选中图片大图
            imageshow_toplevel=Toplevel()
            imageshow_toplevel.geometry('+400+140')
            imageshow_toplevel.overrideredirect(0)
            image_show=Image.open(path_img)
            if image_show.size[1]>image_show.size[0]:
                self.size_img_2=image_show.resize((350, 450))
            elif image_show.size[1]<image_show.size[0]:
                self.size_img_2=image_show.resize((450, 350))
            self.showimage=ImageTk.PhotoImage(self.size_img_2)
                       img_label_show=Label(imageshow_toplevel,borderwidth=2,relief='groove',image=self.showimage)
            img_label_show.grid(row=0,column=0)

4.设置---图片设置界面--所有图片包中图片显示模块

注:这部分代码虽然有些重复,有优化的地方,但逻辑上完备的,这里先将代码贴出来,如果读者有兴趣,可以将此部分优化

         def image_1(path_image):
            #图片选择器---加载第一张图片
            image_set_1=Image.open(path_image)
            if image_set_1.size[1]>image_set_1.size[0]:
                self.size_img_1=image_set_1.resize((128, 170))
            elif image_set_1.size[1]<image_set_1.size[0]:
                self.size_img_1=image_set_1.resize((170, 128))
            self.setimage_label_1=ImageTk.PhotoImage(self.size_img_1)
            qws1=self.widgets_group.interior().grid_slaves(row=0,column=0)
            qws1[0].configure(image=self.setimage_label_1,relief='groove')
            qws1[0].bind("<Button-1>",lambda e,fr_=qws1[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws1[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_2(path_image):
            #图片选择器---加载第二张图片
            image_set_2=Image.open(path_image)
            if image_set_2.size[1]>image_set_2.size[0]:
                self.size_img_2=image_set_2.resize((128, 170))
            elif image_set_2.size[1]<image_set_2.size[0]:
                self.size_img_2=image_set_2.resize((170, 128))
            self.setimage_2=ImageTk.PhotoImage(self.size_img_2)
            qws2=self.widgets_group.interior().grid_slaves(row=0,column=1)
            qws2[0].configure(image=self.setimage_2,relief='groove')
            qws2[0].bind("<Button-1>",lambda e,fr_=qws2[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws2[0].bind("<Button-3>",lambda e,path_img=path_image: doublue_comd(e,path_img))
        def image_3(path_image):
            #图片选择器---加载第二张图片
            image_set_3=Image.open(path_image)
            if image_set_3.size[1]>image_set_3.size[0]:
                self.size_img_3=image_set_3.resize((128, 170))
            elif image_set_3.size[1]<image_set_3.size[0]:
                self.size_img_3=image_set_3.resize((170, 128))
            self.setimage_label_3=ImageTk.PhotoImage(self.size_img_3)
            qws3=self.widgets_group.interior().grid_slaves(row=0,column=2)
            qws3[0].configure(image=self.setimage_label_3,relief='groove')
            qws3[0].bind("<Button-1>",lambda e,fr_=qws3[0],path_img=path_image: comd_show(e,fr_,path_img))
            qws3[0].bind(
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Python Tkinter 小游戏是使用 Python 编程语言Tkinter GUI 工具包创建的游戏。它可以是任何类型的游戏,例如迷宫游戏、扫雷游戏、俄罗斯方块等等。Tkinter 是一个 Python 标准库,它提供了创建 GUI 应用程序的工具和组件。使用 Tkinter,您可以创建窗口、按钮、标签、文本框、菜单等等。在 Python 中,您可以使用 Tkinter 创建交互式游戏,这些游戏可以在桌面上运行。 ### 回答2: Python tkinter是一个开源的GUI(图形用户界面)库,它可以帮助我们轻松地创建各种视觉效果,包括小游戏。 为了演示如何使用Python tkinter创建小游戏,我们可以考虑创建一个经典的“打砖块”游戏。在这个游戏中,玩家需要控制一个板,用板将球反弹,并摧毁游戏区中的砖块。 首先,我们需要引入tkinter模块,并创建一个游戏窗口。我们可以使用Canvas小部件来创建游戏区,并用多个矩形来表示砖块。接下来,我们需要创建一个球和板的对象,并为它们设置移动的方向和速度。我们还需要添加一个事件处理程序,以便当玩家按下键时,板可以移动。 接下来,我们需要创建一个主循环,以将球和板在游戏区上移动,并检测它们是否与砖块碰撞。如果球与砖块相撞,则砖块将被摧毁,并且玩家可以得到分数。如果玩家把球弄出了游戏区,则游戏结束。 最后,我们可以添加一些音效和图像,使游戏更加生动有趣。在完成游戏后,我们可以将其导出为可执行文件,供其他人使用。 总之,使用Python tkinter可以创建各种小游戏,例子如:“2048”,“俄罗斯方块”,“扫雷”等。只要秉持着耐心和创造力,我们可以创建自己的小游戏,并与他人共享。 ### 回答3: Python Tkinter是一个GUI工具包,支持开发多种类型的桌面应用程序。同时,Python Tkinter还可以轻松地创建小游戏。 下面我们来介绍一个基于Python Tkinter开发小游戏:打地鼠。 ********************** 游戏规则: - 地鼠随意出现在界面的不同位置 - 玩家需要在规定时间内击中尽可能多的地鼠 - 每次击中地鼠,得分+1 - 游戏结束后,统计玩家得分并显示 ********************** 在这个游戏中,我们需要创建一个GUI应用程序,将地鼠的出现和玩家的鼠标点击事件都与代码进行关联。 下面是我们可以采用的一个具体实现思路: 1. 创建主界面和游戏设置界面,包括开始游戏按钮、倒计时显示和得分显示等,以及游戏难度等级设置等等。 2. 当玩家点击游戏开始按钮时,游戏开始。界面上会随机出现可点击的地鼠。 3. 当玩家点击地鼠时,判断是否命中。如果命中,则得分+1,随机出现下一只地鼠。 4. 当时间到达设定时间限制或玩家主动结束游戏时,游戏结束。显示玩家得分和得分排行榜。 代码实现方面,我们需要对Tkinter的基础功能和控件进行深入理解,以及相关模块的引入和调用。 例如,在每次开始游戏时,我们需要清空原有地鼠的位置和状态信息,重新生成新的地鼠。 同时,在处理鼠标点击事件时,需要判断当前地鼠的状态,是否为“可点击”的状态。 当然,游戏难度等级的设置也需要通过交互控件进行实现,例如下拉列表选择框或单选框等。 总之,基于Python Tkinter开发小游戏不仅可以锻炼编程技能,而且还可以提高对GUI和用户交互的基本认识与理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值