c# 贪吃蛇小游戏

------------恢复内容开始------------

新手学习c# 在博客园上看到后自己模仿打出来的第一个程序  开心,纪念一下

bean :食物类

block :蛇块类

snake :蛇类

Map :地图 图形类

 食物类:

class bean
    {
        private Point _origin;//用于画食物顶端坐标

        public Point Origin//封装字段
        {
            get { return _origin; }
            set { _origin = value; }
        }
        //显示食物方法
        public void showBean(Graphics g)
        {
            //定义红色画笔
            SolidBrush brush = new SolidBrush(Color.Red);
            //用实心矩形画食物
            g.FillRectangle(brush, _origin.X, _origin.Y, 15, 15);
        }
        //食物消失方法
        public void unShowBean(Graphics g)
        {
            //定义背景色画笔
            SolidBrush brush = new SolidBrush(Color.Red);
            //用实心矩形画食物
            g.FillRectangle(brush, _origin.X, _origin.Y, 15, 15);
        }
    }

蛇块类:2020-02-16

  public class block
    {
         //是否是蛇头
         private bool _isHead;

         public bool IShead
         {
             get { return _isHead; }
             set { _isHead = value; }
         }
         //蛇块编号
         private int _blockNumber;

         public int BlockNumber
         {
             get { return _blockNumber; }
             set { _blockNumber = value; }
         }
         //蛇块在左上角的位置
         private Point _origin;

         public Point Origin
         {
             get { return _origin; }
             set { _origin = value; }
         }

         //根据指定位置画蛇块
         public void showBlock(Graphics g)
         {
             Bitmap bitMap;
             if (IShead)
             {
                 bitMap = new Bitmap(Image.FromFile("blue.gif"));
             }
             else
             {
                 bitMap = new Bitmap(Image.FromFile("Yellow.gif"));
             }
             g.DrawImage(bitMap, Origin.X, Origin.Y, 15, 15);
         }
         //蛇块消除
         public void UnShowBlock(Graphics g)
         {
             SolidBrush brush = new SolidBrush(Color.Silver);
             g.FillRectangle(brush,Origin.X,Origin.Y,15,15);
         }
    }

蛇类:

  public class Snake
    {
        //用于存放蛇的集合
        private List<block> blockList;
        //0-1-2-3  上-右-下-左
        private int direction = 1;
        //蛇运动方向属性
        public int Direction
        {
            get { return direction; }
            set { direction = value; }
        }
        //蛇右的编号  蛇头的长度

        private int headNumber;
        //蛇头左上角坐标
        private Point headPoint;
        //蛇头坐标只读属性
        public Point HeadPoint
        {
            get { return headPoint; }          
        }

        private Point mapLeft;
        //游戏开始时初始的蛇
        public Snake(Point map, int count)//填充Blocklist
        {
            mapLeft = map;
            block blockSnake;
            //定义蛇的起始位置
            Point p = new Point(map.X + 15, map.Y + 15);
            blockList = new List<block>();
            //循环画蛇 用于填充集合
            for (int i = 0; i < count; i++)
            {
                //X坐标加15
                p.X += 15;
                //实例化蛇块
                blockSnake = new block();
                //定义蛇块左上角的位置
                blockSnake.Origin = p;
                //定义蛇块编号1,2,3,4
                blockSnake.BlockNumber = i + 1;
                if (i == count - 1)
                {
                    //蛇头
                    headPoint = blockSnake.Origin;
                    //给蛇头赋值
                    blockSnake.IShead = true;
                }
                blockList.Add(blockSnake);

            }
        }
        //蛇边长函数
        public void snakeGrowth()
        {
            //找到蛇头坐标
            Point head = blockList[blockList.Count - 1].Origin;
            int x = head.X;
            int y = head.Y;
            switch (direction)
            {
                case 0: y = y - 15; break;
                case 1: x = x + 15; break;
                case 2: y = y + 15; break;
                case 3: x = x - 15; break;
            }
            //先把原先蛇块变为普通蛇块
            blockList[blockList.Count - 1].IShead = false;
            //实例化新蛇头
            block headNew = new block();
            headNew.IShead = true;
            headNew.BlockNumber = blockList.Count + 1;
            headNew.Origin = new Point(x, y);
            blockList.Add(headNew);
            headNumber++;
            headPoint = headNew.Origin;
        }
        //蛇先前运动  没有吃到食物
        public void Go(Graphics g)
        {
            block snakeTail = blockList[0];
            //消除蛇块
            snakeTail.UnShowBlock(g);
            //集合中移除尾巴
            blockList.RemoveAt(0);
            //序号全部减1
            foreach (var item in blockList)
            {
                item.BlockNumber--;
            }
            headNumber--;
            snakeGrowth();
        }
        //蛇的方向转换
        public void turnDriction(int pDriction)
        {
            switch (direction)
            {
                //原来向上运动
                case 0:
                    {
                        //希望想做运动
                        if (pDriction == 3)
                            direction = 3;
                        else if (pDriction == 1)
                            direction = 1;
                    }
                 break;
                case 1:
                 {
                     if (pDriction == 2)
                         direction = 2;
                     else if (pDriction == 0)
                         direction = 0;
                     break;
                 }
                case 2:
                 {
                     if (pDriction == 1)
                         direction = 1;
                     else if (pDriction == 3)
                         direction = 3;
                     break;
                 }
                case 3:
                 {
                     if (pDriction == 0)
                         direction = 0;
                     else if (pDriction == 2)
                         direction = 2;
                     break;
                 }                    
            }
        }
        //蛇显示函数
        public void ShowSnake(Graphics g)
        {
            foreach (var item in blockList)
            {
                item.showBlock(g);
            }
        }
        //隐藏蛇
        public void unShowSnake(Graphics g)
        {
            foreach (var item in blockList)
            {
                item.UnShowBlock(g);
            }
        }
        //自己是否会碰到自己
        public bool IsTouchMyself()
        {
            bool isTouch = false;
            for (int i = 0; i < blockList.Count - 1; i++)
            {
                if (headPoint == blockList[i].Origin)
                {
                    isTouch = true;
                    break;
                }
            }
            return isTouch;
        }
        //重置蛇
        public void Reset(Point Map, int count)
        {
            block blockSnake;
            //定义蛇的起始位置
            Point p = new Point(mapLeft.X + 15, mapLeft.Y + 15);
            blockList = new List<block>();
            //循环画蛇块用于填充集合
            for (int i = 0; i < count; i++)
            {
                //x坐标加15
                p.X += 15;
                //实例化蛇块
                blockSnake = new block();
                //定义蛇块左上角位置
                blockSnake.Origin = p;
                //定义蛇块编号    
                blockSnake.BlockNumber = i + 1;
                if (i == count - 1)
                {
                    //蛇头
                    //给蛇头位置赋值
                    headPoint = blockSnake.Origin;
                    blockSnake.IShead = true;
                }
                blockList.Add(blockSnake);
            }
        }
    }

地图类:

 public class Map
    {
        private Point mapLeft;
        private static int unit = 15;
        //定义地图长度为28个蛇块
        private readonly int length = 30 * unit;
        //定义地图宽度为20个蛇块
        private readonly int width = 25 * unit;
        //定义分数
        public int score = 0;
        //定义蛇
        private readonly Snake snake;
        public bool victory = false;
        public Snake Snake
        {
            get { return snake; }
        }
        bean food;
        public Map(Point start)
        {
            //把地图左上角的点赋值给全局变量
            mapLeft = start;
            //实例化蛇
            snake = new Snake(start, 5);
            //实例化食物
            food = new bean();
            food.Origin = new Point(start.X + 30, start.Y + 30);
        }
        //产生一个新食物
        private bean foodRandom()
        {
            Random d = new Random();
            int x = d.Next(0, length / unit);
            int y = d.Next(0, width / unit);
            Point Origin = new Point(mapLeft.X+x*15,mapLeft.Y+y*15);
            bean food = new bean();
            food.Origin = Origin;
            return food;
        }
        //显示新食物方法
        public void showNewFood(Graphics g)
        {
            //消除原先食物
            food.unShowBean(g);
            //产生随机位置的食物
            food = foodRandom();
            //显示新食物
            food.showBean(g);
        }
        //画地图
        public void showMap(Graphics g)
        {
            //创建一支红笔
            Pen pen = new Pen(Color.Blue);
            //画地图框
            g.DrawRectangle(pen, mapLeft.X, mapLeft.Y, length, width);
            //显示食物
            food.showBean(g);
            if (cheakBean())
            {
                //吃到了食物
                //显示新食物
                showNewFood(g);
                //蛇变长
                snake.snakeGrowth();
                //加分
                score += 10;
                //显示蛇
                snake.ShowSnake(g);
            }
            else
            {
                snake.Go(g);
                snake.ShowSnake(g);
            }           
        }
        //判断是否吃到食物
        public bool cheakBean()
        {
            return food.Origin.Equals(snake.HeadPoint);
        }
        //检查蛇是否撞墙
        public bool checkSnake()
        {
            return !(Snake.HeadPoint.X > mapLeft.X - 5 && Snake.HeadPoint.X < (mapLeft.X + length - 5) && Snake.HeadPoint.Y > mapLeft.Y - 5 && Snake.HeadPoint.Y < (mapLeft.Y + width - 5));
        }
        //重新开始
        public void Resect(Graphics g)
        {
            Snake.unShowSnake(g);
            Snake.Reset(mapLeft,5);
        }
    }

窗体代码:

 public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
            //定义地图
            map = new Map(new Point(50, 50));
            this.BackColor  = Color.Silver;
            
        }
        private readonly Map map;
        private int gradeNum = 100;
        private int pink;

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.开始游戏ToolStripMenuItem.Text = "重新开始";
            this.label1.Text = map.score.ToString();
            if (map.score > 500)
            {
                this.timer1.Enabled = false;
                MessageBox.Show("通关");
            }
            Bitmap bmp =new Bitmap(this .Width,this.Height);
            BackgroundImage = bmp;
            Graphics g = Graphics.FromImage(bmp);
            map.showMap(g);
            if (map.checkSnake() || map.Snake.IsTouchMyself())
            {
                this.timer1.Enabled = false;
                MessageBox.Show("失败");
            }
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            UpdateStyles();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            int k, d = 0;
            k = e.KeyValue;
            if (k == 37)
            {
                d = 3;
            }
            if (k == 40)
            {
                d = 2;
            }
            if (k == 38)
            {
                d = 0;
            }
            if (k == 39)
            {
                d = 1;
            }
            map.Snake.turnDriction(d);
        }

        private void 开始游戏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.label2.Text == "")
            {
                MessageBox.Show("请选择级别");
                return;
            }
            if(this .开始游戏ToolStripMenuItem.Text =="开始")
            {
                this.开始游戏ToolStripMenuItem.Text = "重新开始";
                timer1.Enabled = true;
            }
            else if(this .开始游戏ToolStripMenuItem.Text=="重新开始")
            {
                this.开始游戏ToolStripMenuItem.Text = "开始";
                this.继续ToolStripMenuItem.Text = "暂停";
                this.timer1.Enabled = true;
                map.Resect(CreateGraphics());
                map.score = 0;
            }
        }

        private void 继续ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.继续ToolStripMenuItem.Text == "暂停")
            {
                this.继续ToolStripMenuItem.Text = "继续";
                this.timer1.Enabled = true;
            }
            else if (this.继续ToolStripMenuItem.Text == "继续")
            {
                this.继续ToolStripMenuItem.Text = "暂停";
                this.timer1.Enabled = false;
            }
        }
        private void 低级ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            gradeNum = 200;
            this.label2.Text = "菜鸟";
            this.timer1.Interval = gradeNum;
        }

        private void 中级ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            gradeNum = 150;
            this.label2.Text = "平民";
            this.timer1.Interval = gradeNum;
        }

        private void 高级ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            gradeNum = 100;
            this.label2.Text = "高手";
            this.timer1.Interval = gradeNum;
        }

        private void 大神ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            gradeNum = 50;
            this.label2.Text = "大神";
            this.timer1.Interval = gradeNum;
        }
    }

不是自己想的 但是我弄懂了

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/niaofei123/p/12319135.html