鱼C论坛

 找回密码
 立即注册
查看: 251|回复: 3

心意

[复制链接]
头像被屏蔽
发表于 2025-4-4 15:15:03 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-4 15:16:14 | 显示全部楼层

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

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

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

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

  22.     // 添加边界检查防止对象移出屏幕
  23.     private void MainForm_Paint(object sender, PaintEventArgs e) {
  24.         e.Graphics.Clear(Color.LightGray);
  25.         // 绘制草坪基线
  26.         e.Graphics.DrawLine(Pens.DarkGreen, 0, 140, ClientSize.Width, 140);
  27.         
  28.         foreach (var plant in plants) {
  29.             plant.Draw(e.Graphics);
  30.             // 添加生命值显示
  31.             e.Graphics.DrawString(plant.Health.ToString(),
  32.                 this.Font, Brushes.Black, plant.X, plant.Y - 20);
  33.         }
  34.         
  35.         foreach (var zombie in zombies) {
  36.             zombie.Draw(e.Graphics);
  37.             // 添加生命值显示
  38.             e.Graphics.DrawString(zombie.Health.ToString(),
  39.                 this.Font, Brushes.White, zombie.X, zombie.Y - 20);
  40.         }
  41.     }
  42. }
复制代码


需要改进的几个关键点:

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

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

  • 3. 界面优化
    新增了:
    • 草坪基线绘制
    • 生命值数字显示
    • 双缓冲设置(已包含在构造函数)

  • 4. 碰撞检测改进
    建议后续添加更精确的碰撞检测:
    1. // 示例:基于矩形区域的碰撞检测
    2. public bool CheckCollision(GameObject other) {
    3.     return this.X < other.X + other.Width &&
    4.            this.X + this.Width > other.X &&
    5.            this.Y < other.Y + other.Height &&
    6.            this.Y + this.Height > other.Y;
    7. }
    复制代码



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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-4 15:17:44 | 显示全部楼层
问题分析与解决方案

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


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


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


优化后的植物类示例:

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

  4.     public void Attack(Zombie zombie) {
  5.         if ((DateTime.Now - _lastAttackTime).TotalMilliseconds >= _attackCooldown) {
  6.             zombie.Health -= 10;
  7.             _lastAttackTime = DateTime.Now;
  8.         }
  9.     }
  10. }
复制代码


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

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

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


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-4-4 22:50:10 | 显示全部楼层
这代码没缩进,犹如……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-5 20:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表