You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用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. 输入验证:现在玩家输入非1-3的内容时,程序会直接跳过处理,体验很差。可以加个循环直到玩家输入合法选项:
while True:
    action = input("请选择动作:\n1. 刺拳...\n2. 上钩拳...\n3. 格挡...\n")
    if action in ["1","2","3"]:
        break
    print("无效输入,请输入1、2或3中的一个选项!")
  1. 修复核心逻辑漏洞:
    • 原代码里enemy_hp -= 10是笔误,应该是enemy[0] -= 10(如果用列表的话)
    • 敌人出刺拳时,如果玩家没格挡,完全没有扣玩家生命值的逻辑,这是个大bug
    • 生命值计算出现小数(比如player[0] -= (damage[0] * 0.5)),可以转成整数,更符合游戏习惯:player[0] = max(0, player[0] - int(damage[0] * 0.5))
  2. 强化战斗反馈:比如玩家成功击中/闪避时,明确提示造成的伤害值,让每一次操作都有清晰的反馈。

四、优化后的代码示例

这里我基于你的原代码,结合上面的建议做了精简和修复:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 06:40:18