关于使用Python 3.12开发首款文本类拳击游戏的优化与流程精简技术咨询
拳击文本游戏优化与流程精简建议
嘿,兄弟!首先得说,用童年和老爸玩《Super Punch-Out!》的回忆做游戏主题,这想法太赞了——经典情怀直接拉满!作为刚入门游戏开发的第二个项目,你已经搭好基础回合逻辑框架,这已经很了不起了。下面我从代码结构、逻辑精简、体验完善这几个方面给你一些实用建议:
一、代码结构优化:用类替代列表,提升可读性与扩展性
目前你用列表存储玩家和敌人的属性,虽然简单但可读性差(比如player[0]到底是HP还是Stamina?得回头翻注释),而且后期加新属性(比如攻击力、闪避率)会特别麻烦。换成类的话,代码会清晰很多:
class Fighter: def __init__(self): self.hp = 100 self.stamina = 100 self.action = "" player = Fighter() enemy = Fighter()
这样player.hp、enemy.stamina的含义一目了然,后续扩展属性也只需要在类里加字段就行,维护起来轻松多了。
二、逻辑精简:复用重复代码,减少冗余
你的代码里有很多重复逻辑,比如“耐力不足时自动切换为格挡”、回合切换的提示信息,可以把这些封装成函数:
- 封装
print_fighter_status函数,统一打印玩家和敌人的状态 - 封装
check_stamina_and_fallback函数,统一处理动作的耐力检查与兜底逻辑
这样能砍掉大量重复代码,后续修改逻辑也只需要改一处就行。
三、用户体验与逻辑漏洞修复
- 输入验证:现在玩家输入非1-3的内容时,程序会直接跳过处理,体验很差。可以加个循环直到玩家输入合法选项:
while True: action = input("请选择动作:\n1. 刺拳...\n2. 上钩拳...\n3. 格挡...\n") if action in ["1","2","3"]: break print("无效输入,请输入1、2或3中的一个选项!")
- 修复核心逻辑漏洞:
- 原代码里
enemy_hp -= 10是笔误,应该是enemy[0] -= 10(如果用列表的话) - 敌人出刺拳时,如果玩家没格挡,完全没有扣玩家生命值的逻辑,这是个大bug
- 生命值计算出现小数(比如
player[0] -= (damage[0] * 0.5)),可以转成整数,更符合游戏习惯:player[0] = max(0, player[0] - int(damage[0] * 0.5))
- 原代码里
- 强化战斗反馈:比如玩家成功击中/闪避时,明确提示造成的伤害值,让每一次操作都有清晰的反馈。
四、优化后的代码示例
这里我基于你的原代码,结合上面的建议做了精简和修复:
import random class Fighter: def __init__(self): self.hp = 100 self.stamina = 100 self.action = "" def print_fighter_status(player, enemy): print("----------") print(f"敌人生命值: {enemy.hp}") print(f"你的生命值: {player.hp}") print(f"你的耐力值: {player.stamina}") def get_valid_player_action(): while True: action = input("""请选择动作: 1. 刺拳 (消耗5耐力,造成10伤害) 2. 上钩拳 (消耗35耐力,造成30伤害) 3. 格挡 (回复10耐力) """) if action in ["1", "2", "3"]: return action print("无效输入,请输入1、2或3!") player = Fighter() enemy = Fighter() damage = [10, 30] turn = "player" while player.hp > 0 and enemy.hp > 0: hit_player_jab = random.randint(1,4) hit_player_uppercut = random.randint(1,2) hit_enemy_jab = random.randint(1,4) hit_enemy_uppercut = random.randint(1,2) if turn == "player": turn = "enemy" print_fighter_status(player, enemy) player.action = get_valid_player_action() # 处理玩家动作 if player.action == "1": if player.stamina >= 5: player.stamina -=5 if hit_player_jab ==4: print("----------\n你打空了!轮到敌人行动") else: enemy.hp = max(0, enemy.hp - damage[0]) print(f"----------\n你打出刺拳,击中敌人!造成{damage[0]}点伤害") else: print("----------\n耐力不足!你自动选择格挡,轮到敌人行动") player.action = "3" elif player.action == "2": if player.stamina >=35: player.stamina -=35 if hit_player_uppercut ==2: print("----------\n你打空了!轮到敌人行动") else: enemy.hp = max(0, enemy.hp - damage[1]) print(f"----------\n你打出上钩拳,重创敌人!造成{damage[1]}点伤害") else: print("----------\n耐力不足!你自动选择格挡,轮到敌人行动") player.action = "3" elif player.action == "3": player.stamina = min(100, player.stamina +10) # 耐力不超过上限 print("----------\n你选择格挡,回复10点耐力!轮到敌人行动") if turn == "enemy": turn = "player" enemy.action = random.randint(1,3) print("----------") # 处理敌人动作 if enemy.action ==1: enemy.stamina = max(0, enemy.stamina -5) print("敌人打出刺拳!") if hit_enemy_jab ==4: print("敌人打空了!轮到你行动") else: if player.action == "3": player.hp = max(0, player.hp - int(damage[0]*0.5)) print("你成功格挡,只受到一半伤害!") else: player.hp = max(0, player.hp - damage[0]) print(f"敌人刺拳命中!你受到{damage[0]}点伤害") elif enemy.action ==2: if enemy.stamina >=35: enemy.stamina -=35 print("敌人打出上钩拳!") if hit_enemy_uppercut ==2: print("敌人打空了!轮到你行动") else: if player.action == "3": player.hp = max(0, player.hp - int(damage[1]*0.5)) print("你成功格挡,只受到一半伤害!") else: player.hp = max(0, player.hp - damage[1]) print(f"敌人上钩拳命中!你受到{damage[1]}点伤害") else: # 敌人耐力不足时自动格挡 enemy.stamina = min(100, enemy.stamina +10) print("敌人耐力不足,选择格挡!回复10点耐力") elif enemy.action ==3: enemy.stamina = min(100, enemy.stamina +10) print("敌人选择格挡,回复10点耐力!轮到你行动") # 战斗结束判定 print("----------") if player.hp >0: print("你击败了敌人!赢得胜利!") else: print("你被敌人击败了...再接再厉!")
额外小建议
- 可以给敌人加不同的AI逻辑(比如有的敌人喜欢频繁出刺拳,有的喜欢攒耐力出上钩拳),让战斗更有变化
- 加入回合数统计、连击系统或者特殊技能,提升游戏趣味性
- 把文本内容提取到配置文件里,方便后续修改多语言或者调整描述
内容的提问来源于stack exchange,提问作者No Sleep
相关产品推荐
相关产品推荐

