一骇塘、引言
前面教程中已經(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)
三废膘、思考題
- 考慮如何增加功能竹海,每個(gè)玩家有三條命,每次紅色方塊出界時(shí)消耗一個(gè)生命丐黄,當(dāng)生命值為0時(shí)斋配,才判定游戲失敗。
- 游戲結(jié)束時(shí)的文字灌闺,不是剛好在中間艰争,思考怎么樣才能讓"GAME OVER"的文字局中。