趣味编程:提高记忆训练-记忆翻牌游戏实战项目!!

446 阅读4分钟

前文

    最近一直在更新文章视频中,发现游戏的反响还是挺不错的。所以熬夜爆肝写完了篇文字 说实话还有之前写过的很多游戏代码也准备继续写成文章了,有朋友需要游戏的话可以评论下想要哪些。

看下我之前珍藏的游戏代码中有没得你需要的,提前给大家写出来哈!!!

顺便喜欢游戏代码的朋友推荐下之前写过的2篇游戏代码:一个是塔防的游戏代码、一个是成语接龙的游戏啦!!!!好了,话不多说,看到别的博主都似乎写的Java的记忆翻牌小游戏,很有趣,所以Python可不能输呀!!

这次准备了一份Python版本的dog记忆翻牌游戏项目啦开干!!

1.零基础也能学会的趣味编程!!Python塔防小游戏手把手教学。【附源码】

2.童年经典:成语接龙游戏项目实战。

正文

需要安装的环境模块:

**Python****版本:**3.7

相关模块:

pygame模块;

tkinter模块;

pillow模块;

以及一些python自带的模块。

需要安装的模块直接pip安装即可。

开始实现代码:

每个游戏的话是不是添加一首音乐背景更加有游戏的气氛效果嘞!

'''播放背景音乐'''
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')

​​​​​并在主界面上显示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_image        
self.game_matrix[position].file =     str(cards_list[r * 4 + c])        
self.game_matrix[position].show = False        
self.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 = 30self.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()

由于是在有限的时间内完成所有卡片的匹对,所以我们来写一个定时函数,并实时等更新显示当前游戏的剩余时间:

'''计时'''
def tick(self):    
if self.num_existing_cards == 0: return    
if self.num_seconds != 0:        
self.num_seconds -= 1        
self.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.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()

实现效果相同的即可消除:

​​

​​

结尾

好了。记忆翻牌游戏代码就到这里正式结束了哈,更加完整详细的项目代码私聊小编:06即可获取。

💕💕💕小编如果忙碌中,点击自助领取可好。💕💕💕

如有文章对你有帮助,“关注点赞”和评论是对我最大的支持哦!!