记忆翻牌游戏介绍,记忆翻牌游戏规则
本文带你写一个小游戏,但是老是用pygame一点都不好玩。这一次,我们来换一些新花样,用python自带的tkinter包写一个内存翻牌游戏。有兴趣的可以去了解一下。
00-1010铅开发工具环境构建原理介绍。
目录
昨天看到一条消息,说我是月嫂博主。我这么勤快更新(心虚. jpg)。看,昨天更新了,今天又更新了。
今天就带大家写一个小游戏,但是老是用pygame一点都不好玩。这一次,我们来换一些新花样,用python自带的tkinter包写一个内存翻牌游戏。
事不宜迟,我们愉快的开始吧~
导语
Python版本:3.7.4
相关模块:
Pygame模块;
Tkinter模块;
枕头模块;
以及python自带的一些模块。
开发工具
安装Python并将其添加到环境变量中。pip可以安装所需的相关模块。
环境搭建
在终端运行以下命令:
python Game27.py
效果如下:
视频波道
先睹为快
好了,这里简单介绍一下游戏的实现原理。
首先,我们借助pygame播放一段喜欢的背景音乐:
播放背景音乐
def playbgm(自身):
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg。听觉路径[bgm])
pygame.mixer.music.play(-1,0.0)
然后,我们来初始化tkinter的主界面:
#主界面句柄
self.root=Tk()
Self.root.wm _ title(按记忆翻牌——查尔斯皮卡丘)
并在主界面显示16张未翻牌:
#游戏界面中的卡片字典
self.game_matrix={}
#背景图像
self . blank _ image=photo image(data=CFG。图像路径[空白])
#卡片背面
self . cards _ back _ image=PhotoImage(data=CFG。图像路径[cards_back])
#所有卡片的索引
cards _ list=list(range(8))list(range(8))
random.shuffle(卡片列表)
#在界面上显示所有卡片的背面
对于范围(4):中的r
对于范围(4):中的c
position=f“{ r } _ { c }”
self . game _ matrix[position]=Label(self . root,image=self.cards_back_image)
self.game_matrix【位置】。back _ image=self . cards _ back _ image
self.game_matrix【位置】。file=str(cards_list[r * 4 c])
self.game_matrix【位置】。show=False
self.game_matrix【位置】。bind(Button-1 ,self.clickcallback)
self.game_matrix【位置】。网格(行=r,列=c)
这16张卡片包含8个完全不同的图像。我们游戏的目标是在有限的时间内将16张卡片中的相同图像配对。匹配规则是鼠标连续点击两张卡片。如果卡片背面的图像相同,则匹配成功;否则,匹配失败。游戏主要考察玩家的记忆力,因为游戏也规定了游戏中打开的卡数最多为两张,否则一开始点击打开的卡会被重新覆盖(如果卡没有配对的话)
功)。
接着,我们来定义一些有用的变量:
# 已经显示正面的卡片self.shown_cards = []
# 场上存在的卡片数量
self.num_existing_cards = len(cards_list)
# 显示游戏剩余时间
self.num_seconds = 30
self.time = Label(self.root, text=fTime 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()
由于是在有限的时间内完成所有卡片的匹对,所以我们来写一个定时函数,并实时等更新显示当前游戏的剩余时间:
计时def tick(self):
if self.num_existing_cards == 0: return
if self.num_seconds != 0:
self.num_seconds -= 1
self.time[text] = fTime 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.widget
if 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 = image
card.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_image
card.configure(image=self.blank_image)
card.blank_image = self.blank_image
self.shown_cards.pop(0)
self.score_sound.play()
self.num_existing_cards -= 2
image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+.png)))
card.configure(image=image)
card.show_image = image
card.show = True
card.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 = image
card.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_image
card.configure(image=self.blank_image)
card.blank_image = self.blank_image
self.shown_cards.pop(0)
self.score_sound.play()
self.num_existing_cards -= 2
image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+.png)))
card.configure(image=image)
card.show_image = image
card.show = True
card.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_image
card.configure(image=self.blank_image)
card.blank_image = self.blank_image
self.shown_cards.pop(1)
self.score_sound.play()
self.num_existing_cards -= 2
image = ImageTk.PhotoImage(Image.open(os.path.join(self.card_dir, card.file+.png)))
card.configure(image=image)
card.show_image = image
card.show = True
card.after(300, delaycallback)
# --之前翻开的卡片和现在的卡片都不一样
else:
self.shown_cards.append(card)
self.shown_cards[0].configure(image=self.cards_back_image)
self.shown_cards[0].show = False
self.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 = image
self.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编写一个记忆翻牌游戏的文章就介绍到这了,更多相关Python翻牌游戏内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。