91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用Python編寫一個記憶翻牌游戲

發布時間:2022-03-05 11:42:55 來源:億速云 閱讀:206 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“如何利用Python編寫一個記憶翻牌游戲”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何利用Python編寫一個記憶翻牌游戲”這篇文章吧。

開發工具

Python版本:3.7.4

相關模塊:

pygame模塊;

tkinter模塊;

pillow模塊;

以及一些python自帶的模塊。

環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關模塊即可。

先睹為快

在終端運行如下命令即可:

python Game27.py

效果如下:

視頻鏈接

原理簡介

ok,這里我們還是來簡單介紹一下游戲的實現原理吧。

首先,我們還是借助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 —— Charles的皮卡丘')

并在主界面上顯示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 = 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()

由于是在有限的時間內完成所有卡片的匹對,所以我們來寫一個定時函數,并實時等更新顯示當前游戲的剩余時間:

'''計時'''
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()

以上是“如何利用Python編寫一個記憶翻牌游戲”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳山县| 成都市| 来宾市| 无极县| 铜鼓县| 留坝县| 洪江市| 兰西县| 临漳县| 瓮安县| 新蔡县| 克什克腾旗| 西盟| 措勤县| 疏勒县| 巧家县| 临猗县| 河间市| 金湖县| 台南市| 南乐县| 宁蒗| 通化县| 光泽县| 即墨市| 安康市| 新乐市| 濮阳市| 清苑县| 石家庄市| 齐河县| 金坛市| 楚雄市| 藁城市| 临沂市| 长治市| 武山县| 宜良县| 金湖县| 永平县| 瑞金市|