再來就是主程式了,所有打磚塊的邏輯運作與繪圖都在這邊執行,已將程式碼放置GitHub Gist上,大部分的功能說明也都在程式碼內,後面會再針對細節在個別作詳細解說:
【play.py程式碼】
# 函數:秀字.
def showFont( text, x, y, color):
global canvas
text = font.render(text, True, color)
canvas.blit( text, (x,y))
此函數會依照傳入的座標與顏色顯示文字。
使用說明:
showFont( 文字, x, y, 顏色)
使用範例:
showFont( u”磚塊數量” 0, 0, (255, 0, 0))
# 函數:碰撞判斷.
# x : x
# y : y
# boxRect : 矩形
def isCollision( x, y, boxRect):
if (x >= boxRect[0] and x <= boxRect[0] + boxRect[2] and y >=
boxRect[1] and y <= boxRect[1] + boxRect[3]):
return True;
return False;
此函數傳入要判斷碰撞的點座標與矩形,如果發生碰撞函數會回傳True反之回傳False
使用說明:
isCollision( x, y, 矩形)
使用範例:
if(isCollision( ball.pos[0], ball.pos[1], paddle.rect)):
。。。
# 函數:初始遊戲、重新開始遊戲.
def resetGame():
# 宣告使用全域變數.
global game_mode, brick_num, bricks_list, dx, dy
# 磚塊
for bricks in bricks_list:
# 亂數磚塊顏色
r = random.randint(100,200)
g = random.randint(100,200)
b = random.randint(100,200)
bricks.color = [r,g,b]
# 開啟磚塊.
bricks.visivle = True
# 0:等待開球
game_mode = 0
# 磚塊數量.
brick_num = 99
# 移動速度.
dx = 8
dy = -8
主要處理重新亂數產生磚塊顏色並開啟磚塊,初始遊戲模式(game_mode = 0)、初始磚塊數量(brick_num = 99)與設定球移動速度。
# 設定板子初始位置.
paddle_x = 0
paddle_y = (canvas_height — 48)
# 建立板子
paddle = Box(pygame, canvas, “paddle”, [paddle_x, paddle_y, 100, 24],
(255,255,255))
# 設定球初始位置.
ball_x = paddle_x
ball_y = paddle_y
# 建立球
ball = Circle(pygame, canvas, “ball”, [ball_x, ball_x], 8,
(255,255,255))
以迴圈產生所有磚塊並將產生的磚塊放入bricks_list陣列內。
# 初始產生磚塊變數
brick_num = 0
brick_x = 70
brick_y = 60
brick_w = 0
brick_h = 0
# 使用迴圈產生99個磚塊
for i in range( 0, 99):
# 每列11個磚塊
if((i % 11)==0):
brick_w = 0
# 每行區隔18像素
brick_h = brick_h + 18
# 建立磚塊並將其加入bricks_list陣列內
bricks_list.append (Box(pygame, canvas, “brick_”+str(i), [
brick_w + brick_x, brick_h+ brick_y, 58, 16],
[255,255,255]))
# 每個磚塊區隔60像素
brick_w = brick_w + 60
- 111~200:主程式迴圈
- 116~134:判斷鍵盤與滑鼠輸入
# 判斷輸入.
for event in pygame.event.get():
# 離開遊戲.
if event.type == pygame.QUIT:
running = False
# 判斷按下按鈕
if event.type == pygame.KEYDOWN:
# 判斷按下ESC按鈕
if event.key == pygame.K_ESCAPE:
running = False
# 判斷Mouse.
if event.type == pygame.MOUSEMOTION:
paddle_x = pygame.mouse.get_pos()[0] — 50
if event.type == pygame.MOUSEBUTTONDOWN:
if(game_mode == 0):
game_mode = 1
取得鍵盤輸入的方式為先利用以下指令取的鍵盤輸入事件:
for event in pygame.event.get():
然後再判斷事件的type是否為”按下鍵盤”事件:
if event.type == pygame.KEYDOWN:
接下來在透過事件的key來判斷玩家是按下哪個鍵盤按鈕:
if event.key == pygame.K_ESCAPE:
如上表示判斷玩家按下Esc按鈕。
再來說說判斷滑鼠的輸入事件,使用以下方式判斷滑鼠游標是否正在移動中,然後用pygame.mouse.get_pos()[0]來取得滑鼠游標移動到的X軸位置數值,並將數值指定給板子,會-50主要是讓游標指定在板子中間。
if event.type == pygame.MOUSEMOTION:
paddle_x = pygame.mouse.get_pos()[0] - 50
使用以下方式來判斷玩家是否按下滑鼠按鍵,玩家按下滑鼠按鍵後會再判斷game_mode變數是否為 0(表示等待開球中),然後將其改變為1(表示開球並繼續進行遊戲)。
if event.type == pygame.MOUSEBUTTONDOWN:
if(game_mode == 0):
game_mode = 1
在球移動中,我們需要一直與畫面上的所有磚塊作碰撞判斷,運作方式如下:
# 利用迴圈取的畫面上的所有磚塊
for bricks in bricks_list:
# 判斷球是否到碰磚塊.
if(isCollision( ball.pos[0], ball.pos[1], bricks.rect)):
# 判斷磚塊是否為顯示中.
if(bricks.visivle):
在確定球碰到畫面上的磚塊後會處理以下幾件事:
# 1.扣除磚數量.
brick_num = brick_num -1
# 2.如果畫面上的磚塊數量已經為0就執行resetGame()函數(重新開始遊戲).
if(brick_num <= 0):
resetGame()
break
# 3.處理球反彈.
dy = -dy;
# 4.關閉碰撞到的磚塊.
bricks.visivle = False
# 碰撞判斷-球碰板子.
if(isCollision( ball.pos[0], ball.pos[1], paddle.rect)):
# 球反彈.
dy = -dy;
- 171~190:依照game_mode狀態進行邏輯處理
等待開球狀態(game_mode = 0),在這個狀態下只要讓球一直跟著板子移動就可以了,如下:
# 依照板子中心位置為參考來設定球位置
# 設定球x座標
ball.pos[0] = ball_x = paddle.rect[0] + ( (paddle.rect[2] —
ball.radius) >> 1 )
# 設定球y座標
ball.pos[1] = ball_y = paddle.rect[1] — ball.radius
遊戲進行中狀態(game_mode = 1),在這狀態下主要處理讓球持續移動如下:
ball_x += dx
ball_y += dy
然後判斷球是否掉落板子後(表示死亡),其判斷方式如下:
if(ball_y + dy > canvas_height — ball.radius):
上式(ball_y + dy)表示將球移動dy後在判斷是否超出視窗高邊界(canvas_height — ball.radius),其中canvas_height標示視窗高,ball.radius表示球半徑,讓視窗高減球半徑,主要是讓其以球中心為判斷點。
接下來就是判斷上下左右是否發生碰撞並讓球反彈,其方法為以球的中心點為主,然後判斷是否超出視窗的上下左右邊界就可達成,程式碼如下:
# 右牆或左牆碰撞.
if(ball_x + dx > canvas_width — ball.radius or ball_x + dx <
ball.radius):
dx = -dx
# 下牆或上牆碰撞
if(ball_y + dy > canvas_height — ball.radius or ball_y + dy <
ball.radius):
dy = -dy
執行遊戲 - 請在命令列下輸入python play.py 以執行遊戲
GitHub下載原始碼
後記
終於又完成一篇了,雖然還不是很滿意,也覺得很多地方表達還是有待加強,加上也還在調整文章的編寫風格,所以只好請大家免強看看,相信只要持續堅持下去會越來越好的,謝謝大家,砸們下次見囉。。。
版本更新 2020/4/19
更新灰階懷舊版本(已將相關檔案更新至GitHub)
請在命令列下輸入python play_gray_scale.py以執行遊戲
主要是將繪製磚塊的顏色改成灰階色。
關於全螢幕顯示
如果要改為全畫面顯示模式只要找到以下程式碼:
# 建立畫佈大小.
canvas = pygame.display.set_mode((canvas_width, canvas_height))
並改成以下即可:
# 建立畫佈大小.
canvas = pygame.display.set_mode((canvas_width, canvas_height),
pygame.DOUBLEBUF and pygame.FULLSCREEN )