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
相关产品推荐
相关产品推荐

