【上期回顾:Tkinter模块GUI界面化编程实战(四)——随机点名小程序】

这篇博客介绍了如何用Python Tkinter模块编写一个界面化的大鱼吃小鱼游戏,在博客下面有完整的源码,源码中有超详细的注释,帮助大家理解代码(最后还有附件可以免费下载)

【注:下载文件100%可以运行,因为下载文件中包含打包了的Python程序(exe文件)!】


用Tkinter模块编写一个大鱼吃小鱼游戏

【先来看看效果图】

【玩家有3条生命,在右上角的红色方块显示】 

【初始时,有一个帮助对话框(画出来的)】 

【玩家是中间那个小黑鱼,白色的圆形是鱼眼(比较简陋,勿喷)】

——玩家:这鱼怎么这么丑,方方正正的,《我的世界》里的鱼都比这“玩意儿”好看!

——小鱼:你礼貌吗?

【新鱼刷新时间随机,颜色随机,大小随机,速度随机,位置随机,朝向随机,鱼眼大小随机】 

 【玩家扣血后会有1秒无敌时间】

【死亡界面,胜利界面就不展示了(我玩了半天也没胜利 ToT)】

【有胜利的伙伴们可以在评论区留言哟!】

【不妨看看编写思路】

程序实现功能清单

游戏任务:大鱼吃小鱼游戏

游戏规则:玩家3条命;扣血之后一秒无敌

分数增加:吃掉鱼的长宽之和

碰撞检测:产生碰撞时,比较玩家和碰撞鱼的面积大小,以此进行死亡和加分判断

【再来看看源代码】

【源码中几乎每行后都有详细注释,方便大家理解】 

from tkinter import *#引入界面化编程模块
from random import *#引入随机数模块game = Tk()#创建窗口
game.geometry('960x480+150+100')#设置窗口大小及位置
game.resizable(0,0)#设置窗口大小为不可更改class Game0:#定义Game类,方便重置游戏def __init__(self):self.pw,self.ph,self.px,self.py=40,20,455,250#玩家的初始位置self.pf=15#玩家鱼眼大小self.count=0#死亡计数器self.god=False#无敌标识self.score=0#得分self.RGBcolorlist = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']#RGB码所有颜色字符self.Score=IntVar()#分数显示变量self.Score.set(self.score)#设置界面化中的分数为初始分数self.Game = Frame(game)#定义框架,方便删除self.Game.place(width=960,height=480)self.main = Frame(self.Game)#定义框架,方便删除self.main.place(width=960,height=480)self.player = Label(self.Game,bg='black',fg='white',font=('consolas',self.pf),text='O',anchor='w')#画出玩家(其实就是个黑色矩形)self.player.place(width=self.pw,height=self.ph,y=self.py,x=self.px)#放置玩家的位置Label(self.Game,bg='lightgreen',textvariable=self.Score,font=('华文新魏',20)).place(width=960,height=40)#背景for i in range(3):Label(self.Game,bg='red').place(width=30,height=30,y=5,x=925-35*i)#命数显示self.life = Label(self.Game,bg='lightgreen')self.life.place(height=40,x=845,width=0)Button(self.Game,bd=0,bg='orange',text='退出',font=('华文新魏',15),command=lambda:self.fishquit()).place(width=100,height=30,y=5,x=5)#退出按钮Button(self.Game,bd=0,bg='orange',text='重置',font=('华文新魏',15),command=lambda:self.fishagain()).place(width=100,height=30,y=5,x=110)#重置按钮self.Gamestart()#执行Gamestart函数game.mainloop()#窗口进入消息事件循环def Gamestart(self):Gamehelp = Frame(self.Game)#帮助对话框Gamehelp.place(width=600,height=360,y=60,x=180)Label(Gamehelp,text='帮助',bg='grey',font=('华文新魏',15)).place(width=600,height=30)#帮助对话框标题Label(Gamehelp,bg='lightgreen',font=('华文新魏',20),text='按‘w’、‘s’、‘a’和‘d’进行移动!\n4000分胜利!\n祝你好运!').place(width=600,height=300,y=30)#帮助对话框主体Label(Gamehelp,bg='grey').place(width=600,height=30,y=330)Button(Gamehelp,bg='lightgreen',text='确定',bd=0,font=('华文新魏',12),command=lambda:start()).place(width=80,height=20,y=335,x=510)#确定按钮def start():#游戏开始game.bind('<Any-KeyPress>',lambda event:self.playmove(event.char))#键盘关联self.randomfish()#开始随机产生鱼Gamehelp.destroy()#摧毁帮助对话框,释放内存def fishagain(self):#重置函数self.pw,self.ph,self.px,self.py=40,20,455,250#重设玩家位置self.pf=15#重设玩家鱼眼大小self.count=0#重设死亡计数器self.score=0#重设分数self.Game.destroy()#摧毁之前的界面,释放内存Game0()#重置游戏,重新实例化类def fishquit(self):game.quit()#退出游戏def victory(self):#胜利设定if self.score >= 4000:#4000分胜利Label(self.Game,bg='lightyellow',font=('华文新魏',100),text='- Victory -',fg='orange').place(width=960,height=440,y=40)#设置并显示胜利界面self.main.destroy()#摧毁被覆盖的界面,释放内存def death(self):#死亡设定self.count+=1#死亡次数加一if self.count <3:#死亡次数小于3self.god = True if self.god == False else False#切换无敌模式的开关self.life.place(height=40,x=845,width=self.count*40)else:#3条命都已用完self.life.place(height=40,x=845,width=120)self.main.destroy()#摧毁之前的界面,释放内存Label(self.Game,bg='lightyellow',font=('华文新魏',100),text='- You Dead -',fg='orange').place(width=960,height=440,y=40)if self.god == True:#打开无敌模式self.count-=1#死亡减一(与前面的死亡次数加一抵消)self.Game.after(1000,self.death)#1000ms后关闭无敌模式def eattest(self,fish,rw,rh,ry,rx):#碰撞检测if self.god == False:#没有无敌模式的时候进行碰撞检测pxw = self.px+self.pwpyh = self.py+self.phrxw = rx+rwryh = ry+rh#判断是否有碰撞(矩形有重合部分)test = True if (self.px<rx<pxw or self.px<rxw<pxw or rx<self.px<rxw or rx<pxw<rxw) and (self.py<ry<pyh or self.py<ryh<pyh or ry<self.py<ryh or ry<pyh<ryh) else Falseif test == True:#发生碰撞if self.pw*self.ph > rw*rh:#玩家成功吃掉猎物fish.destroy()#将吃掉的鱼摧毁,释放内存self.score+=rw+rh#加分self.Score.set(self.score)#更新分数#玩家体积更新self.pw=self.score//40+40self.ph=self.score//80+20self.pf=self.score//100+15self.player.config(font=('consolas',self.pf))#玩家鱼眼大小更新self.victory()#执行胜利检测函数else:#玩家体积太小无法吃掉猎物,则扣血self.death()#执行死亡函数def fishmove(self,fish,speed,rway,rw,rh,ry,rx):#鱼的移动rx += speed if rway == 'e' else -1*speed#鱼每10ms的横坐标方向位移fish.place(width=rw,height=rh,y=ry,x=rx)#放置鱼self.eattest(fish,rw,rh,ry,rx)#碰撞检测if rx >960 or rx+rw <0:fish.destroy()#鱼游出了屏幕,摧毁它,释放内存else:self.main.after(10,self.fishmove,fish,speed,rway,rw,rh,ry,rx)#重复移动该鱼def randomfish(self,rcolor='#'):#随机刷新鱼for _ in range(6):rcolor+=choice(self.RGBcolorlist)#新鱼的颜色speed = randint(10,100+self.score//100)*0.01#新鱼的速度rway = choice(['w','e'])#新鱼的朝向rh = randint(self.ph//4,self.ph*2)#新鱼的高while 1:#新鱼的宽rw = randint(self.pw//4,self.pw*2)if rw > 1.2*rh:breakrx = -1*rw if rway == 'e' else 960#新鱼的初始横坐标ry = randint(40,480-rh)#新鱼的初始纵坐标rf = rh//2#新鱼的鱼眼大小fish = Label(self.main,bg=rcolor,font=('consolas',rf),text='O',anchor=rway)#创建新鱼fish.place(width=rw,height=rh,y=ry,x=rx)#放置新鱼self.fishmove(fish,speed,rway,rw,rh,ry,rx)#让产生的新鱼移动self.main.after(randint(1000,3000),self.randomfish)#每1000ms到3000ms内随机产生一条新鱼def playmove(self,way):#玩家移动#计算玩家位置if way == 'w' and self.py>40:#按下w键self.py-=10elif way == 's' and self.py<=470-self.ph:#按下s键self.py+=10elif way == 'a' and self.px>0:#按下a键self.px-=10self.player.config(anchor='w')#设置鱼头朝向elif way == 'd' and self.px<=955-self.pw:#按下d键self.px+=10self.player.config(anchor='e')#设置鱼头朝向self.player.place(width=self.pw,height=self.ph,y=self.py,x=self.px)#移动玩家位置Game0()#实例化该类

其实是可以用一个类来实现鱼的随机产生的,但是我这里用的是函数,通过函数的传参来实现于类相似的功能,这里要注意的难点应该就是函数的传参了

说明:关于这个鱼的样式,我没有特别地去进行美化,大家可以用Label控件的image参数来给鱼贴上贴图美化它们,我这里只是写个框架,细节可以由大家自由发挥


【 原创不易,大家都看到这里了,点个赞,分个享,收个藏应该很简单呀!】

完整程序及源码下载链接【蓝奏云】:fish.zip【密码:9s4d

【下期预告:Python Tkinter编写超级游戏盒子】【下期链接:超级游戏盒子

Tkinter模块GUI界面化编程实战(五)——大鱼吃小鱼游戏(含超详解及完整源码、完整程序免费下载链接)相关推荐

  1. Tkinter模块GUI界面化编程实战(六)——超级游戏盒子(含超详解及完整源码、完整程序免费下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(五)--大鱼吃小鱼游戏] 这篇博客介绍了如何用Python Tkinter模块编写一个界面化的超级游戏盒子,在博客下面有完整的源码,源码中有详细的注 ...

  2. Tkinter模块GUI界面化编程实战(四)——随机点名小程序(含详解及完整源码、完整程序下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(三)--2048小游戏]  这篇博客介绍了如何用Python Tkinter模块编写一个界面化的随机点名小程序,在博客下面有完整的源码,源码中有超详 ...

  3. 【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

    前言 大家好,我是阿光. 本专栏整理了<PyTorch深度学习项目实战100例>,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集. 正在更新 ...

  4. 【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码

    前言 大家好,我是阿光. 本专栏整理了<机器学习项目实战10例>,内包含了各种不同的入门级机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集. 正在更新中~ ✨

  5. 使用Python的tkinter模块实现界面化的批量修改文件名(续)

      之前的<使用Python的tkinte模块实现界面化的批量修改文件名>主要实现了批量移除文件名中的指定字符串,无法进行替换,本文在前面工作的基础上,增加批量替换文件名中指定字符串的功能 ...

  6. java gui怎么做游戏_Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

    本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package sna ...

  7. 组件化开发之路由器模块详解(ActivityRouter源码详解)

    路由器的作用是什么?通俗的讲,路由器的作用就是一根网线满足多人上网的需求.而在开发中路由器模块的作用就是实现中转分发,也就是说将原来有关系的模块(有依赖的模块分开),产生一个中间的模块,让原来依赖的两 ...

  8. Qt 零基础设计实现TCP服务器和客户端上位机(零基础实战详解,附源码文件)

    文章目录 TCP和UDP TCP的三次握手和四次分手 TCP和UDP的区别 关于Socket(套接字) Qt TCP服务器的设计与实现 使用Qt的 帮助 TCP服务器和客户端 区别 UI界面设计和原则 ...

  9. 微信开发实战(4)—URL、Token认证、java源码、免费新浪SAE部署

    上篇文章概要介绍了微信公众号开发的原理,偏重于讲解理论. 本篇文章通过java web应用实现微信公众号的URL.Token认证.并部署到免费的新浪SAE服务器上,轻松教你实现公众号成为开发者号. 一 ...

最新文章

  1. 人工智能3d建模算法_打破国外垄断,全国产3D芯片为机器人“点睛”
  2. [转]bootstrap table 动态列数
  3. 单层感知器应用实例--坐标点的二分类模式分类
  4. 如何使用Oracle的外部表查询警告日志文件
  5. 21.Longest Palindromic Substring(最长回文子串)
  6. Android实现飘动的旗帜效果实例
  7. 华为云MySQL数据库外网使用
  8. 3-1机器学习中的分类与回归问题
  9. android画面传输到电视,如何将手机内容投屏到电视上?
  10. Python符号计算入门及隐函数图像绘制
  11. 动态球html,用html5标签让小球动起来
  12. 10.26 第二次面试小感
  13. 最早的算法可追溯到三千年前,“所谓的 AI 并非源自先进的技术”!
  14. Fortinet推出集成化SD-WAN解决方案
  15. oracle 多表查询_【Oracle】多表查询
  16. 如何将明细数据自动分类生成汇总报表
  17. c语言oct,【讨论】OCT扫描中的C-scan你知道吗????????
  18. Excel基础教程(2)——函数与公式
  19. 中国人民大学信息学院夏令营经验贴
  20. 什么是手机号码姓名实名认证 手机号码查姓名 手机号实名认证API

热门文章

  1. 【CV】DeepLab:使用DCNN、空洞卷积和全连接条件随机场的图像语义分割网络
  2. 原动力×云原生正发声 降本增效大讲堂
  3. 18家银行的数字化转型行动
  4. D. AB-string(对立事件)
  5. 迁移prometheus数据
  6. 第三届中国互联网安全领袖峰会:聚焦新秩序下网络安全之道
  7. 一杯茶品人生沉浮,平常心造万千世界。
  8. 2023最新UI时光邮局系统+给未来写封信系统 PHP源码/美化版
  9. 威武的word Blog
  10. 使用remove.bg库制作证件照生成工具