Tron游戏中player1与player2身体列表碰撞时如何让得分标签+1
Tron游戏得分累计失效问题修复方案
问题根因
- 核心问题在
Score1()和Score2()方法的变量作用域错误:displayScore是方法内部的局部变量,每次调用方法时都会重新初始化为0,执行displayScore++后永远只能得到1,所以第二次及以后调用时标签显示的数值不会发生变化。 - 次要问题:原碰撞处理逻辑存在重复触发得分的风险,同一个碰撞事件可能被多次判定、多次累加分数。
修复步骤
步骤1:新增全局得分变量
在类的成员变量定义区域,新增两个全局得分变量,程序启动时默认初始化为0:
Player player1; Player player2; List<Player> players1 = new List<Player>(); List<Player> players2 = new List<Player>(); // 新增全局得分变量 private int _redScore = 0; private int _blueScore = 0;
步骤2:修改得分方法逻辑
将原得分方法中的局部变量替换为全局变量做累加:
private void Score1() { _redScore++; label1.Text = "Red Score: " + _redScore; } private void Score2() { _blueScore++; label2.Text = "Blue Score: " + _blueScore; }
步骤3:优化碰撞检测逻辑(可选,避免重复加分)
原碰撞处理逻辑中只要命中列表内的元素就会触发得分,可能单次碰撞多次加分,优化为单次检测周期内最多触发一次得分:
private void HandleCollision() { bool isPlayer1Dead = false; bool isPlayer2Dead = false; // 检测玩家2是否撞到玩家1的身体 foreach (var item in players1) { if (player2.Intersect(item.Rectangle)) { isPlayer2Dead = true; break; } } // 检测玩家1是否撞到玩家2的身体 foreach (var item in players2) { if (player1.Intersect(item.Rectangle)) { isPlayer1Dead = true; break; } } // 检测玩家是否撞到自己的身体 foreach (var item in players1) { if (player1.Intersect(item.Rectangle)) { isPlayer1Dead = true; break; } } foreach (var item in players2) { if (player2.Intersect(item.Rectangle)) { isPlayer2Dead = true; break; } } // 处理碰撞结果 if (isPlayer2Dead) { Score1(); } else if (isPlayer1Dead) { Score2(); } // 任意玩家死亡就重置游戏状态 if (isPlayer1Dead || isPlayer2Dead) { players1.Clear(); players2.Clear(); SetPlayer1(); SetPlayer2(); position = Position.Null; position1 = Position1.Null; } }
内容的提问来源于stack exchange,提问作者xibrox
相关产品推荐
相关产品推荐

