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

C# HP对战游戏while循环无法触发玩家二次输入问题排查

问题根因
  • 事件驱动逻辑适配错误:WinForm 是事件触发的 UI 框架,你直接在按钮点击事件中嵌套死循环等待用户输入,会直接阻塞 UI 线程,用户根本没有机会输入新内容,循环会直接读取你上次攻击后清空的空白文本框,自然会反复触发输入错误提示。
  • 循环条件逻辑错误:你写的while(playerOneHP >= 0 || computerHP >= 0)逻辑是只要有一方HP≥0就继续循环,需要双方都战败才会退出,不符合「任意一方HP降至0就结束」的需求,正确判断逻辑应该是playerOneHP > 0 && computerHP > 0。
  • 缺少输入等待逻辑:循环运行时不会等待用户输入新内容,上次攻击清空文本框后立刻读取空白值,直接触发输入校验失败的提示。
修复方案

GUI 程序不需要用循环维持攻击流程,每次用户点击攻击按钮就处理一轮攻击即可,符合事件驱动的运行逻辑,修改后代码如下:

public int userPickForWeapon(int userPick)
{ 
    return userPick;
}

private void btnPlayerOneAttack_Click(object sender, EventArgs e)
{
    // 先判断游戏是否已经结束
    if (playerOneHP <= 0 || computerHP <= 0)
    {
        MessageBox.Show("游戏已结束,请重启开始新游戏");
        return;
    }

    int userPick = 0;
    // 统一校验输入合法性
    if (!int.TryParse(txtPlayerWeapons.Text, out userPick) || userPick < 1 || userPick > 6)
    {
        MessageBox.Show("请输入1-6之间的数字");
        txtPlayerWeapons.Focus();
        return;
    }

    // 处理玩家攻击逻辑
    int damage = 0;
    string weaponName = "";
    switch(userPick)
    {
        case 1:
            damage = rand.Next(8, 16);
            weaponName = "弓箭";
            break;
        case 2:
            damage = rand.Next(1, 10);
            weaponName = "剑";
            break;
        case 3:
            damage = rand.Next(7, 15);
            weaponName = "火焰";
            break;
        case 4:
            damage = rand.Next(8, 15);
            weaponName = "冰";
            break;
        case 5:
            damage = rand.Next(9, 15);
            weaponName = "风";
            break;
        case 6:
            damage = rand.Next(1, 6);
            weaponName = "水";
            break;
    }
    computerHP -= damage;
    lblComputerHP.Text = "HP: " + computerHP;
    lblComputerResultsShow.Text = $"你使用了{weaponName}\n造成了{damage}点伤害";
    txtPlayerWeapons.Text = "";

    // 判断电脑是否战败
    if (computerHP <= 0)
    {
        MessageBox.Show("你获胜了!");
        return;
    }

    // 此处补充电脑反击逻辑,随机选择武器扣除玩家HP、更新玩家HP展示即可
    // ...

    // 判断玩家是否战败
    if (playerOneHP <= 0)
    {
        MessageBox.Show("你战败了!");
        return;
    }
}

内容的提问来源于stack exchange,提问作者Wheeze86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:24:04