到了逻辑层了,我们要分析游戏的规则:是否蛇可以爬行、是否吃掉食物、是否产生新食物、是否游戏结束、积分规则等。
蛇死亡目前有两种形式:撞到墙壁;咬到自己 :(
产生新食物前提:蛇吃掉食物,随机产生新坐标食物(新坐标!=蛇身[n])。
GameLogic.cs
- public class GameLogic
- {
- /// <summary>
- /// SNAKE_INIT_LENGH:蛇缺省长度
- /// SNAKE_INIT_DIRECTION:蛇缺省爬行方向
- /// </summary>
- public const int SNAKE_INIT_LENGH = 3;
- public const SnakeDirection SNAKE_INIT_DIRECTION = SnakeDirection.Right;
- private Snake snake;
- private Food food;
- //游戏场景
- private System.Windows.Forms.Panel panel;
- private Graphics g;
- private SolidBrush backBrush;
- private bool gameOver = false;
- public int BackWidth;
- public int BackHeight;
- private Point ObjFoodPoint
- {
- get { return food.Point; }
- set { food.Point = value; }
- }
- private Point NewSnakeHead
- {
- get { return snake.Point; }
- set { snake.Point = value; }
- }
- public SnakeDirection SnakeDirection
- {
- get { return snake.SnakeDirection; }
- set { snake.SnakeDirection = value; }
- }
- public bool GameOver
- {
- get { return gameOver; }
- }
- //构造函数,实例化对象
- public GameLogic(System.Windows.Forms.Panel p, int w, int h)
- {
- this.panel = p;
- BackWidth = w;
- BackHeight = h;
- snake = new Snake(SNAKE_INIT_LENGH, SNAKE_INIT_DIRECTION, BackWidth, BackHeight);
- food = new Food();
- }
- //初始游戏画面
- public void InitGame()
- {
- g = panel.CreateGraphics();
- backBrush = new SolidBrush(panel.BackColor);
- snake.DrawSnake(g);
- CreateFood();
- }
- //清除游戏画面
- public void CrearAll()
- {
- foreach (Point point in snake.SnakePoints)
- snake.Crear(g, backBrush, point);
- food.Crear(g, backBrush, ObjFoodPoint);
- }
- //蛇运动
- public void SnakeMove()
- {
- Point newPoint = new Point();
- if (snake.IsCanMove(ref newPoint))
- {
- NewSnakeHead = newPoint;
- snake.DrawHead(g);
- if (IsEatFood(ObjFoodPoint))
- {
- CreateFood();
- }
- else
- {
- snake.Crear(g, backBrush, snake.SnakePoints[snake.SnakePoints.Count - 1]);
- snake.SnakePoints.Remove(snake.SnakePoints[snake.SnakePoints.Count - 1]);
- }
- }
- else
- {
- gameOver = true;
- }
- if (IsHitOneself())
- gameOver = true;
- }
- //蛇吃食物
- public bool IsEatFood(Point point)
- {
- if (point == snake.SnakePoints[0])
- {
- return true;
- }
- return false;
- }
- //当食物被吃掉时,产生随机坐标的食物
- public void CreateFood()
- {
- Random objRandom = new Random();
- Point objPoint;
- int tempX, tempY;
- for (int i = 0; ; i++)
- {
- tempX = objRandom.Next(BackWidth) % (BackWidth / 11);
- tempY = objRandom.Next(BackHeight) % (BackHeight /11);
- if (tempX == 0 || tempY == 0)
- {
- continue;
- }
- else
- {
- objPoint = new Point(tempX, tempY);
- if (snake.SnakePoints.Contains(objPoint))
- {
- continue;
- }
- else
- {
- ObjFoodPoint = objPoint;
- break;
- }
- }
- }
- food.DrawFood(g);
- }
- //蛇头撞上蛇身
- public bool IsHitOneself()
- {
- for (int i = 1; i < snake.SnakePoints.Count; i++)
- {
- if (snake.SnakePoints[0] == snake.SnakePoints[i])
- return true;
- }
- return false;
- }
- //积分累加
- public string GetFenShu()
- {
- return ((snake.SnakePoints.Count - SNAKE_INIT_LENGH) * 15).ToString();
- }
- }
上面代码注释的比较多,应该不难理解,大家看下有哪里需要改进的提下意见!:)