# 怎么用Python代碼實現簡單飛機大戰游戲
## 一、前言
飛機大戰是經典的2D射擊游戲,本文將使用Python的Pygame庫從零開始實現一個基礎版本。通過這個項目,你將學習到:
- Pygame基礎模塊的使用
- 游戲循環與事件處理
- 碰撞檢測實現
- 面向對象的游戲設計思想
- 簡單的游戲狀態管理
## 二、開發環境準備
### 1. 安裝Python
推薦使用Python 3.8+版本,可從官網下載安裝:
```python
https://www.python.org/downloads/
pip install pygame
/plane_game
├── main.py # 主程序入口
├── settings.py # 游戲配置
├── sprites.py # 精靈類定義
└── assets/ # 資源文件夾
├── images/ # 圖片資源
└── sounds/ # 音效資源
import pygame
from settings import *
from sprites import Player, Enemy, Bullet
class PlaneGame:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("飛機大戰")
self.clock = pygame.time.Clock()
self.running = True
self.score = 0
# 創建精靈組
self.all_sprites = pygame.sprite.Group()
self.enemies = pygame.sprite.Group()
self.bullets = pygame.sprite.Group()
# 創建玩家飛機
self.player = Player()
self.all_sprites.add(self.player)
# 敵機生成定時器
self.enemy_spawn_timer = 0
def new_game(self):
# 重置游戲狀態
self.score = 0
self.all_sprites.empty()
self.enemies.empty()
self.bullets.empty()
self.player = Player()
self.all_sprites.add(self.player)
def run(self):
while self.running:
self.clock.tick(FPS)
self.events()
self.update()
self.draw()
def events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.player.shoot(self.all_sprites, self.bullets)
def update(self):
# 更新所有精靈
self.all_sprites.update()
# 生成敵機
now = pygame.time.get_ticks()
if now - self.enemy_spawn_timer > ENEMY_SPAWN_RATE:
self.spawn_enemy()
self.enemy_spawn_timer = now
# 碰撞檢測:子彈 vs 敵機
hits = pygame.sprite.groupcollide(self.enemies, self.bullets, True, True)
for hit in hits:
self.score += 10
# 碰撞檢測:玩家 vs 敵機
hits = pygame.sprite.spritecollide(self.player, self.enemies, False)
if hits:
self.game_over()
def draw(self):
self.screen.fill(BLACK)
self.all_sprites.draw(self.screen)
# 顯示分數
font = pygame.font.SysFont(None, 36)
score_text = font.render(f'Score: {self.score}', True, WHITE)
self.screen.blit(score_text, (10, 10))
pygame.display.flip()
import pygame
import random
from settings import *
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((50, 40))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.centerx = SCREEN_WIDTH // 2
self.rect.bottom = SCREEN_HEIGHT - 10
self.speed_x = 0
def update(self):
# 鍵盤控制
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.speed_x = -5
elif keys[pygame.K_RIGHT]:
self.speed_x = 5
else:
self.speed_x = 0
self.rect.x += self.speed_x
# 邊界檢查
if self.rect.right > SCREEN_WIDTH:
self.rect.right = SCREEN_WIDTH
if self.rect.left < 0:
self.rect.left = 0
def shoot(self, all_sprites, bullets):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
def update(self):
self.rect.y += self.speedy
if self.rect.top > SCREEN_HEIGHT:
self.rect.x = random.randrange(SCREEN_WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 5)
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((5, 10))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.centerx = x
self.rect.bottom = y
self.speedy = -10
def update(self):
self.rect.y += self.speedy
if self.rect.bottom < 0:
self.kill()
# 屏幕設置
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 600
FPS = 60
# 顏色定義
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
# 游戲參數
ENEMY_SPAWN_RATE = 500 # 敵機生成間隔(ms)
PLAYER_SPEED = 5
替換簡單的幾何圖形為精美素材:
# 在Player類中替換
self.image = pygame.image.load('assets/images/player.png').convert()
self.image.set_colorkey(BLACK) # 去除背景色
# 在游戲初始化時加載
self.shoot_sound = pygame.mixer.Sound('assets/sounds/shoot.wav')
# 在射擊方法中播放
def shoot(self):
bullet = Bullet(...)
self.shoot_sound.play()
class Explosion(pygame.sprite.Sprite):
def __init__(self, center):
super().__init__()
self.images = []
for i in range(9):
img = pygame.image.load(f'assets/images/explosion/{i}.png')
self.images.append(img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = center
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50 # 幀間隔(ms)
def show_menu(self):
menu = True
while menu:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
return
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
menu = False
self.screen.fill(BLACK)
# 繪制菜單文本...
pygame.display.flip()
self.clock.tick(FPS)
if __name__ == "__main__":
game = PlaneGame()
game.show_menu() # 可選
game.new_game()
game.run()
pygame.quit()
通過這個項目我們實現了: 1. 使用Pygame創建游戲窗口 2. 通過精靈類管理游戲對象 3. 實現鍵盤控制與碰撞檢測 4. 構建基本的游戲循環架構
完整項目代碼可在GitHub獲?。?/p>
https://github.com/yourname/plane_game
下一步改進方向: - 添加關卡系統 - 實現敵機多種移動模式 - 加入道具系統 - 優化性能(使用精靈表等) - 添加移動端支持(通過Kivy等框架) “`
注:本文代碼經過簡化,實際開發中建議: 1. 添加異常處理 2. 使用配置文件管理參數 3. 實現資源預加載 4. 添加詳細的注釋和文檔
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。