前言

用python自带的tkinter包写一个记忆翻牌小游戏呗。让我们愉快地开始吧~

开发工具

Python版本: 3.7.4

相关模块:

pygame模块;

tkinter模块;

pillow模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

ok,这里我们还是来简单介绍一下游戏的实现原理吧。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以价位♥(同音):762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

首先,我们还是借助pygame来播放一首我们喜欢的背景音乐吧:

'''播放背景音乐'''
def playbgm(self):pygame.init()pygame.mixer.init()pygame.mixer.music.load(cfg.AUDIOPATHS['bgm'])pygame.mixer.music.play(-1, 0.0)

然后,我们初始化一下tkinter的主界面:

# 主界面句柄
self.root = Tk()
self.root.wm_title('Flip Card by Memory —— python工程狮')

并在主界面上显示16张未被翻面的卡片:

# 游戏界面中的卡片字典
self.game_matrix = {}
# 背景图像
self.blank_image = PhotoImage(data=cfg.IMAGEPATHS['blank'])
# 卡片背面
self.cards_back_image = PhotoImage(data=cfg.IMAGEPATHS['cards_back'])
# 所有卡片的索引
cards_list = list(range(8)) + list(range(8))
random.shuffle(cards_list)
# 在界面上显示所有卡片的背面
for r in range(4):for c in range(4):position = f'{r}_{c}'self.game_matrix[position] = Label(self.root, image=self.cards_back_image)self.game_matrix[position].back_image = self.cards_back_imageself.game_matrix[position].file = str(cards_list[r * 4 + c])self.game_matrix[position].show = Falseself.game_matrix[position].bind('<Button-1>', self.clickcallback)self.game_matrix[position].grid(row=r, column=c)

这16张卡片共包含8张完全不同的图像,我们游戏的目标就是在有限的时间内,将16张卡片中包含相同的图像的卡片两两配对。匹配的规则是鼠标连续地点击两张卡片,若卡片背面的图像相同,则匹对成功,否则配对失败。游戏主要考察玩家的记忆力,因为游戏还规定游戏翻开的卡片数量至多有两张,否则一开始被点击而翻开的卡片将再次被盖上(若该张卡片没有匹对成功)。

接着,我们来定义一些有用的变量:

# 已经显示正面的卡片
self.shown_cards = []
# 场上存在的卡片数量
self.num_existing_cards = len(cards_list)
# 显示游戏剩余时间
self.num_seconds = 30
self.time = Label(self.root, text=f'Time Left: {self.num_seconds}')
self.time.grid(row=6, column=3, columnspan=2)

并让界面一开始可以出现在电脑屏幕的居中位置:

# 居中显示
self.root.withdraw()
self.root.update_idletasks()
x = (self.root.winfo_screenwidth() - self.root.winfo_reqwidth()) / 2
y = (self.root.winfo_screenheight() - self.root.winfo_reqheight()) / 2
self.root.geometry('+%d+%d' % (x, y))
self.root.deiconify()

由于是在有限的时间内完成所有卡片的匹对,所以我们来写一个定时函数,并实时等更新显示当前游戏的剩余时间:最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以价位♥(同音):762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

'''计时'''
def tick(self):if self.num_existing_cards == 0: returnif self.num_seconds != 0:self.num_seconds -= 1self.time['text'] = f'Time Left: {self.num_seconds}'self.time.after(1000, self.tick)else:is_restart = messagebox.askyesno('Game Over', 'You fail since time up, do you want to play again?')if is_restart: self.restart()else: self.root.destroy()

最后,我们在鼠标左键点击卡片时,用代码定义一下游戏的响应规则,以实现我们想要的功能:

'''点击回调函数'''
def clickcallback(self, event):card = event.widgetif card.show: return# 之前没有卡片被翻开if len(self.shown_cards) == 0:self.shown_cards.append(card)image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+'.png')))card.configure(image=image)card.show_image = imagecard.show = True# 之前只有一张卡片被翻开elif len(self.shown_cards) == 1:# --之前翻开的卡片和现在的卡片一样if self.shown_cards[0].file == card.file:def delaycallback():self.shown_cards[0].configure(image=self.blank_image)self.shown_cards[0].blank_image = self.blank_imagecard.configure(image=self.blank_image)card.blank_image = self.blank_imageself.shown_cards.pop(0)self.score_sound.play()self.num_existing_cards -= 2image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+'.png')))card.configure(image=image)card.show_image = imagecard.show = Truecard.after(300, delaycallback)# --之前翻开的卡片和现在的卡片不一样else:self.shown_cards.append(card)image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+'.png')))card.configure(image=image)card.show_image = imagecard.show = True# 之前有两张卡片被翻开elif len(self.shown_cards) == 2:# --之前翻开的第一张卡片和现在的卡片一样if self.shown_cards[0].file == card.file:def delaycallback():self.shown_cards[0].configure(image=self.blank_image)self.shown_cards[0].blank_image = self.blank_imagecard.configure(image=self.blank_image)card.blank_image = self.blank_imageself.shown_cards.pop(0)self.score_sound.play()self.num_existing_cards -= 2image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+'.png')))card.configure(image=image)card.show_image = imagecard.show = Truecard.after(300, delaycallback)# --之前翻开的第二张卡片和现在的卡片一样elif self.shown_cards[1].file == card.file:def delaycallback():self.shown_cards[1].configure(image=self.blank_image)self.shown_cards[1].blank_image = self.blank_imagecard.configure(image=self.blank_image)card.blank_image = self.blank_imageself.shown_cards.pop(1)self.score_sound.play()self.num_existing_cards -= 2image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+'.png')))card.configure(image=image)card.show_image = imagecard.show = Truecard.after(300, delaycallback)# --之前翻开的卡片和现在的卡片都不一样else:self.shown_cards.append(card)self.shown_cards[0].configure(image=self.cards_back_image)self.shown_cards[0].show = Falseself.shown_cards.pop(0)image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+'.png')))self.shown_cards[-1].configure(image=image)self.shown_cards[-1].show_image = imageself.shown_cards[-1].show = True# 判断游戏是否已经胜利if self.num_existing_cards == 0:is_restart = messagebox.askyesno('Game Over', 'Congratulations, you win, do you want to play again?')if is_restart: self.restart()else: self.root.destroy()

ok,大功告成。代码逻辑比较简单,就不展开讲啦,小伙伴们简单看下,肯定就能看懂啦。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以价位♥(同音):762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

完整源代码详见相关文件~

文章到这里就结束了,感谢你的观看

为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。

完整源代码详见个人主页简介获取相关文件~

Python游戏开发,pygame模块,Python实现记忆翻牌小游戏相关推荐

  1. 【unity3D】unity记忆翻牌小游戏教程(简单详细)

    游戏开发的学习记录⑨ 项目:记忆翻牌小游戏 unity版本:unity2020.3.30f1c1 目录 项目:记忆翻牌小游戏 unity版本:unity2020.3.30f1c1 一.游戏内容说明 二 ...

  2. Python版基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式

    基于pygame的玛丽快跑小游戏源代码,玛丽冒险小游戏代码,支持双人模式 按空格进入单人模式,按't'进入双人模式,双人模式下玛丽1采用空格键上跳,玛丽2采用方向上键上跳. 完整代码下载地址:Pyth ...

  3. Python游戏开发pygame模块,Python实现球球碰撞小游戏

    相信大家在初中电脑课上都偷偷玩过 Flash 游戏--是男人就坚持 100 秒,在游戏中无数的小球随机运动,玩家用鼠标控制大球,当大球碰撞到小球后,游戏结束,显示坚持的时间.今天我们一起来开发这个小游 ...

  4. Python游戏开发pygame模块,Python实现吃豆人,儿时的回忆

    老规矩,先上效果图 这是一个吃豆人的小游戏.我们8090后这一代人肯定会碰到过.黄点是我们自己,红点就是怪物们.这是最原始版的电子游戏. 然后我们可以在随便一个地方新建一个游戏代码,利用这个包的代码, ...

  5. 【cocos2d游戏开发实战】一款射击类小游戏《Zombie Age》的开发(一)

    前言 因为学习的原因需要完成一款射击类的小游戏,之前做的飞机大战没有达到要求,在网上找了几款射击类游戏后因为素材和难度的关系最后决定山寨一下<僵尸时代2>这款小游戏,开发到游戏主体基本完整 ...

  6. 【游戏开发】unity教程4 打飞碟小游戏

    github传送门:https://github.com/dongzizhu/unity3DLearning/tree/master/hw4/Disk 视频传送门:https://space.bili ...

  7. python小游戏 记忆翻牌小游戏设计与实现

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3.1 环境配置 3.2 Pygame介绍 4 具体实现 居中显示 5 最后 0 项目简介

  8. python小游戏毕设 记忆翻牌小游戏设计与实现 (源码)

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3.1 环境配置 3.2 Pygame介绍 4 具体实现 居中显示 5 最后 0 项目简介

  9. python语音开发库-各种 Python 库/模块/工具

    1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高性能:而 ...

  10. Python 打字小游戏开发,来体验不一样的打字游戏乐趣(第一篇)

    Python 打字小游戏开发,来体验不一样的打字游戏乐趣(第一篇) 前言 游戏素材准备 游戏项目结构 项目里面的类说明 Python 打字小游戏开发,来体验不一样的打字游戏乐趣(第二篇) Python ...

最新文章

  1. Linux下用C++开发PHP扩展
  2. 二叉查找树 平衡二叉查找树 红黑树 b树 b+树 链表 跳表 链表
  3. 拼多多4.5元手表使用功能图
  4. NYOJ -123 士兵杀敌(四)
  5. 前端学习(3302):createRef
  6. 获取当前日期时间并格式化 - 常见格式
  7. RTP Payload Format for H.264 Video
  8. Spring| BeanCurrentlyInCreationException: Error creating bean with name ‘‘xxx“
  9. 相机标定中部分疑问和注意事项
  10. Redis——多数据库
  11. django restframework Serializers
  12. 新安装的centos使用ifconfig无效或者无法使用的解决办法
  13. delphi官方iso下载地址
  14. 企业微信有营销机器人吗?
  15. 关于深拷贝与浅拷贝的问题?
  16. 387:字符串中的第一个唯一字符
  17. 利用HttpSession记录用户的登陆次数
  18. 高中数学必考公式全总结
  19. 基于Vue+Java实现的在线聊天APP系统设计与实现
  20. python 英文语义分析_spinrewriter英文伪原创工具,Python对接API示例

热门文章

  1. linux自动登录帐号密码,设定Linux自动登陆
  2. php的seeder是什么,Laravel学习笔记之Seeder填充数据小技巧
  3. Java路径遍历漏洞修复心得
  4. AndroidStudio 集成 OpenCV
  5. 泰康和百度智能云为何相互需要?
  6. 1:0 本立而道生!
  7. 双摄像头另一个有什么用_手机双摄像头为什么有前后和后双两种?各有什么用?...
  8. 【洛谷】UVA437 巴比伦塔 The Tower of Babylon
  9. ERROR: Removing unused resources requires unused code shrinking to be turned on.
  10. 1205 Lock wait timeout exceeded; try restarting transaction处理