问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c#编程贪吃蛇

发布网友 发布时间:2022-04-23 13:57

我来回答

1个回答

热心网友 时间:2022-05-18 17:40

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;

namespace SnakeGame
{
    public partial class frmSnake : Form
    {
        public Point FoodLct = new Point();//缓存食物的坐标  
        public int snakeLen = 6;
        public const int SnakeMaxLength = 500;
        public Point[] snakeArr = new Point[SnakeMaxLength];
        public int snakeDrt = 2;
        public bool panDuan = true;
        public frmSnake()
        {
            InitializeComponent();
            int temp = 0;
            for (int i = snakeLen - 1; i >= 0; i--)
            {
                snakeArr[i].X = temp; snakeArr[i].Y = 0; 
                temp += 15;
            }
        }

        /*
        前言  
        说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧。  

        其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及到画图什么的,其实现在来看,实现很简单。  

        实现贪吃蛇首先有几个元素:  
        蛇  
        食物  

        然后有几个行为:  
        吃食物和吃不到食物  
        撞墙和撞自己  
        说到这有点oo的意思啊,这篇就不啰嗦,只是简单实现,下篇会优化下。  

        其实整个贪吃蛇的难点就在于画图,可能用其他语言实现有点复杂,但是强大的.net提供了GDI+绘图机制,实现起来就很方便了,其次就是细节的处理,比如坐标的定位,蛇的行走路线等。  

        我们简单一点来看,食物可以看成一个小方格,蛇是有N个小方格组成,那我们就可以用GDI+这样实现:


        /// <summary>  
        /// 画一个小方块  
        /// </summary>  
        public void DrawShape(int x, int y)
        {
            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.Blue, 2);
            g.DrawRectangle(pen, x, y, 15, 15);
            g.FillRectangle(Brushes.Green, x, y, 15, 15);
        }

        /// <summary>  
        /// 画一个食物  
        /// </summary>  
        public void DrawFood(int x, int y)
        {
            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.Red, 2);
            SolidBrush brush = new SolidBrush(Color.Green);
            g.DrawRectangle(pen, x, y, 15, 15);
            g.FillRectangle(brush, x, y, 15, 15);
        }

        Graphics这个类我就不多说,大家可以看看MSDN上介绍的用法,上面是画蛇的最小单元-方格,和一个食物方格,蛇的方格大小是15*15,边框颜色是Blue,填充色是Green;食物方格的大小是15*15,边框颜色是Red,填充色是Green。  

        画好了基本元素,那下面就是用基本元素来表现蛇了,可以用Point数组来存储蛇的坐标,也就是每个方格的坐标,我们先看下代码: 
        /// <summary>  
        /// 设置Point数组坐标  
        /// </summary>  
        public void Forward(int drt)
        {
            Point temp = snakeArr[0];
            for (int i = snakeLen - 1; i > 0; i--)
            {
                snakeArr[i].X = snakeArr[i - 1].X;
                snakeArr[i].Y = snakeArr[i - 1].Y;
            }

            switch (drt)
            {
                case 1:
                    snakeArr[0].X = temp.X;
                    snakeArr[0].Y = temp.Y - 15;
                    break; //上   
                case 2:
                    snakeArr[0].X = temp.X + 15;
                    snakeArr[0].Y = temp.Y;
                    break; //右   
                case 3:
                    snakeArr[0].X = temp.X;
                    snakeArr[0].Y = temp.Y + 15;
                    break; //下   
                case 4:
                    snakeArr[0].X = temp.X - 15;
                    snakeArr[0].Y = temp.Y;
                    break; //左   
            }
        }
        drt参数是键盘上上下左右键对应的数字,snakeLen是数组的长度也就是方格的个数,上面那个for循环主要的作用是把前一个数组的坐标赋值给下一个,就像是毛毛虫爬行一样,后一节会按照前一节的路线来爬,下面那个switch的作用是,设置蛇头的行进路线。  

        再下面就是判断蛇是否吃到食物、是否撞到墙和撞到自己,因为蛇和食物都是用坐标存储的,所以只要判断蛇头坐标是否等于食物坐标就可以了:  

        /// <summary>  
        /// 判断是否吃到食物           
        /// </summary>  
        public bool EatedFoot(Point FoodLct)
        {
            if (snakeArr[0].X == FoodLct.X && snakeArr[0].Y == FoodLct.Y)
            {
                if (snakeLen < SnakeMaxLength)
                {
                    snakeLen++;
                    snakeArr[snakeLen].X = snakeArr[snakeLen - 1].X;
                    snakeArr[snakeLen].Y = snakeArr[snakeLen - 1].Y;
                }
                return true;
            }
            else
                return false;
        }

        /// <summary>  
        /// 判断是否撞到自己         
        /// </summary>  
        public bool CheckSnakeHeadInSnakeBody()
        {
            return this.CheckInSnakeBody(this.snakeArr[0].X, this.snakeArr[0].Y, 1);
        }

        /// <summary>  
        /// 检查输入的坐标是否在蛇的身上
        /// </summary>  
        public bool CheckInSnakeBody(int x, int y, int snkHead)
        {
            for (int i = snkHead; i < snakeLen; i++)
            {
                if (x == this.snakeArr[i].X && y == this.snakeArr[i].Y)
                {
                    return true;
                }
            } return false;
        }

        /// <summary>  
        /// 判断是否撞墙
        /// </summary>  
        /// <returns></returns>  
        public bool CheckSnakeBodyInFrm()
        {
            if (this.snakeArr[0].X >= 594 || this.snakeArr[0].Y >= 399 - 32 || this.snakeArr[0].X < 0 || this.snakeArr[0].Y < 0)
                return true;
            else
                return false;
        }*/

        /*实现上面的几个步骤,简单版的贪吃蛇基本上就完成了,再加上一个timer控件,这样蛇就会“动”起来了,就这么简单。  
        完整代码:*/

        /// <summary>  
        /// 画一个小方块           
        /// </summary>  
        public void DrawShape(int x, int y)
        {
            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.Blue, 2);
            g.DrawRectangle(pen, x, y, 15, 15);
            g.FillRectangle(Brushes.Green, x, y, 15, 15);
        }

        /// <summary>  
        /// 画一个食物           
        /// </summary>  
        public void DrawFood(int x, int y)
        {
            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.Red, 2);
            SolidBrush brush = new SolidBrush(Color.Green);
            g.DrawRectangle(pen, x, y, 15, 15);
            g.FillRectangle(brush, x, y, 15, 15);
        }

        /// <summary>  
        /// 设置Point数组坐标           
        /// </summary>  
        public void Forward(int drt)
        {
            Point temp = snakeArr[0];
            for (int i = snakeLen - 1; i > 0; i--)
            {
                snakeArr[i].X = snakeArr[i - 1].X;
                snakeArr[i].Y = snakeArr[i - 1].Y;
            }
            switch (drt)
            {
                case 1: snakeArr[0].X = temp.X; snakeArr[0].Y = temp.Y - 15; break; //上   
                case 2: snakeArr[0].X = temp.X + 15; snakeArr[0].Y = temp.Y; break; //右   
                case 3: snakeArr[0].X = temp.X; snakeArr[0].Y = temp.Y + 15; break; //下   
                case 4: snakeArr[0].X = temp.X - 15; snakeArr[0].Y = temp.Y; break; //左   
            }
        }

        /// <summary>  
        /// 时间事件           /// </summary>  
        private void timer1_Tick(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.Clear(Color.DarkKhaki);//清除整个画面  

            Forward(snakeDrt);
            for (int i = 0; i < snakeLen; i++)
            {
                DrawShape(snakeArr[i].X, snakeArr[i].Y);
            }
            if (panDuan)
            {
                ShowFood();//DrawFood(FoodLct.X, FoodLct.Y);  
                panDuan = false;
            }
            if (EatedFoot(FoodLct))
            {
                ShowFood();
                DrawFood(FoodLct.X, FoodLct.Y);
            }
            else
            {
                DrawFood(FoodLct.X, FoodLct.Y);
            }
            if (CheckSnakeHeadInSnakeBody() || CheckSnakeBodyInFrm())
            {
                this.timer1.Enabled = false;
                MessageBox.Show("游戏结束!");
            }
        }

        /// <summary>  
        /// 按下方向键
        /// </summary>  
        private void frmSnake_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Up) snakeDrt = 1;
            else if (e.KeyCode == Keys.Down)
                snakeDrt = 3;
            else if (e.KeyCode == Keys.Right)
                snakeDrt = 2;
            else if (e.KeyCode == Keys.Left)
                snakeDrt = 4;
        }

        /// <summary>  
        /// 判断是否撞到自己
        /// </summary>  
        public bool CheckSnakeHeadInSnakeBody()
        {
            return this.CheckInSnakeBody(this.snakeArr[0].X, this.snakeArr[0].Y, 1);
        }

        /// <summary>  
        /// 检查输入的坐标是否在蛇的身上
        /// </summary>  
        public bool CheckInSnakeBody(int x, int y, int snkHead)
        {
            for (int i = snkHead; i < snakeLen; i++)
            {
                if (x == this.snakeArr[i].X && y == this.snakeArr[i].Y)
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>  
        /// 判断是否撞墙
        /// </summary>  
        /// <returns></returns>  
        public bool CheckSnakeBodyInFrm()
        {
            if (this.snakeArr[0].X >= 594 || this.snakeArr[0].Y >= 399 - 32 || this.snakeArr[0].X < 0 || this.snakeArr[0].Y < 0)
                return true;
            else
                return false;
        }

        /// <summary>  
        /// 随机显示食物
        /// </summary>  
        public void ShowFood()
        {
            Random rmd = new Random();
            int x, y; x = rmd.Next(0, this.Width / 15) * 15;
            y = rmd.Next(0, this.Height / 15) * 15;
            //while (this.CheckInSnakeBody(x, y, 1))   
            //{            
            //    x = rmd.Next(0, 32) * 15;    
            //    y = 32 + rmd.Next(0, 30) * 15;           
            //}  
            FoodLct.X = x;
            FoodLct.Y = y;
        }

        /// <summary>  
        /// 判断是否吃到食物
        /// </summary>  
        public bool EatedFoot(Point FoodLct)
        {
            if (snakeArr[0].X == FoodLct.X && snakeArr[0].Y == FoodLct.Y)
            {
                if (snakeLen < SnakeMaxLength)
                {
                    snakeLen++;
                    snakeArr[snakeLen].X = snakeArr[snakeLen - 1].X; 
                    snakeArr[snakeLen].Y = snakeArr[snakeLen - 1].Y;
                } return true;
            }
            else
                return false;
        }
    }
}

C# 贪吃蛇的移动步数怎写?

C#生存简单的贪吃蛇游戏 功能实现:贪吃蛇的左右上下移动;贪吃蛇吃食物;贪吃蛇碰到墙或者身体死亡;主函数 Program.cs using System;using System.Threading;namespace CmdSnake { class Program { static void Main(string[] args){ /// /// 初始化 /// Snake.Instance().Start();Map.Instance(...

请问C#里的刷屏和输入(贪吃蛇的控制键那种)的语句都是什么啊?_百度知 ...

控制好说啦,获得用户输入的按键 switch(用户按下的键)case 上:case 下:case 左:case 右:case 其他:default:至于刷屏就看你用什么方法实现显示的啦,一般就是用timer每隔一小段时间把你的贪吃蛇的属性显示一遍。看看下面的代码,演示了一个蛇头向右移动的例子:当然这只是一种演示,实际的游戏不应该...

vs如何使用别人的c#代码,比如说贪吃蛇?

获取源代码:首先需要获取贪吃蛇游戏的源代码。通常情况下,您可以在GitHub等开源代码库中找到现成的贪吃蛇游戏源码。导入代码:将贪吃蛇游戏的源码导入到 Visual Studio 中。可以通过“文件”-&gt;“打开”-&gt;“项目/解决方案”来打开已有项目,或使用“新建项目”创建一个新项目,并将源码文件添加到项目中。编...

求C#自动玩贪吃蛇的源代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Collections;namespace WindowsApplication1 { public partial class Form1 : Form { public Form1(){ InitializeComponent();} p...

利用c# 编写贪吃蛇游戏如何修改label的属性

1 新建项目,选择c#语言,Windows程序 2 右边的窗口中有 form1.cs ,它有两种查看方式,可以使用 设计的方式,也可以使用代码的方式,代码的方式查看如下。3 设置主窗体的属性,属性工具栏也在右边,设置的属性如图所示。4 切换到设计模式下面 打开工具箱,拖一个 pictureBox控件到主窗口。同时设置...

贪吃蛇C#程序设计之错误--未处理 System.NullReferenceException...

贪吃蛇C#程序设计之错误--未处理 System.NullReferenceException 部分源代码:Pointp1=snake.Head;Pointp2;for(inti=0;i&lt;snake.Bodypoints.Count;i++){p2=snake.Bodypoints[i];if(IsFoodBetweenSnakeBody(p1,p2,food)){returnfalse;}p1=p2;}出错地点... 部分源代码: Point p1 = snake.Head; Point p2; ...

关于用C#写贪吃蛇的问题

1:前进方向 前进方向统一时间只有一个,也就是说当你按上下左右后 把你所按的值改变前进方向(你可以先用 button 来做。4个button 分别选择4个方向)2:移动速度 不论你是否按了方向蛇都是会移动的!所以这里你可以用一个循环来控制蛇移动 而你按了上下左右之后知识改变方向 3:边界 这个给你个...

用C#写的贪吃蛇 我已经把KeyPreview的值设为true了 可是按键盘还是没反...

按照下面的步骤来做。先删除掉你的KeyDown处理函数和Paint处理函数 打开Form的属性窗口,点击上面的闪电符号,会显示出Form的所有事件。默认已经有XXXXXX_Load的函数了。3. 找到KeyDown事件,在KeyDown右侧的空白处双击,就会自动创建一个xxxxForm_KeyDown的处理函数。同样,选中pictureBox1控件,在它的...

C#窗体贪吃蛇的游戏界面是怎么做的?就是贪吃蛇那个游戏的每个小方框是...

直接在窗体上调用GDI函数画x*y个rectangle就行了.蛇可以用不同的颜色来画.与俄罗斯方块是差不多的.

C#做的贪吃蛇游戏,如何添加做存盘读盘功能呢,代码怎么写

1.蛇的当前组成、每个组成的位置、坐标,或是你自己的描述 2.当前关卡(这个你应该固化为程序资源)的索引以及当前观其游戏的进行的时间——记录时间可以重现,蛇的当前食物,食物的刷新节奏。(前提是,你的食物刷新已经规律化,根据 当前关卡的运行时间,比如每五秒一个苹果,持续2秒,那么你记录的...

贪吃蛇游戏编程c语言 贪吃蛇编程代码 scratch贪吃蛇的程序 c语言贪吃蛇游戏代码程序 c程序代码贪吃蛇 贪吃蛇程序 如何用scratch做贪吃蛇游戏 c语言游戏贪吃蛇源码 c语言实现贪吃蛇
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
超价观念与固执的区别 阅读摘录24—超价观念 超价观念是不是就是错误观念? 超价观念是一种什么观念? ...把成语补写完整再和右边相应的水果连一连什么小口 227亿的嗓子怎么来的 哪些卡通人物受到孩子们的喜爱? 别再叫我"讴歌王"了!长安UNI-T打响冲击高端首战 现在又没有九寨沟旅游的专列啊 北京丰台车站附近景点_北京清河站附近有什么景点吗 我的上嘴唇长了好多小颗粒(就上唇有),不痛不痒.谁能告诉是怎么回事啊!?怎样才能让它们消失呢? 贪吃蛇plc编程思路 上嘴唇有些黄色小颗粒 怎么办? 贪吃蛇编程 嘴唇上好多小颗粒,淡白色,密密麻麻是怎么回事,谁能告诉我要任何解决,急 求贪吃蛇的程序代码(c语言) 嘴巴上唇长很多白色小颗粒,像鱼籽一样的,请问是什么原因,应该怎么去除? 我嘴唇上长了一些小颗粒,有好几年了,不疼不痒可是好像越来越多了,嘴角处最多,这是什么病?要怎么治啊 我嘴角里面出现很多小颗粒,怎么回事 嘴唇上面长了一些白色的小颗粒要怎么消除 嘴巴周围下巴长很多小颗粒,该怎么办 嘴边有哪种摸起来的小颗粒怎么去掉? 一个女头像背景是蓝色头顶拿着花情侣头像 卡通情侣头像女的胸前拿花 求情侣头像,女的头上戴花,且有花遮住左眼,求另一半的图片。在线等,急求! 情侣头像,带花,只要带花的都给我一下 求情侣头像有花遮脸的 大概是你喜欢花,而我姓叶是情侣头像吗? 彼岸花情侣头像 情侣头像一左一右 手里拿花 嘴唇上长了很多小颗粒 一般是什么引起上嘴唇有好多白色颗粒状白点,怎样进行 贪吃蛇游戏的C语言编程 上火了,嘴角上长了几颗粒粒,怎么办? 用C语言编写贪吃蛇游戏的程序 嘴唇、下巴上长了好多的小颗粒,怎么办 我的上嘴唇长了这样的东西,密密麻麻的小颗粒在表皮内,不仔细看就是一片一片的白,不疼不痒的,就类似图 嘴角密密麻麻小颗粒 不痛不痒的。怎么办啊 好久了下不去 求贪吃蛇的C++程序代码 嘴唇上有小颗粒很多是怎么了 如何自己编写一个贪吃蛇的游戏软件? 鼻子和嘴附近有小颗粒像鸡皮疙瘩一样里面有脂肪粒怎么解决 在dos环境下c语言编程编一个贪吃蛇游戏 嘴巴周围长白包颗粒是脂肪粒吗,怎么去除 关於贪吃蛇编程 嘴唇上长了好多小颗粒,不痛不痒,密密麻麻 怎样用c++编一个简单的贪吃蛇游戏 急求 设计贪吃蛇实验报告 win7 word自动保存文件被删除了如何恢复? 如何恢复上次保存的word文档?【200分】