用pygame開發(fā)自己的游戲-7.增加游戲失敗功能

一骇塘、引言

前面教程中已經(jīng)實(shí)現(xiàn)游戲的基本功能,但游戲只有得分韩容,沒有失敗懲罰的功能款违,顯然比較無趣。本節(jié)中群凶, 我們嘗試增加游戲失敗功能插爹,當(dāng)紅色方塊出界時(shí),游戲?yàn)榻Y(jié)束狀態(tài)请梢,在界面中間顯示“GAME OVER”的文字赠尾。

二、實(shí)現(xiàn)思路

紅色方塊出界游戲就失敗

前面的例子中毅弧,我們很容易找到紅色方塊出界需要在哪里判斷增加代碼萍虽。

    if red_y >= 300:
        red_y = 0
        red_x = random.randint(50, 350)

當(dāng)red_y變量大于300時(shí),就說明紅色方塊出界形真,我們?cè)诖颂幵黾语@示“GAME OVER”文字杉编,這部分的功能應(yīng)該跟前面顯示分?jǐn)?shù)的功能類似超全,同學(xué)們一定要學(xué)會(huì)舉一反三,將前面代碼copy后進(jìn)行修改邓馒,我們只需要修改文字的內(nèi)容嘶朱、字體、顏色光酣,就可以完成功能疏遏。
代碼如下:

import pygame, sys
import random
# 初始化
pygame.init()
SCREEN = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Hello World!')

# 綠色方塊固定在最下方,左右移動(dòng)救军,y值不變
green_x = 110
# 紅色方塊從上往下移動(dòng)财异,x值不變
red_y = 0
# 游戲主循環(huán)
score = 0
pygame.font.init()
myfont = pygame.font.Font(None,60)
red_x = 35
while True: 
    for event in pygame.event.get():
        # 處理退出事件
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        # 鍵盤按下事件
        elif event.type == pygame.KEYDOWN:
            # 'a'鍵被按下
            if event.key == pygame.K_a:
                green_x -= 5
            elif event.key == pygame.K_d:
                green_x += 5
    red_y += 5
    green_rect = pygame.Rect(green_x, 250, 100, 50)
    if green_rect.colliderect(red_x, red_y, 20, 50):
        print('紅色方塊與綠色方塊碰撞到了')
        # 為了方便看到碰撞結(jié)果,直接break返回
        score += 1
        red_y = 0
        red_x = random.randint(50, 350)
    if red_y >= 300:
        gameOverTextImage = myfont.render('GAME OVER!', True, (0, 0, 255))
        SCREEN.blit(gameOverTextImage, (80,150))
        
    SCREEN.fill((255, 255, 255))
    # 調(diào)用 pygame.display.update() 方法更新整個(gè)屏幕的顯示
    pygame.draw.rect(SCREEN, (255, 0, 0), (red_x, red_y, 20, 50))
    pygame.draw.rect(SCREEN, (0, 255, 0), (green_x, 250, 100, 50))
    textImage = myfont.render("score: " + str(score), True, (255, 0, 0))
    SCREEN.blit(textImage, (10,10))

    pygame.display.update()
    pygame.time.delay(50)

小伙伴把代碼復(fù)制到idle編輯后運(yùn)行唱遭,當(dāng)紅色方塊出界時(shí)戳寸,并沒有看到文字出現(xiàn)。當(dāng)代碼運(yùn)行結(jié)果與預(yù)期不一致拷泽,小伙伴一定不要著急疫鹊,要仔細(xì)調(diào)試代碼。調(diào)試代碼來說司致,最有效的方式有兩個(gè):1拆吆、閱讀源代碼;2脂矫、在相關(guān)代碼增加打印枣耀,觀察重要變量的值,找出與預(yù)期不一致的地方庭再,思考是什么樣的原因可能引起這些異常捞奕。

上面的代碼我們無法顯示出“GAME OVER”文字是因?yàn)椋覀兿犬嫵鼋Y(jié)束文字佩微,后面的代碼再調(diào)用SCREEN.fill函數(shù)把背景填充成白色缝彬,此時(shí)將我們畫出來的文字覆蓋了萌焰。一種粗暴解決這個(gè)問題的方法哺眯,將SCREEN.fill這一行代碼改在
if red_y >= 300 這一行之前。但這種寫法我們把畫圖跟邏輯判斷的代碼混在一起扒俯,比較不好奶卓。我們來嘗試這么寫,用is_over變量來表示游戲是否結(jié)束撼玄,邏輯判斷時(shí)把狀態(tài)保存到該變量夺姑,畫圖畫界面時(shí)利用這個(gè)變量來判斷是否需要再顯示相關(guān)文字。
實(shí)現(xiàn)代碼如下:

import pygame, sys
import random
# 初始化
pygame.init()
SCREEN = pygame.display.set_mode((400, 300))
pygame.display.set_caption('Hello World!')

# 綠色方塊固定在最下方掌猛,左右移動(dòng)盏浙,y值不變
green_x = 110
# 紅色方塊從上往下移動(dòng)眉睹,x值不變
red_y = 0
# 游戲主循環(huán)
score = 0
pygame.font.init()
myfont = pygame.font.Font(None,60)
red_x = 35
is_over = False
while True: 
    for event in pygame.event.get():
        # 處理退出事件
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        # 鍵盤按下事件
        elif event.type == pygame.KEYDOWN:
            # 'a'鍵被按下
            if event.key == pygame.K_a:
                green_x -= 5
            elif event.key == pygame.K_d:
                green_x += 5
    red_y += 5
    green_rect = pygame.Rect(green_x, 250, 100, 50)
    if green_rect.colliderect(red_x, red_y, 20, 50):
        print('紅色方塊與綠色方塊碰撞到了')
        # 為了方便看到碰撞結(jié)果,直接break返回
        score += 1
        red_y = 0
        red_x = random.randint(50, 350)
    if red_y >= 300:
        is_over = True
        
    SCREEN.fill((255, 255, 255))
    # 調(diào)用 pygame.display.update() 方法更新整個(gè)屏幕的顯示
    pygame.draw.rect(SCREEN, (255, 0, 0), (red_x, red_y, 20, 50))
    pygame.draw.rect(SCREEN, (0, 255, 0), (green_x, 250, 100, 50))
    textImage = myfont.render("score: " + str(score), True, (0, 0, 255))
    SCREEN.blit(textImage, (10,10))
    if is_over:
        gameOverTextImage = myfont.render('GAME OVER!', True, (255, 0, 0))
        SCREEN.blit(gameOverTextImage, (80,150))
    pygame.display.update()
    pygame.time.delay(50)
游戲結(jié)束畫面.png

三废膘、思考題

  1. 考慮如何增加功能竹海,每個(gè)玩家有三條命,每次紅色方塊出界時(shí)消耗一個(gè)生命丐黄,當(dāng)生命值為0時(shí)斋配,才判定游戲失敗。
  2. 游戲結(jié)束時(shí)的文字灌闺,不是剛好在中間艰争,思考怎么樣才能讓"GAME OVER"的文字局中。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桂对,一起剝皮案震驚了整個(gè)濱河市甩卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌接校,老刑警劉巖猛频,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛛勉,居然都是意外死亡鹿寻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門诽凌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡熏,“玉大人,你說我怎么就攤上這事侣诵×》ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵杜顺,是天一觀的道長(zhǎng)财搁。 經(jīng)常有香客問我,道長(zhǎng)躬络,這世上最難降的妖魔是什么尖奔? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮穷当,結(jié)果婚禮上提茁,老公的妹妹穿的比我還像新娘。我一直安慰自己馁菜,他們只是感情好茴扁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汪疮,像睡著了一般峭火。 火紅的嫁衣襯著肌膚如雪毁习。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天卖丸,我揣著相機(jī)與錄音蜓洪,去河邊找鬼。 笑死坯苹,一個(gè)胖子當(dāng)著我的面吹牛隆檀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粹湃,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼恐仑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了为鳄?” 一聲冷哼從身側(cè)響起裳仆,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孤钦,沒想到半個(gè)月后歧斟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偏形,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年静袖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俊扭。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡队橙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萨惑,到底是詐尸還是另有隱情捐康,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布庸蔼,位于F島的核電站解总,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姐仅。R本人自食惡果不足惜花枫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萍嬉。 院中可真熱鬧乌昔,春花似錦隙疚、人聲如沸壤追。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽行冰。三九已至溺蕉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悼做,已是汗流浹背疯特。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肛走,地道東北人漓雅。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朽色,于是被迫代替她去往敵國(guó)和親邻吞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 一葫男、引言 前面教程中我們學(xué)會(huì)判斷綠色方塊接收紅色方塊抱冷,我們來增加一個(gè)功能,在屏幕左上角顯示游戲的得分梢褐。 二旺遮、實(shí)現(xiàn)思...
    象騎士Hack閱讀 4,720評(píng)論 67 47
  • 本文從 這里 翻譯過來的。 2048這個(gè)游戲有一段時(shí)間特別火盈咳,Github上有其原始版本耿眉,游戲看起來很簡(jiǎn)單,但是...
    江楓閱讀 1,456評(píng)論 2 7
  • 一鱼响、引言 前面的用pygame開發(fā)自己的游戲-1. 基礎(chǔ)與入門文章中跷敬,我們學(xué)習(xí)了如何畫出一個(gè)方塊,今天我們來學(xué)習(xí)如...
    象騎士Hack閱讀 1,946評(píng)論 18 50
  • 我喜歡拍照热押,喜歡記錄生活西傀。手機(jī)隨時(shí)抓在手里,看見就拍桶癣,不是每張都好拥褂,但總有好的一張。相機(jī)也喜歡牙寞,但都是做好拍照...
    Frommm閱讀 991評(píng)論 20 18
  • 既已許卿共白頭,此生便無一時(shí)休 南國(guó)公主這杯酒饺鹃,李容若能喝,蘇落白不能喝间雀。 將心比心悔详,李容若能接受,蘇落白不能接受...
    星辰微小說閱讀 291評(píng)論 0 1