貪吃蛇(三)

上一期尔崔,我們基本上完成了我們的貪吃蛇游戲答毫。但是任然存在一些小問題:

  1. 游戲一打開,我們的小蛇就開始跑了季春,沒有任何的提示洗搂,而且游戲結(jié)束之后,窗口就被直接關(guān)閉了载弄,很不友好耘拇。

  2. 游戲沒有評分,沒有等級什么的宇攻,用戶不知道自己到底在什么水平上惫叛。

好的,本期我們就來解決這兩個(gè)問題逞刷。

原先我們的設(shè)計(jì)是:無論用戶是按關(guān)閉按鈕還是小蛇死亡嘉涌,我們都置running=False,也就是游戲退出夸浅,而不是游戲結(jié)束仑最。這明顯是不合理的,我們只有在用戶按關(guān)閉按鈕的時(shí)候才應(yīng)該退出帆喇,而再其他情況下應(yīng)該使本局游戲結(jié)束警医,但用戶仍然可以開始下一局。這里我們引入另外一個(gè)變量game_is_over坯钦,用于標(biāo)注本局游戲結(jié)束预皇。

在本局游戲結(jié)束之后,如果用戶需要重新開始新一局游戲婉刀,我們可以重新初始化游戲中用到的用于存儲游戲狀態(tài)的數(shù)據(jù)吟温,從而開始新的一局游戲。 為了方便路星,我們可以將初始化用戶狀態(tài)變量的語句用一個(gè)函數(shù)封裝起來溯街,再將這邊變量及函數(shù)用一個(gè)GameStatus類封裝起來诱桂,這樣可以使我們的游戲代碼更加清晰洋丐,更容易重構(gòu)呈昔。

為了方便,我們提示用戶按任意鍵可以開始游戲友绝。

GameStatus

首先堤尾,我們將原先定義為全局變量的狀態(tài),放在一個(gè)類GameStatus里面迁客,再定義一個(gè)實(shí)例用于保存當(dāng)前狀態(tài)

class GameStatus():
    def __init__(self):
        self.reset_game_status()

    # 重置所有的狀態(tài)為初始態(tài)
    def reset_game_status(self):
        self.food_pos = generate_food()
        self.direction = D_LEFT
        self.game_is_over = True
        self.running = True
        self.hardness = HARD_LEVEL[0]

        # 每次小蛇身體加長的時(shí)候郭宝,我們就將身體的位置加到列表末尾
        self.snake_body = [(int(GRID_WIDTH_NUM / 2) * CUBE_WIDTH,
                            int(GRID_HEIGHT_NUM / 2) * CUBE_WIDTH)]

# 定義一個(gè)類的實(shí)例,用于保存當(dāng)前游戲狀態(tài)
status = GameStatus()

這樣的話掷漱,我們原先用的到一些狀態(tài)粘室,比如running/direction 等等,只要在變量面前加上 [status.] 就好了也就是 status.running/status.direction 是不是很簡單~~

開始卜范、結(jié)束界面

改完?duì)顟B(tài)類之后衔统,我們還需要繪制兩個(gè)界面,一個(gè)開始界面海雪,一個(gè)結(jié)束界面锦爵。開始界面我么顯示“歡樂貪吃蛇“,”按任意鍵開始游戲“奥裸。結(jié)束界面险掀,我們顯示”你掛了“。OK湾宙,我們開始吧樟氢!

文字輸出

由于要在屏幕上輸出文字,我么需要指定字體侠鳄,所以首先我們獲取一個(gè)字體(這里我已經(jīng)提前把字體放到了font目錄下面):

font_name = os.path.join(base_folder, 'font/font.ttc')
font = pygame.font.Font(font_name, size)

定義好字體之后我們需要把我們需要顯示的文字用我們選定的字體“寫”出來嗡害,這個(gè)寫出來的字呢,我們可以將它放到屏幕的任何地方哦~畦攘,就像之前我們導(dǎo)入的圖片一樣霸妹,只需要指定一個(gè)位置,我們就可以將圖片復(fù)制過去

text_surface = font.render(text, True, color)

上面那行代碼中知押,text是我們需要顯示的文字叹螟。

結(jié)下來我們需要獲取我們文字所在的矩形,并且將矩形的中心台盯,設(shè)置到我們想要的位置罢绽,當(dāng)然你也可以選擇其他對齊的方式,大家可以參考pygame的文檔静盅。最后就是將其畫到屏幕上了良价,所用到的函數(shù)和我們畫圖片時(shí)的一樣寝殴,也是blit,ok明垢,看一下我們的函數(shù)

def show_text(surf, text, size, x, y, color=WHITE):
    font_name = os.path.join(base_folder, 'font/font.ttc')
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)

接下來蚣常,歡迎界面就簡單多了

def show_welcome(screen):
    show_text(screen, u'歡樂貪吃蛇', 30, WIDTH / 2, HEIGHT / 2)
    show_text(screen, u'按任意鍵開始游戲', 20, WIDTH / 2, HEIGHT / 2 + 50)

結(jié)束界面痊银,只需要打印幾個(gè)字,并加一下延遲

show_text(screen, u'你掛了', 30, WIDTH / 2, HEIGHT / 2)
          pygame.display.update()
          pygame.time.delay(2000)

好了溯革,各個(gè)部件都已經(jīng)完成了贞绳,我們來修改一下游戲邏輯冈闭,在檢測到有按鈕按下時(shí),我們需要判斷一下游戲是否還沒有開始抖单,如果沒有開始我們就需要,將游戲狀態(tài)置為開始臭猜。并且游戲沒有開始的時(shí)候,我們不需要更新屏幕

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        status.running = False
    elif event.type == pygame.KEYDOWN:      # 如果有按鍵被按下了
        # 如果本局游戲已經(jīng)結(jié)束(或者沒有開始)蔑歌,那么按任意鍵開始游戲
        if status.game_is_over:
            # 重置游戲狀態(tài)
            status.reset_game_status()
            status.game_is_over = False
            break

# ................................................................................

if status.game_is_over:
    show_welcome(screen)
    pygame.display.update()

    如果游戲還沒有開始,接下來的操作就沒有必要進(jìn)行了
    continue

大功告成4瓮馈!

我們開一下效果~


game_start.png

評分

現(xiàn)在我們來解決下一個(gè)問題 --- 評分

我們在屏幕右端添加一個(gè)寬為200px的區(qū)域用于展示分?jǐn)?shù)和當(dāng)前我們的 level

SCREEN_WIDTH = WIDTH + 200

然后更改一下我們的畫布

# 設(shè)置畫布
screen = pygame.display.set_mode((SCREEN_WIDTH, HEIGHT))

這樣我們的屏幕就變寬了~

我們在GameStatus類中添加一個(gè)score字段用于存儲當(dāng)前的得分劫灶,每次小蛇吃到一個(gè)事物我們就加點(diǎn)分?jǐn)?shù)

class GameStatus():
    def __init__(self):
        self.reset_game_status()

    # 重置所有的狀態(tài)為初始態(tài)
    def reset_game_status(self):
        # ...
        self.score = 0

然后再定義一個(gè)展示分?jǐn)?shù)的函數(shù)

def show_scores(screen, status):
    show_text(screen, u'級別: {}'.format(status.hardness), CUBE_WIDTH,
        WIDTH + CUBE_WIDTH * 3, CUBE_WIDTH * 4)

    show_text(screen, u'得分: {}'.format(status.score), CUBE_WIDTH,
        WIDTH + CUBE_WIDTH * 3, CUBE_WIDTH * 6)

OK!現(xiàn)在來修改一下我們主函數(shù)

# 如果吃到了食物我們就產(chǎn)生一個(gè)新的食物
if got_food:
    status.score += status.hardness

# 每次刷新屏幕前加上刷新分?jǐn)?shù)的函數(shù)調(diào)用
show_scores(screen, status)

好的~ 我們看一下最終效果~


snake-v2.png

我們的貪吃蛇又進(jìn)一步完善了~

完整的代碼可以去我的 github 看本昏,點(diǎn)擊這里進(jìn)入GitHub供汛。
如果這篇文章對您有幫助,贊賞一下吧~

您的支持是我繼續(xù)創(chuàng)作的動(dòng)力~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涌穆,一起剝皮案震驚了整個(gè)濱河市怔昨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宿稀,老刑警劉巖趁舀,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異祝沸,居然都是意外死亡矮烹,警方通過查閱死者的電腦和手機(jī)越庇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了藤滥?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轮洋。 經(jīng)常有香客問我车要,道長,這世上最難降的妖魔是什么萍聊? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任问芬,我火速辦了婚禮,結(jié)果婚禮上寿桨,老公的妹妹穿的比我還像新娘此衅。我一直安慰自己,他們只是感情好亭螟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布挡鞍。 她就那樣靜靜地躺著,像睡著了一般预烙。 火紅的嫁衣襯著肌膚如雪墨微。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天扁掸,我揣著相機(jī)與錄音翘县,去河邊找鬼。 笑死谴分,一個(gè)胖子當(dāng)著我的面吹牛锈麸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牺蹄,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忘伞,長吁一口氣:“原來是場噩夢啊……” “哼氓奈!你這毒婦竟也來了僧凰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤伪节,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纱兑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體化借,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓖康,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年蒜焊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖悠。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡优妙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卡辰,到底是詐尸還是另有隱情熟菲,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布允蚣,位于F島的核電站嚷兔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冒晰。R本人自食惡果不足惜竟块,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒋情。 院中可真熱鬧,春花似錦棵癣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丧裁,卻和暖如春含衔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪染。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工杭隙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人票髓。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓铣耘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親裆操。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件吊骤、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,101評論 4 62
  • Ubuntu的發(fā)音 Ubuntu掌敬,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音奔害。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,260評論 9 467
  • 轉(zhuǎn)眼間地熄,大二下學(xué)期就要開始了,目標(biāo)就是好好學(xué)習(xí)雅潭,省錢却特,回想上學(xué)期的生活,整個(gè)一慘不忍睹裂明,那我就從幾個(gè)方面講吧。(...
    crystallkw閱讀 268評論 0 0
  • 291028~魏鴻超 2017/7/29 連續(xù)總結(jié)第168天 思考內(nèi)容: 即將在上海進(jìn)入博物館照明項(xiàng)目領(lǐng)域扳碍,改領(lǐng)域...
    a0001911cc5a閱讀 237評論 0 1