在 Pygame 賽車遊戲開發中,實作車輛的移動和邊界控制是至關重要的。本文將逐步講解如何使用鍵盤控制主車的移動,並設定邊界限制,確保車輛在遊戲視窗內活動。此外,我們還會介紹如何使用 random 模組隨機生成敵方車輛的位置,提升遊戲的趣味性和挑戰性。透過這些技術,可以構建一個更具互動性和可玩性的賽車遊戲。後續還可以加入碰撞檢測、計分系統等功能,使遊戲更加完整。

遊戲開發:實作車輛移動控制

在前面的章節中,我們成功地在遊戲視窗中顯示了多輛車。然而,這些車輛只是靜態的圖片,無法進行任何互動。在本章節中,我們將學習如何透過鍵盤控制主車的移動。

理解座標系統

在Pygame中,遊戲視窗的座標系統是根據畫素的。視窗的左上角被定義為(0, 0),而X軸和Y軸分別向右和向下延伸。因此,要移動主車,我們需要改變其X和Y座標。

實作車輛移動

首先,我們需要初始化一些變數來控制主車的位置和移動。

maincarX = 350
maincarY = 495
maincarX_change = 0
maincarY_change = 0

接下來,我們需要在事件迴圈中監聽KEYDOWN事件,以檢測使用者是否按下了方向鍵。如果按下了方向鍵,我們需要更新maincarX_changemaincarY_change的值,以控制主車的移動方向和速度。

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RIGHT:
        maincarX_change += 5
    if event.key == pygame.K_LEFT:
        maincarX_change -= 5
    if event.key == pygame.K_UP:
        maincarY_change -= 5
    if event.key == pygame.K_DOWN:
        maincarY_change += 5

然後,我們需要在主迴圈中更新主車的位置。

maincarX += maincarX_change
maincarY += maincarY_change

內容解密:

  • maincarX_changemaincarY_change變數用於控制主車在X軸和Y軸上的移動速度。
  • 當按下方向鍵時,maincarX_changemaincarY_change的值會被更新,從而改變主車的移動方向和速度。
  • 在主迴圈中,maincarXmaincarY的值會根據maincarX_changemaincarY_change的值進行更新,從而實作主車的移動。

解決車輛持續移動的問題

然而,目前的程式碼存在一個問題:當按下方向鍵後,即使釋放了鍵盤,主車仍然會持續移動。這是因為我們只處理了KEYDOWN事件,而沒有處理KEYUP事件。

為瞭解決這個問題,我們需要在事件迴圈中監聽KEYUP事件,以檢測使用者是否釋放了方向鍵。如果釋放了方向鍵,我們需要重置maincarX_changemaincarY_change的值,以停止主車的移動。

if event.type == pygame.KEYUP:
    if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
        maincarX_change = 0
    if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
        maincarY_change = 0

內容解密:

  • 當釋放方向鍵時,maincarX_changemaincarY_change的值會被重置為0,從而停止主車的移動。
  • 這樣,主車只有在按下方向鍵時才會移動,釋放鍵盤後會停止移動。

結合所有程式碼

以下是完整的程式碼:

import pygame
pygame.init()

# 設定遊戲視窗
screen = pygame.display.set_mode((798, 600))

# 定義遊戲迴圈函式
def gameloop():
    # 設定背景圖片
    bg = pygame.image.load('car game/bg.png')
    
    # 設定主車圖片
    maincar = pygame.image.load('car game/car.png')
    maincarX = 350
    maincarY = 495
    maincarX_change = 0
    maincarY_change = 0
    
    # 其他車輛圖片
    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
            
            # 處理KEYDOWN事件
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    maincarX_change += 5
                if event.key == pygame.K_LEFT:
                    maincarX_change -= 5
                if event.key == pygame.K_UP:
                    maincarY_change -= 5
                if event.key == pygame.K_DOWN:
                    maincarY_change += 5
            
            # 處理KEYUP事件
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
                    maincarX_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    maincarY_change = 0
        
        # 更新主車位置
        maincarX += maincarX_change
        maincarY += maincarY_change
        
        # 繪製遊戲畫面
        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()

這樣,我們就成功地實作了主車的移動控制,並且解決了車輛持續移動的問題。接下來,我們可以繼續新增更多的功能,例如邊界檢測、碰撞檢測等,以使遊戲更加完善。

開發 PyGame 賽車遊戲:加入邊界與隨機敵方車輛

在前面的章節中,我們已經學會瞭如何使用 PyGame 建立一個基本的賽車遊戲,並實作了玩家控制的車輛移動。在本章節中,我們將進一步增強遊戲功能,加入邊界限制以防止車輛超出遊戲視窗,並實作敵方車輛的隨機出現。

設定遊戲邊界

首先,我們需要為遊戲加入邊界,以限制玩家控制的車輛只能在指定的區域內移動。這可以透過檢查車輛的位置並在超出邊界時進行調整來實作。

程式碼實作:

# 設定邊界限制
if maincarX < 178:
    maincarX = 178
if maincarX > 490:
    maincarX = 490
if maincarY < 0:
    maincarY = 0
if maincarY > 495:
    maincarY = 495

內容解密:

這段程式碼檢查 maincarXmaincarY 的值是否超出了預設的邊界。如果超出,則將其重置為邊界值,以確保車輛不會移動到遊戲視窗之外。

顯示隨機敵方車輛

接下來,我們將透過匯入 random 模組來實作敵方車輛的隨機出現。我們將使用這個模組來隨機生成敵方車輛的 X 軸位置,使其出現在遊戲區域內的任意位置。

程式碼實作:

import random

# 設定敵方車輛的初始位置
enemy_car_X = random.randint(178, 490)

內容解密:

這行程式碼使用 random.randint(178, 490) 生成一個介於 178 和 490 之間的隨機整數,代表敵方車輛的 X 軸位置。這個範圍是根據遊戲的邊界設定的,確保敵方車輛出現在可視的遊戲區域內。

結合邊界與隨機敵方車輛的遊戲實作

以下是結合了邊界限制和隨機敵方車輛的遊戲完整程式碼範例:

import pygame
import random

pygame.init()

# 初始化 PyGame
from pygame.locals import *

# 設定遊戲視窗大小
screen = pygame.display.set_mode((798, 600))

# 更改遊戲視窗標題
pygame.display.set_caption('Racing Beast')

# 載入並設定遊戲 logo
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
    maincarX_change = 0
    maincarY_change = 0
    
    # 載入敵方車輛圖片
    car1 = pygame.image.load('car game/car1.jpeg')
    car2 = pygame.image.load('car game/car2.png')
    car3 = pygame.image.load('car game/car3.png')
    
    # 設定敵方車輛的初始位置(隨機)
    enemy_car1_X = random.randint(178, 490)
    enemy_car2_X = random.randint(178, 490)
    enemy_car3_X = random.randint(178, 490)
    
    run = True
    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_RIGHT:
                    maincarX_change += 5
                if event.key == pygame.K_LEFT:
                    maincarX_change -= 5
                if event.key == pygame.K_UP:
                    maincarY_change -= 5
                if event.key == pygame.K_DOWN:
                    maincarY_change += 5
            
            # 檢查按鍵是否已釋放
            if event.type == pygame.KEYUP:
                if event.key in (pygame.K_RIGHT, pygame.K_LEFT, pygame.K_UP, pygame.K_DOWN):
                    maincarX_change = 0
                    maincarY_change = 0
        
        # 更新玩家車輛位置
        maincarX += maincarX_change
        maincarY += maincarY_change
        
        # 設定邊界限制
        if maincarX < 178:
            maincarX = 178
        if maincarX > 490:
            maincarX = 490
        if maincarY < 0:
            maincarY = 0
        if maincarY > 495:
            maincarY = 495
        
        # 清除螢幕並重新繪製背景和車輛
        screen.fill((0,0,0))
        screen.blit(bg, (0,0))
        screen.blit(maincar, (maincarX, maincarY))
        screen.blit(car1, (enemy_car1_X, 100))
        screen.blit(car2, (enemy_car2_X, 200))
        screen.blit(car3, (enemy_car3_X, 300))
        
        # 更新顯示內容
        pygame.display.update()

gameloop()

圖表翻譯:

此程式碼流程如下圖所示:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Pygame 賽車遊戲開發 車輛移動與邊界控制

package "圖論網路分析" {
    package "節點層" {
        component [節點 A] as nodeA
        component [節點 B] as nodeB
        component [節點 C] as nodeC
        component [節點 D] as nodeD
    }

    package "中心性指標" {
        component [度中心性
Degree Centrality] as degree
        component [特徵向量中心性
Eigenvector Centrality] as eigen
        component [介數中心性
Betweenness Centrality] as between
        component [接近中心性
Closeness Centrality] as close
    }
}

nodeA -- nodeB
nodeA -- nodeC
nodeB -- nodeD
nodeC -- nodeD

nodeA --> degree : 計算連接數
nodeA --> eigen : 計算影響力
nodeB --> between : 計算橋接度
nodeC --> close : 計算距離

note right of degree
  直接連接數量
  衡量局部影響力
end note

note right of eigen
  考慮鄰居重要性
  衡量全局影響力
end note

@enduml

圖表翻譯: 此圖示呈現了遊戲的執行流程,從初始化 PyGame、載入資源到進入主迴圈處理事件、更新遊戲狀態及繪製畫面,每一步驟均清晰標示於圖中。