ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python入门实战:教你写一个人狗大作战回合制小游戏

Python入门实战:教你写一个人狗大作战回合制小游戏 如果一个小游戏能让人对 Python 的兴趣直接拉满那它一定同时做到了三件事能运行、能看懂、能改着玩。很多初学 Python 的人都会卡在同一步语法看了两三遍书上例题也做完了但一到自己写程序就不知道从哪下手。如果你也处在这样的阶段本文要拆解的「人狗大作战」小游戏会是一个很好的突破口。它不需要图形界面不需要安装庞大的第三方框架只用 Python 自带的语法和标准库就能写出一款完整的回合制战斗游戏。这篇教程会从零开始完整走一遍环境安装、游戏设计、代码实现、运行验证、打包 exe 的流程。最终你拿到的不只是一段能跑的代码而是把 Python 入门阶段的核心语法全部串起来的一次项目实践。全文代码均可直接复制运行建议一边读一边在本地敲一遍。1. 为什么推荐用游戏项目来入门 Python1.1 游戏项目能覆盖完整的语法链很多人学 Python 会遇到一个典型困境语法书看懂了合上书却写不出东西。原因很简单知识点是零散的缺少一个能把它们串起来的实际场景。游戏项目恰好是最合适的场景之一。它不涉及复杂的业务逻辑却能逼着你把变量、类型、条件判断、循环、函数、类、模块导入全部用起来。以「人狗大作战」为例虽然它只是一个运行在命令行里的小游戏但天然包含这些编程要素编程要素在游戏中的作用变量与类型保存角色当前血量、攻击力、防御力条件判断判断玩家输入、判断角色是否存活while 循环让战斗轮次持续进行直到某一方倒下函数把攻击、防御、吃药、显示状态等行为封装起来类与对象用类来描述玩家和野狗两个角色random 模块生成随机伤害和暴击效果输入输出通过 input() 和 print() 完成交互一个项目把这些全部跑通比单独背十遍语法都有效。这也是为什么我一直建议初学者尽早做一个完整的小项目而不是在练习题里打转。1.2 人狗大作战到底怎么玩「人狗大作战」是纯文本回合制小游戏。场景很简单一天晚上你走在回家的小路上突然从路边蹿出一只野狗挡在面前。你现在有两个选择跟它打一架或者找机会逃跑。战斗采用回合制每回合玩家先行动野狗再行动。玩家有四种指令攻击对野狗造成伤害伤害值在基础攻击力上下浮动。防御减少本回合受到的伤害适合血量较低时使用。使用药水恢复一定生命值药水数量有限需要省着用。逃跑有一定成功率失败时会白白消耗一回合。野狗的设计上加入了一个小机制它有 15% 的概率触发暴击暴击伤害提升 1.5 倍。这样一来战斗就有了随机性和紧张感不会变成简单的“你一刀我一刀”。顺便说一句这只是游戏设定。现实中遇到无主动物请不要尝试战斗保持距离并及时向物业或相关部门求助。1.3 为什么这个项目适合作为第一个完整代码整个项目核心代码只有一百多行正好处于“不会因为太长而看不下去”的区间。同时它是一个完整可运行的程序运行之后能看到真实的交互反馈这对新手来说是很强的正反馈。写完以后还能打包发给朋友让对方也运行一把。这种“我的代码真的能玩”的成就感往往就是兴趣持续升温的来源。这个项目的扩展性也很强想加技能就加技能列表想加关卡就做关卡循环想做图形界面可以用 pygame 或 tkinter 重写。后面第 7 节会专门讨论扩展方向。2. 环境准备把 Python 跑起来不管之前有没有接触过 Python先把运行环境准备好。这一步如果没做好后面所有代码都跑不起来。2.1 Python 安装三步走第一步打开 Python 官方网站 python.org进入 Downloads 页面选择对应操作系统的版本下载。Windows 用户下载 Windows installer 格式的安装包即可macOS 和 Linux 用户也有对应的安装包或包管理器方式。这里要特别提醒 Windows 用户一个关键细节安装界面出现后第一步一定要勾选最下方的“Add Python to PATH”然后再点 Install Now。这个选项会把 Python 自动加入系统环境变量。很多新手遇到的“python 不是内部或外部命令”报错基本都是因为这里没有勾选。第二步等待安装完成然后验证安装结果。按 Win R输入 cmd 回车打开命令行输入python --version如果看到类似Python 3.12.x的输出说明安装成功。如果提示找不到 python可以尝试python3命令或者检查环境变量配置。第三步可选检查 pip 是否可用。pip 是 Python 的包管理工具后面打包 exe 时会用到。输入pip --version能看到版本号说明 pip 正常。2.2 开发工具选择Python 安装完成后还需要一个写代码的工具。这里给出三种选择你可以根据情况挑一个IDLEPython 自带的编辑器安装完就有适合零基础读者不需要额外配置。缺点是代码提示和调试功能较弱。VS Code免费开源配合 Python 扩展后体验很好是目前非常主流的选择。选它的话记得在扩展市场搜索“Python”安装微软官方发布的扩展。PyCharmJetBrains 出品的专业 Python IDE社区版免费功能全面适合打算长期深入 Python 开发的读者。缺点是启动相对较重。不管选哪个工具本质都是编写一个 .py 文件再用 Python 解释器运行。工具只是辅助不要在选择工具上纠结太久。这里补充一个 VS Code 的常见配置点打开一个 .py 文件后VS Code 会在右下角提示选择解释器需要选到刚才安装的 Python 版本右上角的运行按钮才能正确执行当前文件。2.3 项目目录结构为了方便管理先新建一个项目文件夹名字可以叫 human_dog_game。整个项目只需要一个核心 Python 文件human_dog_game/ ├── main.py # 游戏主程序 ├── README.md # 项目说明可选 └── requirements.txt # 依赖清单本项目为空main.py 就是要写的全部代码。README.md 可以记录游戏玩法和运行方式养成写说明文档的习惯在以后接手真实项目时会有很大帮助。3. 游戏设计先拆解再写代码写代码之前先把游戏逻辑拆清楚。这一步看起来不产生代码但它决定了代码写出来后好不好改、好不好扩展。3.1 核心规则说明「人狗大作战」的完整规则可以浓缩成下面几条玩家和野狗各有生命值HP、攻击力attack、防御力defense三个基础属性。每回合玩家先行动选择攻击、防御、吃药或逃跑之一。玩家行动结束后如果野狗存活野狗发起攻击。受到攻击时先计算本次伤害再减去目标防御力得到实际扣血量。任何一方 HP 降到 0或者玩家逃跑成功战斗结束。这个规则足够简单又留有变化空间。野狗的暴击机制本质上就是在伤害计算上加了一个随机系数。以后想增加闪避、技能冷却、多段攻击都可以按同样的思路扩展。3.2 数据结构设计用类来描述角色是最直接的方式。类可以把属性和行为封装在一起代码读起来很清楚。游戏里有两个角色玩家和野狗。它们属性不同、行为不完全一样但本质上都是“有血量、能造成伤害、能承受伤害”的角色。所以可以先定义一个Character基类把公共逻辑放进去再由Player和Dog继承并扩展。Character维护 name、max_hp、hp、attack、defense 属性提供 is_alive()、take_damage()、attack_target() 三个方法。Player继承 Character额外增加 potions 属性和 use_potion() 方法。Dog继承 Character额外增加 level 属性根据等级动态计算属性。这样设计的好处是以后想加 Boss 角色只需要继承 Character再扩展方法即可战斗主逻辑基本不用动。3.3 战斗流程梳理整个游戏的流程可以概括成下面的顺序开始 ↓ 初始化玩家和野狗 ↓ 循环判断双方是否都存活 ↓ 显示双方状态 ↓ 玩家选择行动 ├─ 逃跑成功 → 结束 ├─ 攻击 → 计算伤害 ├─ 防御 → 标记本回合减伤 └─ 吃药 → 恢复血量 ↓ 野狗行动根据玩家是否防御计算实际伤害 ↓ 回到循环开头 ↓ 有一方死亡或逃跑成功 → 输出结果这个流程就是 main() 函数的大纲。先把流程列出来再对应写代码思路会清晰很多。4. 完整代码实现下面进入正题。为了方便阅读我会先分段解释关键代码最后再给一份完整可复制的 main.py。4.1 导入模块与定义角色基类游戏需要用到 random 模块生成随机数time 模块在输出之间加一点延迟让战斗过程更有节奏感。然后是 Character 基类。初始化方法接收名字、最大生命值、攻击力、防御力四个参数。max_hp 单独保存一份方便吃药回血时判断上限。import random import time class Character: 角色基类包含所有角色共有的属性和行为 def __init__(self, name, hp, attack, defense): self.name name self.max_hp hp self.hp hp self.attack attack self.defense defense def is_alive(self): 判断角色是否存活 return self.hp 0 def take_damage(self, damage): 承受伤害返回实际扣血量 actual_damage max(0, damage - self.defense) self.hp - actual_damage if self.hp 0: self.hp 0 return actual_damage def attack_target(self, target): 攻击目标伤害在基础攻击力 80%~120% 之间浮动 damage random.randint(int(self.attack * 0.8), int(self.attack * 1.2)) return target.take_damage(damage)这里有一个容易忽略的细节take_damage 中使用了max(0, damage - self.defense)防止防御力高于伤害时出现“被打还回血”的逻辑错误。这是典型的边界条件处理真实项目中到处都会遇到。4.2 定义玩家类和野狗类玩家类继承 Character额外增加药水数量 potions。使用药水时恢复 30 点生命值但不能超过最大生命值。野狗类同样继承 Character构造时根据 level 动态计算属性等级越高越难打。class Player(Character): 玩家类 def __init__(self): super().__init__(勇敢的你, 100, 15, 3) self.potions 3 def use_potion(self): 使用药水恢复生命值返回实际恢复量 if self.potions 0: return 0 heal 30 before self.hp self.hp min(self.max_hp, self.hp heal) self.potions - 1 return self.hp - before class Dog(Character): 野狗类等级越高属性越强 def __init__(self, level1): name f凶猛的野狗等级{level} hp 60 level * 10 attack 10 level * 2 defense 1 level super().__init__(name, hp, attack, defense) self.level level这里用了min(self.max_hp, self.hp heal)来限制回复上限。如果不做这一步角色可能会通过吃药把血量加到超过最大值游戏数值就会乱掉。4.3 实现战斗界面与玩家行动接下来是两个辅助函数。show_status 负责在回合开始前打印双方状态。player_turn 负责接收玩家输入并执行行动最后返回一个字符串标记本回合行为供野狗攻击时判断是否需要减伤。def show_status(player, dog): 打印双方当前状态 print( * 40) print(f【{player.name}】 HP: {player.hp}/{player.max_hp} 药水: {player.potions}) print(f【{dog.name}】 HP: {dog.hp}/{dog.max_hp}) print( * 40) def player_turn(player, dog): 处理玩家回合返回本回合行为标记 print(\n你打算怎么办) print(1. 攻击) print(2. 防御) print(3. 使用药水) print(4. 逃跑) while True: choice input(请输入数字 1-4).strip() if choice 1: damage player.attack_target(dog) print(f你挥拳出击对{dog.name}造成 {damage} 点伤害) return attack if choice 2: print(你压低身体摆出防御姿态。) return defend if choice 3: heal player.use_potion() if heal 0: print(f你喝下一瓶药水恢复 {heal} 点生命值) else: print(你的药水已经用完了) return potion if choice 4: return run print(输入无效请重新选择。)这里用input().strip()而不是直接使用 input()是为了去掉用户输入时误敲的空格。真实项目中处理用户输入时这个习惯也很实用。4.4 实现野狗攻击逻辑野狗攻击时有 15% 的概率触发暴击伤害提升 1.5 倍。如果玩家本回合选择了防御最终伤害先削减 60%只承受 40%。def dog_turn(dog, player, player_choice): 处理野狗回合 if random.random() 0.15: print(f{dog.name} 眼睛发红发动暴击) damage int(dog.attack * 1.5) else: damage dog.attack if player_choice defend: damage int(damage * 0.4) print(你的防御姿态减轻了伤害) actual player.take_damage(damage) print(f{dog.name} 扑向你造成 {actual} 点伤害)暴击概率用random.random()实现它返回 0 到 1 之间的浮点数。小于 0.15 就触发暴击这样写非常直观。4.5 编写主程序 main()主程序把前面的模块串起来。初始化玩家和一只等级为 1 的野狗进入 while 循环只要双方都存活就继续。玩家选择逃跑时有 50% 成功率失败则野狗继续攻击。def main(): print(欢迎来到『人狗大作战』!) print(你走在回家的小路上突然一只野狗从草丛里蹿
返回列表