引言:重溫經典游戲開發
飛機大戰作為經典的 2D 射擊游戲,承載了許多人的童年回憶。使用 Python 和 Pygame 開發這樣一款游戲不僅能重溫經典,更是學習游戲開發絕佳的實踐項目。本文將帶你從零開始,一步步實現一個完整的飛機大戰游戲,涵蓋游戲設計、代碼實現和性能優化等關鍵環節。
游戲核心功能與設計
我們的 Python 飛機大戰包含以下核心功能:
- 玩家系統:
-
- 三角形飛機角色,支持八方向移動
-
- 生命值系統和三條生命機制
-
- 無敵狀態(受傷后短暫閃爍)
-
- 子彈發射冷卻時間控制
- 敵機系統:
-
- 隨機生成不同大小、速度和顏色的敵機
-
- 敵機從屏幕頂部向下飛行
-
- 碰撞檢測系統
- 游戲機制:
-
- 分數系統(擊落敵機得分)
-
- 生命值顯示和血條
-
- 暫停 / 繼續功能
-
- 游戲結束和重新開始
- 視覺效果:
-
- 動態星空背景
-
- 爆炸粒子效果
-
- UI 界面和狀態提示
游戲代碼結構解析
1. 游戲初始化與設置
import pygameimport randomimport sysfrom pygame.locals import *# 初始化pygamepygame.init()# 游戲窗口設置SCREEN_WIDTH = 800SCREEN_HEIGHT = 600screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("Python飛機大戰")# 顏色定義BACKGROUND = (5, 5, 25)PLAYER_COLOR = (0, 200, 255)ENEMY_COLOR = (255, 50, 50)BULLET_COLOR = (255, 255, 0)
2. 玩家飛機類實現
class Player:def __init__(self):self.width = 50self.height = 40self.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT - 100self.speed = 5self.health = 100self.shoot_cooldown = 0self.score = 0self.lives = 3self.invincible = 0 # 無敵時間def draw(self):# 繪制飛機主體pygame.draw.polygon(screen, PLAYER_COLOR, [(self.x, self.y - self.height//2),(self.x - self.width//2, self.y + self.height//2),(self.x + self.width//2, self.y + self.height//2)])# 繪制飛機細節pygame.draw.circle(screen, (200, 230, 255), (self.x, self.y), 10)def move(self, dx, dy):# 邊界檢查new_x = self.x + dx * self.speednew_y = self.y + dy * self.speedif 0 < new_x < SCREEN_WIDTH:self.x = new_xif 0 < new_y < SCREEN_HEIGHT:self.y = new_ydef shoot(self):if self.shoot_cooldown == 0:bullets.append(Bullet(self.x, self.y - self.height//2, -10))self.shoot_cooldown = 10
3. 敵機與子彈系統
class Enemy:def __init__(self):self.width = random.randint(30, 50)self.height = random.randint(30, 50)self.x = random.randint(self.width//2, SCREEN_WIDTH - self.width//2)self.y = -self.heightself.speed = random.uniform(1.5, 3.5)self.color = (random.randint(200, 255), random.randint(50, 100), 50)def update(self):self.y += self.speedreturn self.y > SCREEN_HEIGHT + self.heightclass Bullet:def __init__(self, x, y, speed):self.x = xself.y = yself.speed = speedself.size = 5def update(self):self.y += self.speedreturn self.y < 0 or self.y > SCREEN_HEIGHT
4. 碰撞檢測系統
# 子彈與敵機碰撞for bullet in bullets[:]:for enemy in enemies[:]:if (abs(enemy.x - bullet.x) < (enemy.width + bullet.size)/2 andabs(enemy.y - bullet.y) < (enemy.height + bullet.size)/2):explosions.append(Explosion(enemy.x, enemy.y))player.score += 10enemies.remove(enemy)bullets.remove(bullet)break# 玩家與敵機碰撞for enemy in enemies[:]:if (abs(player.x - enemy.x) < (player.width/2 + enemy.width/2) andabs(player.y - enemy.y) < (player.height/2 + enemy.height/2)):if player.take_damage(20):explosions.append(Explosion(player.x, player.y))enemies.remove(enemy)
5. 游戲主循環
clock = pygame.time.Clock()while True:# 事件處理for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()# 鍵盤控制處理if event.type == KEYDOWN:if event.key == K_ESCAPE: sys.exit()if event.key == K_p: game_paused = not game_pausedif game_over and event.key == K_r: reset_game()# 玩家控制keys = pygame.key.get_pressed()dx, dy = 0, 0if keys[K_LEFT] or keys[K_a]: dx = -1if keys[K_RIGHT] or keys[K_d]: dx = 1if keys[K_UP] or keys[K_w]: dy = -1if keys[K_DOWN] or keys[K_s]: dy = 1player.move(dx, dy)if keys[K_SPACE]: player.shoot()# 更新游戲狀態player.update()update_enemies()update_bullets()update_explosions()# 繪制游戲畫面screen.fill(BACKGROUND)draw_stars()draw_player()draw_enemies()draw_bullets()draw_explosions()draw_ui()pygame.display.flip()clock.tick(60) # 60 FPS
關鍵技術點解析
1. 游戲狀態管理
通過game_over和game_paused變量管理游戲狀態:
if game_over:# 顯示游戲結束界面title = font.render("游戲結束", True, (255, 50, 50))screen.blit(title, (SCREEN_WIDTH//2 - title.get_width()//2, SCREEN_HEIGHT//2 - 100))elif game_paused:# 顯示暫停界面title = font.render("游戲暫停", True, UI_COLOR)screen.blit(title, (SCREEN_WIDTH//2 - title.get_width()//2, SCREEN_HEIGHT//2 - 50))else:# 正常游戲邏輯
2. 粒子效果實現
爆炸效果使用簡單的圓形擴散:
class Explosion:def __init__(self, x, y):self.x = xself.y = yself.radius = 5self.max_radius = 30self.growth_rate = 1.5def draw(self):pygame.draw.circle(screen, random.choice(EXPLOSION_COLORS),(self.x, self.y), self.radius)def update(self):self.radius += self.growth_ratereturn self.radius > self.max_radius
3. 性能優化技巧
- 對象池管理:復用子彈和敵機對象而非頻繁創建銷毀
- 碰撞檢測優化:使用簡單的矩形碰撞而非精確像素檢測
- 批量繪制:將相似對象分組繪制
- 狀態管理:避免在循環中執行昂貴操作
運行與安裝指南
- 安裝依賴:
pip install pygame
- 運行游戲:
python plane_game.py
- 游戲控制:
-
- 方向鍵 / WASD:移動飛機
-
- 空格鍵:發射子彈
-
- P 鍵:暫停 / 繼續游戲
-
- R 鍵:游戲結束后重新開始
-
- ESC 鍵:退出游戲
-
-效果圖:
游戲擴展與改進建議
- 內容擴展:
-
- 添加不同類型的敵機(BOSS、小型戰機等)
-
- 實現武器升級系統(激光、導彈、散彈等)
-
- 設計多個游戲關卡,難度遞增
- 功能增強:
-
- 添加音效和背景音樂
-
- 實現高分榜系統(本地存儲或在線)
-
- 添加道具系統(護盾、生命恢復、武器升級)
- 視覺效果提升:
-
- 使用精靈圖替代簡單幾何圖形
-
- 添加更復雜的粒子效果
-
- 實現鏡頭抖動等特效
- 游戲機制優化:
-
- 添加連擊系統(combo)
-
- 實現特殊技能系統
-
- 添加成就系統
結語:Python 游戲開發之旅
通過這個飛機大戰項目,我們不僅實現了一個完整的游戲,還掌握了 Python 游戲開發的核心技能:
- Pygame 框架的基本使用
- 游戲循環和狀態管理
- 碰撞檢測算法
- 游戲對象管理和優化
- 用戶輸入處理
- 簡單的粒子效果實現
Python 作為一門易學易用的語言,非常適合游戲開發入門。通過這個項目,你可以繼續探索更復雜的游戲開發領域,如物理引擎集成、AI 敵人行為、網絡多人游戲等。
完整代碼已放在 GitHub 上:Python 飛機大戰項目倉庫https://github.com/yourusername/plane-battle
希望這篇文章能激發你對游戲開發的興趣!如果你有任何問題或改進建議,歡迎在評論區留言討論。