最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python編寫(xiě)一個(gè)記憶翻牌游戲

 更新時(shí)間:2022年03月05日 09:55:17   作者:Charles的皮卡丘  
本文帶大家寫(xiě)個(gè)小游戲,不過(guò)老是用pygame也沒(méi)啥意思,這次我們換點(diǎn)新花樣,用python自帶的tkinter包寫(xiě)一個(gè)記憶翻牌小游戲,感興趣的可以了解一下

導(dǎo)語(yǔ)

昨天看到有留言竟然說(shuō)我是月更博主,我明明更新地這么勤快(心虛.jpg)??窗?,昨天剛更新過(guò),今天又來(lái)更新了。

今天還是帶大家寫(xiě)個(gè)小游戲吧,不過(guò)老是用pygame也沒(méi)啥意思,這次我們換點(diǎn)新花樣,用python自帶的tkinter包寫(xiě)一個(gè)記憶翻牌小游戲唄。

廢話不多說(shuō),讓我們愉快地開(kāi)始吧~

開(kāi)發(fā)工具

Python版本:3.7.4

相關(guān)模塊:

pygame模塊;

tkinter模塊;

pillow模塊;

以及一些python自帶的模塊。

環(huán)境搭建

安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。

先睹為快

在終端運(yùn)行如下命令即可:

python Game27.py

效果如下:

視頻鏈接

原理簡(jiǎn)介

ok,這里我們還是來(lái)簡(jiǎn)單介紹一下游戲的實(shí)現(xiàn)原理吧。

首先,我們還是借助pygame來(lái)播放一首我們喜歡的背景音樂(lè)吧:

'''播放背景音樂(lè)'''
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張完全不同的圖像,我們游戲的目標(biāo)就是在有限的時(shí)間內(nèi),將16張卡片中包含相同的圖像的卡片兩兩配對(duì)。匹配的規(guī)則是鼠標(biāo)連續(xù)地點(diǎn)擊兩張卡片,若卡片背面的圖像相同,則匹對(duì)成功,否則配對(duì)失敗。游戲主要考察玩家的記憶力,因?yàn)橛螒蜻€規(guī)定游戲翻開(kāi)的卡片數(shù)量至多有兩張,否則一開(kāi)始被點(diǎn)擊而翻開(kāi)的卡片將再次被蓋上(若該張卡片沒(méi)有匹對(duì)成功)。

接著,我們來(lái)定義一些有用的變量:

# 已經(jīng)顯示正面的卡片
self.shown_cards = []
# 場(chǎng)上存在的卡片數(shù)量
self.num_existing_cards = len(cards_list)
# 顯示游戲剩余時(shí)間
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)

并讓界面一開(kāi)始可以出現(xiàn)在電腦屏幕的居中位置:

# 居中顯示
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()

由于是在有限的時(shí)間內(nèi)完成所有卡片的匹對(duì),所以我們來(lái)寫(xiě)一個(gè)定時(shí)函數(shù),并實(shí)時(shí)等更新顯示當(dāng)前游戲的剩余時(shí)間:

'''計(jì)時(shí)'''
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()

最后,我們?cè)谑髽?biāo)左鍵點(diǎn)擊卡片時(shí),用代碼定義一下游戲的響應(yīng)規(guī)則,以實(shí)現(xiàn)我們想要的功能:

'''點(diǎn)擊回調(diào)函數(shù)'''
def clickcallback(self, event):
    card = event.widget
    if card.show: return
    # 之前沒(méi)有卡片被翻開(kāi)
    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
    # 之前只有一張卡片被翻開(kāi)
    elif len(self.shown_cards) == 1:
        # --之前翻開(kāi)的卡片和現(xiàn)在的卡片一樣
        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)
        # --之前翻開(kāi)的卡片和現(xiàn)在的卡片不一樣
        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
    # 之前有兩張卡片被翻開(kāi)
    elif len(self.shown_cards) == 2:
        # --之前翻開(kāi)的第一張卡片和現(xiàn)在的卡片一樣
        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)
        # --之前翻開(kāi)的第二張卡片和現(xiàn)在的卡片一樣
        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)
        # --之前翻開(kāi)的卡片和現(xiàn)在的卡片都不一樣
        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
    # 判斷游戲是否已經(jīng)勝利
    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,大功告成。代碼邏輯比較簡(jiǎn)單,就不展開(kāi)講啦,小伙伴們簡(jiǎn)單看下,肯定就能看懂啦。

到此這篇關(guān)于利用Python編寫(xiě)一個(gè)記憶翻牌游戲的文章就介紹到這了,更多相關(guān)Python翻牌游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法

    Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法

    這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)篩選及提取序列中元素的方法,涉及Python列表推導(dǎo)式、生成器表達(dá)式及filter()函數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2018-03-03
  • Python OpenCV學(xué)習(xí)之圖形繪制總結(jié)

    Python OpenCV學(xué)習(xí)之圖形繪制總結(jié)

    在圖像的任務(wù)中,不管是圖像檢測(cè)還是圖像識(shí)別,我們都需要通過(guò)繪制圖形和繪制文字對(duì)處理的結(jié)果進(jìn)行說(shuō)明,本篇就詳細(xì)介紹下OpenCV中的圖形的繪制,感興趣的可以了解一下
    2022-01-01
  • python自制簡(jiǎn)易mysql連接池的實(shí)現(xiàn)示例

    python自制簡(jiǎn)易mysql連接池的實(shí)現(xiàn)示例

    本文主要介紹了python自制簡(jiǎn)易mysql連接池的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 這十大Python庫(kù)你真應(yīng)該知道

    這十大Python庫(kù)你真應(yīng)該知道

    這篇文章主要為大家詳細(xì)介紹了十大Python庫(kù),學(xué)習(xí)數(shù)據(jù)分析應(yīng)該弄清楚該學(xué)習(xí)什么技能,該使用哪種工具,本文具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python pygame 憤怒的小鳥(niǎo)游戲示例代碼

    python pygame 憤怒的小鳥(niǎo)游戲示例代碼

    這篇文章主要介紹了python pygame 憤怒的小鳥(niǎo)游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • python根據(jù)時(shí)間獲取周數(shù)代碼實(shí)例

    python根據(jù)時(shí)間獲取周數(shù)代碼實(shí)例

    這篇文章主要介紹了python根據(jù)時(shí)間獲取周數(shù),通過(guò)周數(shù)獲取時(shí)間代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 對(duì)Python 檢查文件名是否規(guī)范的實(shí)例詳解

    對(duì)Python 檢查文件名是否規(guī)范的實(shí)例詳解

    今天小編就為大家分享一篇對(duì)Python 檢查文件名是否規(guī)范的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python中rb含義理解

    python中rb含義理解

    在本篇文章里小編給大家整理的是關(guān)于python中rb含義及用法內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫(kù)sqlite3)

    DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫(kù)sqlite3)

    今天小編就為大家分享一篇DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫(kù)sqlite3),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Flask sqlalchemy一對(duì)多與多對(duì)一與一對(duì)一及多對(duì)多關(guān)系介紹

    Flask sqlalchemy一對(duì)多與多對(duì)一與一對(duì)一及多對(duì)多關(guān)系介紹

    這篇文章主要介紹了Flask sqlalchemy一對(duì)多與多對(duì)一與一對(duì)一及多對(duì)多關(guān)系介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09

最新評(píng)論

怀安县| 防城港市| 邯郸市| 五台县| 青河县| 宾阳县| 漾濞| 宜宾县| 磴口县| 邯郸市| 澜沧| 吴堡县| 忻州市| 银川市| 新宁县| 桃江县| 盐边县| 靖安县| 孟连| 炎陵县| 桃源县| 连云港市| 永吉县| 朝阳市| 北安市| 建德市| 湟中县| 吉隆县| 卢湾区| 巨鹿县| 车险| 雷波县| 汨罗市| 奎屯市| 德阳市| 烟台市| 青海省| 永靖县| 星子县| 泽普县| 安乡县|