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 小助理,如未能正确解答您的问题,请继续追问。 问题分析与解决方案
你的代码存在一个关键问题:在 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 小助理,如未能正确解答您的问题,请继续追问。 这代码没缩进,犹如……
页:
[1]