返回文章列表

Python 蛇遊戲與車賽遊戲程式碼解析

本文解析 Python 蛇遊戲的核心程式碼,包含蛇的移動、碰撞偵測、遊戲結束條件等,並提供 Pygame 車賽遊戲的實作步驟,涵蓋遊戲視窗建立、資源載入、鍵盤控制等,適合遊戲開發入門學習。

遊戲開發 Python

Python 的 Pygame 函式庫提供簡潔易用的遊戲開發功能。本文首先分析了蛇遊戲程式碼中關於蛇身增長、碰撞偵測和遊戲結束條件的邏輯。接著,逐步講解如何使用 Pygame 建立車賽遊戲,包含遊戲視窗的初始化、背景和車輛圖片的載入,以及透過鍵盤控制車輛移動等核心步驟,適合初學者快速上手 Pygame 遊戲開發。

Python 蛇遊戲程式碼解析與實作

程式碼分析

以下為蛇遊戲的部分程式碼:

head = []
head.append(snake_x)
head.append(snake_y)
snk_list.append(head)
if len(snk_list) > snk_length:
    del snk_list[0]
if head in snk_list[:-1]:
    game_over = True
if snake_x < 0 or snake_x > screen_width - 20 or snake_y < 50 or snake_y > screen_height - 20:
    game_over = True
plot_snake(gameWindow, black, snk_list, snake_size)
pygame.display.update()
clock.tick(fps)
pygame.quit()
quit()
gameloop()

內容解密:

  1. 蛇頭位置更新:首先,建立一個名為 head 的列表,並將蛇的當前 x 和 y 座標 (snake_xsnake_y) 新增到其中。然後,將 head 新增到 snk_list 中,snk_list 用於儲存蛇的身體所有部分的座標。

  2. 控制蛇的長度:檢查 snk_list 的長度是否超過了設定的蛇長度 (snk_length)。如果是,則刪除 snk_list 中的第一個元素(即蛇尾),以保持蛇的長度不變。

  3. 遊戲結束條件 - 碰撞自身:檢查 head 是否已經存在於 snk_list 中(排除最後一個元素,即 head 本身)。如果存在,表示蛇頭碰撞到了自己的身體,將 game_over 設為 True

  4. 遊戲結束條件 - 碰撞邊界:檢查蛇頭的座標是否超出了遊戲視窗的邊界。如果蛇頭的 x 座標小於 0 或大於視窗寬度減去蛇的大小,或 y 座標小於 50(可能是頂部的某個邊界)或大於視窗高度減去蛇的大小,將 game_over 設為 True

  5. 更新遊戲畫面:呼叫 plot_snake 函式在遊戲視窗中繪製蛇,使用 snk_list 中的座標和指定的顏色 (black) 及大小 (snake_size)。然後,呼叫 pygame.display.update() 更新整個顯示視窗。

  6. 控制遊戲幀率:使用 clock.tick(fps) 控制遊戲的幀率,使遊戲以指定的幀率執行。

  7. 離開遊戲:如果遊戲結束,呼叫 pygame.quit()quit() 離開 Pygame 和 Python 程式。

  8. 重新開始遊戲:呼叫 gameloop() 函式重新開始遊戲迴圈。

Pygame 車賽遊戲介紹與實作步驟

1. 初始化與準備

在開始車賽遊戲的開發之前,確保已經安裝了 Python 和 Pygame。可以透過 pip 命令安裝 Pygame:

pip install pygame

2. 建立遊戲視窗

匯入 Pygame 模組並初始化:

import pygame
pygame.init()

建立一個遊戲視窗:

screen = pygame.display.set_mode((798, 600))

3. 設定遊戲引數

設定標題、幀率等遊戲引數:

pygame.display.set_caption('Car Race Game')
clock = pygame.time.Clock()
fps = 60

4. 載入資源

載入所需的影像和音效資源:

# 載入背景圖
background_image = pygame.image.load('background.png')

# 載入車輛圖
car_image = pygame.image.load('car.png')

5. 遊戲主迴圈

編寫遊戲主迴圈,處理事件、更新遊戲狀態和繪製遊戲畫面:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    # 更新遊戲狀態
    # ...

    # 繪製遊戲畫面
    screen.blit(background_image, (0, 0))
    screen.blit(car_image, (x, y))
    pygame.display.update()

    # 控制幀率
    clock.tick(fps)

建立遊戲視窗與基本事件處理

在前面的章節中,我們已經成功初始化了Pygame並建立了一個遊戲視窗。然而,當我們執行程式碼時,會發現視窗很快就會消失。為瞭解決這個問題,我們需要建立一個無限的遊戲迴圈,讓視窗持續顯示直到使用者關閉它。

建立無限遊戲迴圈

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

內容解密:

  • run = True:初始化一個布林變數run,用於控制遊戲迴圈的執行。
  • while run::當runTrue時,持續執行迴圈內的程式碼。
  • for event in pygame.event.get()::遍歷Pygame中發生的所有事件。
  • if event.type == pygame.QUIT::檢查是否發生了關閉視窗的事件(例如點選視窗的關閉按鈕)。
  • run = False:如果發生了關閉視窗的事件,將run設為False,以離開遊戲迴圈。

自訂遊戲視窗標題與圖示

在建立遊戲視窗的基礎上,我們可以進一步自訂視窗的標題和圖示。

更改遊戲視窗標題

pygame.display.set_caption('Racing Beast')

內容解密:

  • pygame.display.set_caption('Racing Beast'):將遊戲視窗的標題更改為「Racing Beast」。

更改遊戲視窗圖示

logo = pygame.image.load('car game/logo.jpeg')
pygame.display.set_icon(logo)

內容解密:

  • logo = pygame.image.load('car game/logo.jpeg'):載入指定路徑的圖片作為遊戲視窗的圖示。
  • pygame.display.set_icon(logo):將載入的圖片設定為遊戲視窗的圖示。

完整範例程式碼

import pygame
pygame.init() 
from pygame.locals import* 

screen = pygame.display.set_mode((798,600))
pygame.display.set_caption('Racing Beast')
logo = pygame.image.load('car game/logo.jpeg')
pygame.display.set_icon(logo)

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

內容解密:

這段程式碼綜合了初始化Pygame、建立遊戲視窗、自訂視窗標題和圖示,以及處理關閉視窗事件的功能。透過這個範例,我們可以建立一個基本的Pygame遊戲視窗,並對其進行簡單的自訂。

在Pygame中載入圖片與設定遊戲視窗

在開發遊戲時,載入圖片是基本且重要的步驟。Pygame提供了簡單的方法來載入和顯示圖片。首先,我們來看看如何載入圖片。

載入圖片

Pygame使用pygame.image.load()函式來載入圖片。這個函式需要一個引數,即圖片的路徑。

logo = pygame.image.load('car game/logo.jpeg')

內容解密:

  • pygame.image.load()是用於載入圖片的函式。
  • 'car game/logo.jpeg'是圖片的路徑。請確保路徑正確,否則Pygame會報錯。
  • 這個函式傳回一個Surface物件,可以用來顯示圖片。

設定遊戲視窗的標題和圖示

我們可以使用pygame.display.set_caption()來設定遊戲視窗的標題,使用pygame.display.set_icon()來設定視窗的圖示。

pygame.display.set_caption('Racing Beast')
pygame.display.set_icon(logo)

內容解密:

  • pygame.display.set_caption()用於設定視窗的標題。
  • pygame.display.set_icon()用於設定視窗的圖示,需要一個Surface物件作為引數。

改變遊戲視窗的背景顏色

預設情況下,Pygame視窗的背景顏色是黑色。我們可以使用screen.fill()函式來改變背景顏色。

screen.fill((255,0,0))  # 將背景顏色設為紅色

內容解密:

  • screen.fill()用於填充視窗的背景顏色。
  • (255,0,0)是紅色的RGB值。

更新顯示

在Pygame中,改變視窗內容後,需要使用pygame.display.update()來更新顯示,否則更改不會生效。

pygame.display.update()

內容解密:

  • pygame.display.update()用於更新整個視窗的顯示內容。

新增圖片到Pygame

除了背景顏色,我們還可以新增圖片到遊戲視窗中。使用blit()函式可以在指定位置繪製圖片。

screen.blit(image, (x, y))  # 在(x, y)位置繪製圖片

內容解密:

  • screen.blit()用於在視窗中繪製圖片。
  • (x, y)是圖片左上角在視窗中的座標。

理解座標系統

Pygame的座標系統與常見的笛卡爾座標系統類別似,但Y軸的方向是向下的。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 理解座標系統

rectangle "X軸" as node1
rectangle "Y軸" as node2

node1 --> node2

@enduml

圖表翻譯: 此圖表示Pygame視窗的座標系統,左上角為原點(0,0),X軸向右延伸,Y軸向下延伸。

在這個座標系統中:

  • X座標從左到右增加。
  • Y座標從上到下增加。

瞭解這個座標系統對於在正確的位置繪製圖片和處理遊戲邏輯非常重要。

綜合範例

下面是一個綜合範例,展示瞭如何載入圖片、設定視窗標題和圖示、改變背景顏色以及更新顯示。

import pygame
pygame.init() 
from pygame.locals import* 
screen = pygame.display.set_mode((798,600))
pygame.display.set_caption('Racing Beast')
logo = pygame.image.load('car game/logo.jpeg')
pygame.display.set_icon(logo)
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    screen.fill((0,0,0))  # 黑色背景
    pygame.display.update()

內容解密:

  • 程式初始化Pygame並設定一個遊戲視窗。
  • 載入一個圖片作為視窗圖示並設定視窗標題。
  • 在主迴圈中,不斷更新視窗顯示並檢查離開事件。
  • 使用screen.fill((0,0,0))將背景設為黑色。

這個範例展示了Pygame的基本用法,包括視窗設定、事件處理和顯示更新。透過這些基礎,可以進一步開發更複雜的遊戲功能。

在Pygame中實作遊戲物件的移動與控制

在前面的章節中,我們已經成功地在遊戲視窗中顯示了背景圖片和遊戲中的車輛。現在,我們將進一步探討如何利用鍵盤輸入來控制遊戲中的主要車輛。

理解座標系統

在Pygame中,遊戲的視窗是一個二維的座標系統,原點(0,0)位於視窗的左上角。X軸代表水平方向,Y軸代表垂直方向。要移動遊戲中的物件,我們需要改變其在X軸或Y軸上的座標值。

載入圖片與初始化變數

首先,我們載入所需的圖片並初始化相關變數。這包括背景圖片、主要車輛圖片和其他車輛圖片。同時,我們定義了主要車輛的初始座標(maincarX, maincarY)。

import pygame
pygame.init() 
from pygame.locals import* 
screen = pygame.display.set_mode((798,600))

pygame.display.set_caption('Racing Beast')

logo = pygame.image.load('car game/logo.jpeg')
pygame.display.set_icon(logo)

def gameloop():
    bg = pygame.image.load('car game/bg.png')
    maincar = pygame.image.load('car game/car.png')
    maincarX = 350
    maincarY = 495
    
    car1 = pygame.image.load('car game/car1.jpeg')
    car2 = pygame.image.load('car game/car2.png')
    car3 = pygame.image.load('car game/car3.png')
    
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

內容解密:

  1. 載入Pygame模組:首先匯入Pygame模組並初始化。
  2. 設定遊戲視窗:建立一個大小為798x600的遊戲視窗。
  3. 載入圖片資源:載入遊戲所需的背景圖片、主要車輛和其他車輛的圖片。
  4. 初始化變數:定義主要車輛的初始座標。

處理鍵盤事件

接下來,我們需要在遊戲迴圈中處理鍵盤事件,以實作對主要車輛的控制。當按下方向鍵時,我們需要改變主要車輛的座標。

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                maincarX -= 5
            if event.key == pygame.K_RIGHT:
                maincarX += 5
            if event.key == pygame.K_UP:
                maincarY -= 5
            if event.key == pygame.K_DOWN:
                maincarY += 5

內容解密:

  1. 監聽鍵盤事件:檢查是否有KEYDOWN事件發生,即是否有鍵被按下。
  2. 根據按鍵調整座標:根據按下的方向鍵,調整主要車輛的X或Y座標。

更新遊戲畫面

最後,我們需要在每次迴圈迭代時更新遊戲畫面,包括重繪背景、主要車輛和其他車輛。

screen.fill((0,0,0))
screen.blit(bg,(0,0))
screen.blit(maincar,(maincarX,maincarY))
screen.blit(car1,(200,100))
screen.blit(car2,(300,100))
screen.blit(car3,(400,100))
pygame.display.update()
gameloop()

內容解密:

  1. 清除畫面:用黑色填充整個視窗,以清除上一幀的內容。
  2. 繪製背景和車輛:將背景圖片和所有車輛圖片繪製到視窗上,根據最新的座標值更新主要車輛的位置。
  3. 更新顯示:呼叫pygame.display.update()來使更改生效,顯示最新的遊戲畫面。