本教程以“人马大战”为例,手把手教你用Python从零开发回合制战斗游戏,涵盖基础语法、角色属性设计、战斗逻辑实现、回合制机制构建等核心模块,通过实战项目逐步引导读者掌握Python编程与游戏开发基础,适合零基础新手,助你快速上手,打造属于自己的简单回合制游戏。
你是一名手持长剑的骑士,面对半人马部落的咆哮,在荒原上展开一场惊心动魄的回合制战斗,每一次攻击、每一次防御,都决定着胜负的走向,我们就用Python和Pygame库,一步步实现这个“人马大战”小游戏,让你从零开始体验游戏开发的乐趣!
准备工作:环境与工具安装
在开始编码前,我们需要安装Python和Pygame库,Pygame是Python中专门用于游戏开发的库,能帮我们轻松处理图形、声音和用户输入。
安装Python
前往Python官网(python.org)下载最新版Python(建议3.8以上版本),安装时勾选“Add Python to PATH”。
安装Pygame
打开命令行工具(Windows的CMD或PowerShell,macOS的Terminal),输入以下命令:
pip install pygame
安装完成后,输入python -c "import pygame; print(pygame.version)",若显示版本号则安装成功。
游戏设计思路:核心玩法与角色设定
“人马大战”是一款回合制战斗游戏,玩家控制骑士与半人马对战,通过攻击、防御等操作击败敌人,以下是核心设计:
角色设定
- 玩家(骑士):生命值100,攻击力15-25,防御力5-10,可执行“攻击”“防御”“使用药水”操作。
- 敌人(半人马):生命值80,攻击力10-20,防御力3-8,随机执行“攻击”“防御”操作。
战斗流程
- 玩家选择行动(攻击/防御/用药水)。
- 敌人随机选择行动。
- 计算双方伤害并更新生命值。
- 判断胜负:玩家或敌人生命值≤0时游戏结束。
界面元素
- 显示双方生命值、攻击力、防御力。
- 行动按钮(攻击、防御、药水)。
- 战斗日志(显示行动结果)。
核心代码实现:从角色到战斗逻辑
我们分模块实现游戏功能,确保代码清晰易懂。
初始化Pygame与游戏窗口
首先创建游戏主窗口,设置标题和尺寸:
import pygame
import random
import sys
# 初始化Pygame
pygame.init()
# 设置窗口
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("人马大战 - 回合制战斗游戏")
# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
GRAY = (128, 128, 128)
# 字体设置
font = pygame.font.Font(None, 36)
small_font = pygame.font.Font(None, 24)
创建角色类
定义Character类,封装角色的属性和方法:
class Character:
def __init__(self, name, hp, attack_min, attack_max, defense_min, defense_max):
self.name = name
self.max_hp = hp
self.hp = hp
self.attack_min = attack_min
self.attack_max = attack_max
self.defense_min = defense_min
self.defense_max = defense_max
self.is_defending = False # 是否处于防御状态
def attack(self, target):
"""攻击目标"""
damage = random.randint(self.attack_min, self.attack_max)
if target.is_defending:
damage = max(1, damage - random.randint(target.defense_min, target.defense_max) // 2)
target.is_defending = False # 重置防御状态
else:
damage = max(1, damage - random.randint(target.defense_min, target.defense_max))
target.hp -= damage
target.hp = max(0, target.hp) # 确保生命值不低于0
return damage
def defend(self):
"""防御"""
self.is_defending = True
return f"{self.name}进入防御状态!"
def use_potion(self):
"""使用药水恢复生命值"""
heal_amount = random.randint(20, 30)
self.hp = min(self.max_hp, self.hp + heal_amount)
return f"{self.name}使用药水,恢复了{heal_amount}点生命值!"
创建游戏主类
Game类负责管理游戏状态、事件处理和界面绘制:

class Game:
def __init__(self):
self.player = Character("骑士", 100, 15, 25, 5, 10)
self.enemy = Character("半人马", 80, 10, 20, 3, 8)
self.battle_log = []
self.player_turn = True
self.game_over = False
self.winner = None
# 按钮设置
self.attack_button = pygame.Rect(50, 450, 150, 50)
self.defend_button = pygame.Rect(220, 450, 150, 50)
self.potion_button = pygame.Rect(390, 450, 150, 50)
self.restart_button = pygame.Rect(300, 500, 200, 50)
def handle_events(self):
"""处理事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN and not self.game_over:
if self.player_turn:
mouse_pos = pygame.mouse.get_pos()
if self.attack_button.collidepoint(mouse_pos):
self.player_action("attack")
elif self.defend_button.collidepoint(mouse_pos):
self.player_action("def