C#贪吃蛇游戏之--逻辑层(三)

到了逻辑层了,我们要分析游戏的规则:是否蛇可以爬行、是否吃掉食物、是否产生新食物、是否游戏结束、积分规则等。

    蛇死亡目前有两种形式:撞到墙壁;咬到自己 :(

    产生新食物前提:蛇吃掉食物,随机产生新坐标食物(新坐标!=蛇身[n])。

GameLogic.cs

  1. public class GameLogic  
  2.     {  
  3.         /// <summary>  
  4.         /// SNAKE_INIT_LENGH:蛇缺省长度  
  5.         /// SNAKE_INIT_DIRECTION:蛇缺省爬行方向  
  6.         /// </summary>  
  7.         public const int SNAKE_INIT_LENGH = 3;  
  8.         public const SnakeDirection SNAKE_INIT_DIRECTION = SnakeDirection.Right;  
  9.         private Snake snake;  
  10.         private Food food;  
  11.         //游戏场景  
  12.         private System.Windows.Forms.Panel panel;  
  13.         private Graphics g;  
  14.         private SolidBrush backBrush;  
  15.         private bool gameOver = false;  
  16.         public int BackWidth;  
  17.         public int BackHeight;  
  18.   
  19.         private Point ObjFoodPoint  
  20.         {  
  21.             get { return food.Point; }  
  22.             set { food.Point = value; }  
  23.         }  
  24.         private Point NewSnakeHead  
  25.         {  
  26.             get { return snake.Point; }  
  27.             set { snake.Point = value; }  
  28.         }  
  29.         public SnakeDirection SnakeDirection  
  30.         {  
  31.             get { return snake.SnakeDirection; }  
  32.             set { snake.SnakeDirection = value; }  
  33.         }  
  34.         public bool GameOver  
  35.         {  
  36.             get { return gameOver; }  
  37.         }  
  38.   
  39.         //构造函数,实例化对象  
  40.         public GameLogic(System.Windows.Forms.Panel p, int w, int h)  
  41.         {  
  42.             this.panel = p;  
  43.             BackWidth = w;  
  44.             BackHeight = h;  
  45.             snake = new Snake(SNAKE_INIT_LENGH, SNAKE_INIT_DIRECTION, BackWidth, BackHeight);  
  46.             food = new Food();  
  47.         }  
  48.   
  49.         //初始游戏画面  
  50.         public void InitGame()  
  51.         {  
  52.             g = panel.CreateGraphics();  
  53.             backBrush = new SolidBrush(panel.BackColor);  
  54.             snake.DrawSnake(g);  
  55.             CreateFood();  
  56.         }  
  57.   
  58.         //清除游戏画面  
  59.         public void CrearAll()  
  60.         {  
  61.             foreach (Point point in snake.SnakePoints)  
  62.                 snake.Crear(g, backBrush, point);  
  63.             food.Crear(g, backBrush, ObjFoodPoint);  
  64.         }  
  65.   
  66.         //蛇运动  
  67.         public void SnakeMove()  
  68.         {  
  69.             Point newPoint = new Point();  
  70.             if (snake.IsCanMove(ref newPoint))  
  71.             {  
  72.                 NewSnakeHead = newPoint;  
  73.                 snake.DrawHead(g);  
  74.                 if (IsEatFood(ObjFoodPoint))  
  75.                 {  
  76.                     CreateFood();  
  77.                 }  
  78.                 else  
  79.                 {  
  80.                     snake.Crear(g, backBrush, snake.SnakePoints[snake.SnakePoints.Count - 1]);  
  81.                     snake.SnakePoints.Remove(snake.SnakePoints[snake.SnakePoints.Count - 1]);  
  82.                 }  
  83.             }  
  84.             else  
  85.             {  
  86.                 gameOver = true;  
  87.             }  
  88.             if (IsHitOneself())  
  89.                 gameOver = true;  
  90.         }  
  91.   
  92.         //蛇吃食物  
  93.         public bool IsEatFood(Point point)  
  94.         {  
  95.             if (point == snake.SnakePoints[0])  
  96.             {  
  97.                 return true;  
  98.             }  
  99.             return false;  
  100.         }  
  101.   
  102.         //当食物被吃掉时,产生随机坐标的食物  
  103.         public void CreateFood()  
  104.         {  
  105.             Random objRandom = new Random();  
  106.             Point objPoint;  
  107.             int tempX, tempY;  
  108.             for (int i = 0; ; i++)  
  109.             {  
  110.                 tempX = objRandom.Next(BackWidth) % (BackWidth / 11);  
  111.                 tempY = objRandom.Next(BackHeight) % (BackHeight /11);  
  112.                 if (tempX == 0 || tempY == 0)  
  113.                 {  
  114.                     continue;  
  115.                 }  
  116.                 else  
  117.                 {  
  118.                     objPoint = new Point(tempX, tempY);  
  119.   
  120.                     if (snake.SnakePoints.Contains(objPoint))  
  121.                     {  
  122.                         continue;  
  123.                     }  
  124.                     else  
  125.                     {  
  126.                         ObjFoodPoint = objPoint;  
  127.                         break;  
  128.                     }  
  129.                 }  
  130.             }  
  131.             food.DrawFood(g);  
  132.         }  
  133.   
  134.         //蛇头撞上蛇身  
  135.         public bool IsHitOneself()  
  136.         {  
  137.             for (int i = 1; i < snake.SnakePoints.Count; i++)  
  138.             {  
  139.                 if (snake.SnakePoints[0] == snake.SnakePoints[i])  
  140.                     return true;  
  141.             }  
  142.             return false;  
  143.         }  
  144.   
  145.         //积分累加  
  146.         public string GetFenShu()  
  147.         {  
  148.             return ((snake.SnakePoints.Count - SNAKE_INIT_LENGH) * 15).ToString();  
  149.         }  
  150.     }  
 

    上面代码注释的比较多,应该不难理解,大家看下有哪里需要改进的提下意见!:)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值