C#贪吃蛇游戏之--实体对象层(二)

这一节分析下具体实体类的定义和实现,下面是这个游戏的实体类结构:

 

    游戏物体的运动就是不断创建画面和销毁画面的过程,原理和播放录象带一样。所以我定义了一个基类,里面定义了子类共同的成员,由于方法具体实现都一样,所以在基类里的Draw和Crear方法并没有定义为抽象方法,反而具体实现了它们!子类继承后就不需要具体实现了。

CommonMethod.cs

  1. /// <summary>  
  2.     /// 这里定义了一些蛇类和食物类中共同用到的函数和基本属性数据,供子类继承  
  3.     /// </summary>  
  4.     public class CommonMethod  
  5.     {  
  6.         public Point Point { getset; }  
  7.   
  8.         public void Draw(Graphics g, Pen p, SolidBrush s,Point point)  
  9.         {  
  10.             g.DrawRectangle(p, (11 * point.X - 9), (11 * point.Y - 9), 10, 10);  
  11.             g.FillRectangle(s, (11 * point.X - 8), (11 * point.Y - 8), 10 - 1, 10 - 1);  
  12.         }  
  13.   
  14.         public void Crear(Graphics g, SolidBrush s, Point point)  
  15.         {  
  16.             g.FillRectangle(s, (11 * point.X - 9), (11 * point.Y - 9), 10 + 1, 10 + 1);  
  17.         }  
  18.     }  

(上面的"10",为游戏地图小方格的大小,游戏地图就是由N*M个小方格组成的,根据爱好自己定义了)

    蛇类,除了继承基类之外,还有属于自己的成员。比如,蛇可以爬行而食物是静止的。

    蛇由坐标集组成List<Point>,故蛇的爬行就是改边蛇的坐标点,我考虑到两种实现爬行的方法:

    方法一:遍历所有List<Point>,让后一个坐标点等于前一个坐标点,蛇头为运动方向的一个新坐标,这样蛇就可以爬行了;

    for (int i = 蛇身.Count - 1; i >= 1; i--)
    {
         蛇身[i] = 蛇身[i - 1];
    }

    .......

    蛇身[0]=new Point(新坐标);

    方法二:蛇的爬行就是画头和消尾的过程,所以只需要改变蛇头坐标和删掉尾坐标即可,如果吃到食物,不用去尾,这样蛇自然就变长了。

    void Move()

    {

         蛇身.Insert(0, 新坐标);

         if(吃到食物)

            ......

         else

            蛇身.Remove(尾坐标);

    }   

    对比两种方法,方法二效率明显高于方法一,方法一每次蛇爬行都要重新画整个蛇身,有时会导致画面很闪烁(没双缓冲);方法二只需画蛇头和消蛇尾就可以了。

Snake.cs

  1. public enum SnakeDirection  
  2. {  
  3.     Up, Down, Left, Right  
  4. }  
  5. public enum SnakeState  
  6. {  
  7.     Normal = 50, Fast = 30, Low = 200  
  8. }  
  9. public class Snake:CommonMethod  
  10. {  
  11.     public List<Point> SnakePoints{get;set;}  
  12.     public SnakeDirection SnakeDirection { getset; }  
  13.     public SnakeState SnakeState { getset; }  
  14.     //活动场地  
  15.     public int backWidth;  
  16.     public int backHeight;  
  17.   
  18.     //构造函数  
  19.     public Snake(int snakeLengh, SnakeDirection direction,int w,int h)  
  20.     {  
  21.         SnakePoints = new List<Point>();  
  22.         //缺省蛇长度  
  23.         for (int i = snakeLengh; i > 0; i--)  
  24.         {  
  25.             SnakePoints.Add(new Point(i,5));  
  26.         }  
  27.         this.SnakeDirection = direction;  
  28.         this.backWidth = w;  
  29.         this.backHeight = h;  
  30.     }  
  31.   
  32.     //是否可以爬行,如果为真,则把新坐标添加进蛇身并充当蛇头  
  33.     public bool IsCanMove(ref Point point)  
  34.     {  
  35.         point.X = SnakePoints[0].X;  
  36.         point.Y = SnakePoints[0].Y;  
  37.         switch (SnakeDirection)  
  38.         {  
  39.             case SnakeDirection.Up:  
  40.                 if (point.Y == 1)  
  41.                     return false;  
  42.                 else  
  43.                     point.Y -= 1;  
  44.                 break;  
  45.             case SnakeDirection.Down:  
  46.                 if (point.Y ==backHeight/10-3)  
  47.                     return false;  
  48.                 else  
  49.                     point.Y += 1;  
  50.                 break;  
  51.             case SnakeDirection.Left:  
  52.                 if (point.X == 1)  
  53.                     return false;  
  54.                 else  
  55.                     point.X -= 1;  
  56.                 break;  
  57.             case SnakeDirection.Right:  
  58.                 if (point.X ==backWidth/10-2)  
  59.                     return false;  
  60.                 else  
  61.                     point.X += 1;  
  62.                 break;  
  63.         }  
  64.         SnakePoints.Insert(0, point);  
  65.         return true;  
  66.     }  
  67.   
  68.     //画整个蛇身  
  69.     public void DrawSnake(Graphics g)  
  70.     {  
  71.         foreach (Point point in SnakePoints)  
  72.         {  
  73.             base.Draw(g, new Pen(Color.Black), new SolidBrush(Color.YellowGreen),point);  
  74.         }  
  75.     }  
  76.   
  77.     //画蛇头  
  78.     public void DrawHead(Graphics g)  
  79.     {  
  80.         base.Draw(g, new Pen(Color.Black), new SolidBrush(Color.YellowGreen),Point);  
  81.     }  
  82. }  

食物类就比较简单了

Food.cs

  1. /// <summary>  
  2. /// 定义食物类型,以后扩展用,目前这个版本没用到  
  3. /// </summary>  
  4. public enum FoodType  
  5. {  
  6.     Normal,Fast,Slow,Long  
  7. }  
  8.   
  9. public class Food:CommonMethod  
  10. {  
  11.     public FoodType FoodType { getset; }  
  12.   
  13.     public void DrawFood(Graphics g)  
  14.     {  
  15.         base.Draw(g, new Pen(Color.Black), new SolidBrush(Color.Orange),Point);  
  16.     }  
  17. }  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值