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. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章