艺小卤 发表于 2025-4-4 15:15:03

FishC 发表于 2025-4-4 15:16:14


public partial class MainForm : Form {
    // ... 其他代码保持不变 ...

    private void GameTimer_Tick(object sender, EventArgs e) {
      // ... 僵尸生成和移动逻辑保持不变 ...

      // 攻击检测部分需要添加攻击距离限制
      foreach (var plant in plants) {
            foreach (var zombie in zombies) {
                // 添加攻击范围判断(示例使用100像素的射程)
                if (Math.Abs(plant.X - zombie.X) < 100
                  && plant.Y == zombie.Y)
                {
                  plant.Attack(zombie);
                }
            }
      }

      // 修正僵尸移除逻辑(原代码被截断)
      zombies.RemoveAll(z => z.Health <= 0);
      
      // 请求界面重绘
      this.Invalidate();
    }

    // 添加边界检查防止对象移出屏幕
    private void MainForm_Paint(object sender, PaintEventArgs e) {
      e.Graphics.Clear(Color.LightGray);
      // 绘制草坪基线
      e.Graphics.DrawLine(Pens.DarkGreen, 0, 140, ClientSize.Width, 140);
      
      foreach (var plant in plants) {
            plant.Draw(e.Graphics);
            // 添加生命值显示
            e.Graphics.DrawString(plant.Health.ToString(),
                this.Font, Brushes.Black, plant.X, plant.Y - 20);
      }
      
      foreach (var zombie in zombies) {
            zombie.Draw(e.Graphics);
            // 添加生命值显示
            e.Graphics.DrawString(zombie.Health.ToString(),
                this.Font, Brushes.White, zombie.X, zombie.Y - 20);
      }
    }
}


需要改进的几个关键点:


[*]1. 僵尸移除修复
原代码的 zombies.RemoveAll(z => z.Health 语句不完整,已修正为:
zombies.RemoveAll(z => z.Health <= 0);

[*]2. 添加攻击距离限制
原版植物可以攻击全屏僵尸,新增距离判断:
if (Math.Abs(plant.X - zombie.X) < 100 && plant.Y == zombie.Y)

[*]3. 界面优化
新增了:

[*]草坪基线绘制
[*]生命值数字显示
[*]双缓冲设置(已包含在构造函数)


[*]4. 碰撞检测改进
建议后续添加更精确的碰撞检测:
// 示例:基于矩形区域的碰撞检测
public bool CheckCollision(GameObject other) {
    return this.X < other.X + other.Width &&
         this.X + this.Width > other.X &&
         this.Y < other.Y + other.Height &&
         this.Y + this.Height > other.Y;
}


完整示例项目可参考:
https://github.com/example/PlantsVsZombiesDemo

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 2025-4-4 15:17:44

问题分析与解决方案

你的代码存在一个关键问题:在 zombies.RemoveAll 中缺少完整的判断条件。修正后的完整代码如下:


// 在 GameTimer_Tick 方法中修正僵尸移除逻辑
zombies.RemoveAll(z => z.Health <= 0);


其他优化建议

[*]碰撞检测频率过高:建议给植物添加攻击间隔属性(如 AttackCooldown)
[*]僵尸生成位置单一:可添加随机Y坐标生成
[*]缺少对象销毁机制:建议添加 GameObject.IsAlive 属性


优化后的植物类示例:

public class Plant : GameObject {
    private int _attackCooldown = 1000; // 攻击间隔1秒
    private DateTime _lastAttackTime = DateTime.MinValue;

    public void Attack(Zombie zombie) {
      if ((DateTime.Now - _lastAttackTime).TotalMilliseconds >= _attackCooldown) {
            zombie.Health -= 10;
            _lastAttackTime = DateTime.Now;
      }
    }
}


关键问题说明
原始代码中 RemoveAll(z => z.Health) 会导致:
1. 编译错误:Lambda表达式不完整
2. 僵尸永远不会被移除
3. 内存泄漏风险

建议添加调试信息验证逻辑:

// 在绘制方法中添加生命值显示
public override void Draw(Graphics g) {
    g.FillRectangle(Brushes.Red, X, Y, Width, Height);
    g.DrawString(Health.ToString(), SystemFonts.DefaultFont, Brushes.White, X, Y);
}


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2025-4-4 22:50:10

这代码没缩进,犹如……
页: [1]
查看完整版本: 心意