返回文章列表

Pygame遊戲控制邏輯與邊界設定最佳化

本文探討如何最佳化 Pygame 遊戲中的車輛控制邏輯和邊界設定,並加入隨機敵方車輛和無限移動機制,提升遊戲的動態性和挑戰性。文章解析了程式碼的關鍵部分,並使用 Plantuml 圖表說明瞭遊戲控制流程和敵方車輛無限移動的邏輯。此外,還提供了 Pygame

遊戲開發 Python

在 Pygame 遊戲開發中,精確的車輛控制和邊界檢測至關重要。本文的程式碼範例展示瞭如何利用 pygame.KEYDOWNpygame.KEYUP 事件處理鍵盤輸入,實作流暢的車輛移動控制。同時,程式碼中加入了邊界檢測機制,防止車輛超出遊戲視窗,並使用 random 模組隨機生成敵方車輛的位置,增加了遊戲的趣味性。此外,敵方車輛的無限移動是透過重置 Y 座標和隨機生成 X 座標實作的,確保遊戲的連續性和挑戰性。程式碼的最佳化重點在於簡化事件處理邏輯,提升程式碼的可讀性和效率。

最佳化Pygame遊戲控制邏輯與邊界設定

在Pygame開發的遊戲中,主車輛的控制邏輯需要進一步最佳化,以確保玩家能夠精確控制車輛的移動。同時,邊界檢測機制也至關重要,以防止車輛移出遊戲視窗。

程式碼解析

以下程式碼展示瞭如何最佳化Pygame遊戲中的控制邏輯,並加入邊界檢測機制:

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
    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
                
            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
        
        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))
        
        maincarX += maincarX_change
        maincarY += maincarY_change
        
        # 邊界檢測
        if maincarX < 0:
            maincarX = 0
        elif maincarX > 798 - maincar.get_width():
            maincarX = 798 - maincar.get_width()
            
        if maincarY < 0:
            maincarY = 0
        elif maincarY > 600 - maincar.get_height():
            maincarY = 600 - maincar.get_height()
        
        pygame.display.update()

gameloop()

內容解密:

  1. 事件處理:程式碼中透過pygame.KEYDOWNpygame.KEYUP事件來控制主車輛的移動。當按下方向鍵時,車輛會朝相應方向移動;當鬆開鍵盤時,車輛停止移動。
  2. 邊界檢測:新增了邊界檢測機制,確保主車輛不會移出遊戲視窗。當車輛的座標超出視窗範圍時,會被強制設定在邊界上。
  3. 程式碼最佳化:簡化了pygame.KEYUP事件的處理邏輯,將四個方向鍵的鬆開事件合併處理,使程式碼更加簡潔易讀。

Plantuml 圖表說明

以下Plantuml圖表展示了遊戲控制邏輯的流程:

圖表翻譯: 此圖表呈現了遊戲的控制流程。首先進行事件偵測,根據不同的事件型別(如結束遊戲、按鍵按下或鬆開)執行相應的操作。按下方向鍵時更新車輛的移動狀態,鬆開鍵盤時重置移動狀態。隨後更新車輛的位置並進行邊界檢測,最後更新遊戲畫面並回到事件偵測階段。

為賽車遊戲新增邊界與隨機敵方車輛

在前面的章節中,我們已經瞭解了遊戲的移動機制。現在,我們將為遊戲新增邊界,並在遊戲中隨機顯示敵方車輛。

新增邊界

首先,我們需要為遊戲中的主車設定一個邊界,以確保它不會超出遊戲視窗的範圍。我們透過檢查主車的X和Y座標是否超出預設的邊界值來實作這一點。

程式碼範例:

# 設定主車的邊界
if maincarX < 178:
    maincarX = 178
if maincarX > 490:
    maincarX = 490
if maincarY < 0:
    maincarY = 0
if maincarY > 495:
    maincarY = 495

內容解密:

這段程式碼檢查主車的X和Y座標是否超出邊界。如果超出,則將座標重置為邊界值,以防止主車移動到遊戲視窗之外。

隨機顯示敵方車輛

接下來,我們將使用Python的random模組來隨機生成敵方車輛的X座標,使其出現在遊戲視窗的不同位置。

程式碼範例:

import random

# 設定敵方車輛的初始位置
car1X = random.randint(178, 490)
car1Y = 100
car2X = random.randint(178, 490)
car2Y = 100
car3X = random.randint(178, 490)
car3Y = 100

內容解密:

這段程式碼使用random.randint(a, b)函式生成一個介於a和b之間的隨機整數,來設定敵方車輛的X座標。這樣,每次執行遊戲時,敵方車輛都會出現在不同的位置。

結合邊界與隨機敵方車輛的遊戲程式碼

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

import pygame
import random

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')
    car1X = random.randint(178, 490)
    car1Y = 100
    car2 = pygame.image.load('car game/car2.png')
    car2X = random.randint(178, 490)
    car2Y = 100
    car3 = pygame.image.load('car game/car3.png')
    car3X = random.randint(178, 490)
    car3Y = 100
    
    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 == 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
        
        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, (car1X, car1Y))
        screen.blit(car2, (car2X, car2Y))
        screen.blit(car3, (car3X, car3Y))
        
        pygame.display.update()

gameloop()

圖表翻譯:

此範例展示了一個簡單的賽車遊戲實作,包括了主車的移動、邊界檢查以及敵方車輛的隨機生成。透過結合Pygame函式庫和Python的random模組,我們能夠創造出一個更具動態和挑戰性的遊戲環境。

敵方車輛的無限移動實作

在賽車遊戲中,敵方車輛的無限移動是遊戲連續性的關鍵。本文將探討如何使用Pygame實作敵方車輛的無限移動。

程式碼解析

# 敵方車輛的移動
car1Y += 10
car2Y += 10
car3Y += 10

# 無限移動敵方車輛
if car1Y > 670:
    car1Y = -100
    car1X = random.randint(178,490)  # 重置X座標以增加隨機性
if car2Y > 670:
    car2Y = -100
    car2X = random.randint(178,490)  # 重置X座標以增加隨機性
if car3Y > 670:
    car3Y = -100
    car3X = random.randint(178,490)  # 重置X座標以增加隨機性

內容解密:

  1. car1Y += 10:使敵方車輛沿Y軸向下移動,模擬車輛的前進。
  2. if car1Y > 670:檢查車輛是否已經超出螢幕範圍(假設螢幕高度為600,加上車輛高度約70)。
  3. car1Y = -100:將車輛重置到螢幕上方以外的位置,使其重新出現在螢幕上,營造無限移動的效果。
  4. car1X = random.randint(178,490):在重置Y座標的同時,隨機生成新的X座標,使敵方車輛在每次重新出現時具有不同的橫向位置,增加遊戲的隨機性和挑戰性。

圖表說明

@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

圖表翻譯: 此圖示呈現了敵方車輛無限移動的邏輯流程。首先更新車輛的Y座標,接著檢查是否超出螢幕範圍。如果超出,則重置Y座標並隨機生成新的X座標;如果未超出,則繼續移動。如此迴圈,實作無限移動的效果。

重點分析

  • 無限移動的實作:透過檢查敵方車輛的Y座標是否超出螢幕範圍,並在超出時重置其位置到螢幕上方以外,同時隨機生成新的X座標,實作了敵方車輛的無限移動。
  • 隨機性的引入:透過在重置敵方車輛位置時隨機生成新的X座標,增加了遊戲的隨機性和挑戰性。
  • 遊戲體驗的提升:這種無限移動的設計使得遊戲能夠持續進行,提升了玩家的遊戲體驗。

PyGame 遊戲開發基礎與實戰

遊戲敵人無限移動的實作

在遊戲開發中,我們經常需要讓敵人角色無限移動,以創造連續的遊戲體驗。以下程式碼展示瞭如何使用 PyGame 實作敵人角色的無限移動。

程式碼修改前後對比

修改前的程式碼:

car2Y = -150
if car3Y > 670:
    car3Y = -200
pygame.display.update()
gameloop()

修改後的程式碼:

# moving enemies infinitely
if car1Y > 670:
    car1Y = -100
if car2Y > 670:
    car2Y = -150
if car3Y > 670:
    car3Y = -200

程式碼解說

在修改後的程式碼中,我們檢查每個敵人角色(car1car2car3)的 Y 軸座標。如果某個角色的 Y 軸座標大於 670,表示該角色已經移出遊戲視窗的底部,我們就將其 Y 軸座標重置為負值(-100、-150、-200),使它重新出現在視窗頂部。

為什麼選擇 670?

我們選擇 670 作為判斷依據,是因為我們的遊戲視窗高度為 600。選擇一個稍大於視窗高度的值,可以確保角色完全移出視窗後再重置其位置。

PyGame 基礎教學

PyGame 是一個用於開發遊戲和多媒體應用程式的 Python 模組集合。它提供了豐富的功能,如繪製影像、播放音效、處理滑鼠輸入等。

安裝 PyGame

要安裝 PyGame,可以使用 pip:

pip install pygame

初始化 PyGame

要使用 PyGame,首先需要初始化它:

import pygame
pygame.init()

建立遊戲視窗

要建立一個遊戲視窗,可以使用 pygame.display.set_mode()

window_width = 800
window_height = 600
pygame.display.set_mode((window_width, window_height))

設定視窗標題

可以使用 pygame.display.set_caption() 設定視窗標題:

pygame.display.set_caption('我的遊戲')

載入影像

可以使用 pygame.image.load() 載入影像:

image = pygame.image.load('image.png')

處理鍵盤輸入

PyGame 提供了 pygame.event() 來處理事件,如鍵盤輸入。可以使用 pygame.KEYDOWNpygame.KEYUP 事件來檢測鍵盤按鍵。