博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Winfrom 极简版贪吃蛇源码
阅读量:6819 次
发布时间:2019-06-26

本文共 9174 字,大约阅读时间需要 30 分钟。

  该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序。如果你们有更好的改动方案,欢迎评论。

  进入主题吧!

  1.创建一个桌面应运程序,拖一个定时器控件。这样,程序界面完成。下面是源码!

     

1 ///   2         /// 键盘状态,初始为  start  3         ///   4         string Key_Name = "start";  5   6         ///   7         /// 蛇身数组  8         ///   9         Label[] Snake_Body = new Label[3000]; 10  11         ///  12         /// 随机数,用于food 13         ///  14         Random R = new Random(); 15  16         ///  17         /// 记录位置 18         ///  19         int Snake_Body_content_x = 0, Snake_Body_content_y = 0; 20  21  22         private void Form1_Load(object sender, EventArgs e) 23         { 24             this.Top = 120; 25             this.Left = 120; 26             this.Width = 800; 27             this.Height = 800; 28             this.BackColor = Color.White; 29  30             //初始化一个Label蛇体,长度为5个Label 一个Label height = weight = 10 31  32             for (int i = 0; i < 8; i++) 33             { 34                 //蛇段 35                 Label Snake_Boby_content = new Label(); 36                 Snake_Boby_content.Height = 20; 37                 Snake_Boby_content.Width = 20; 38  39                 //蛇段的位置 40                 Snake_Boby_content.Top = 400; 41                 Snake_Boby_content.Left = 400 - 2 * 10; 42  43                 //背景色 44                 this.BackColor = Color.White; 45                 //Snake_Boby_content.BackColor = Color.Black; 46                 //Snake_Boby_content.Text = "▉"; 47                 Snake_Boby_content.Image = Image.FromFile(Application.StartupPath + @"\3.png"); 48  49                 //获取或设置包含有关控件的数据的对象 50                 Snake_Boby_content.Tag = i; 51  52                 //加入蛇体 53                 Snake_Body[i] = Snake_Boby_content; 54                 this.Controls.Add(Snake_Boby_content); 55             } 56  57             //每隔一段时间发生一次右移 58             tmTimer.Tick += new EventHandler(tmTimer_Tick); 59  60             //按键时发生的事件监控 61             this.KeyDown += new KeyEventHandler(Form1_KeyDown); 62  63             Snake_food();  //food 生成 64             //tmTimer.Start(); //计时器开始 65             tmTimer.Enabled = true; 66             tmTimer.Interval = 300; 67         } 68  69         ///  70         /// snake的自动移动事件 71         ///  72         ///  73         ///  74         private void tmTimer_Tick(object sender, EventArgs e) 75         { 76             //用来记录snake的head的xy坐标 77             int x, y; 78             x = Snake_Body[0].Left; 79             y = Snake_Body[0].Top; 80             //获取键盘代码 81              82             if (Key_Name == "start")  //键盘状态处于初始状态 83             { 84                 Snake_Body[0].Left = x + 20;  //Snake_Body[0]右移10 85                 Snake_move(x, y);  //调用 86             } 87             if (Key_Name == "Right")  //键盘状态处于向右状态 88             { 89                 Snake_Body[0].Left = x + 20; 90                 Snake_move(x,y); 91             } 92             if (Key_Name == "Up") //键盘状态处于向上状态 93             { 94                 Snake_Body[0].Top = y - 20; 95                 Snake_move(x,y); 96             } 97             if (Key_Name == "Down")//键盘状态处于向下状态 98             { 99                 Snake_Body[0].Top = y + 20;100                 Snake_move(x, y);101             }102             if (Key_Name == "Left")//键盘状态处于向左状态103             {104                 Snake_Body[0].Left = x - 20;105                 Snake_move(x, y);106             }107 108             //穿墙设置109             if (x > 800)110             {111                 Snake_Body[0].Left = 0;112             }113             if (x < 0)114             {115                 Snake_Body[0].Left = 800;116             }117             if (y > 600)118             {119                 Snake_Body[0].Top = 0;120             }121             if (y < 0)122             {123                 Snake_Body[0].Top = 600;124             }125 126             //每动一次,判断是否与食物重合127             Eat_time();128         }129 130         /// 131         /// 对键盘按键输入的响应132         /// 133         /// 134         /// 135 136         private void Form1_KeyDown(object sender, KeyEventArgs e)137         {138             int x, y;139             x = Snake_Body[0].Left;140             y = Snake_Body[0].Top;141 142             //获取键盘代码143             Key_Name = e.KeyCode.ToString();144 145             if (Key_Name == "Right") //向右146             {147                 Snake_Body[0].Left = x + 20;148                 Snake_move(x,y);149             }150             if (Key_Name == "Up") //向上151             {152                 Snake_Body[0].Top = y - 20;153                 Snake_move(x, y);154             }155             if (Key_Name == "Down") //向下156             {157                 Snake_Body[0].Top = y + 20;158                 Snake_move(x, y);159             }160             if (Key_Name == "Left") //向左161             {162                 Snake_Body[0].Left = x - 20;163                 Snake_move(x, y);164             }165 166             //每按一次,判断是否与食物重合167             Eat_time();168         }169 170         /// 171         /// 蛇的自动移动事件172         /// 173         /// 174         /// 175         public void Snake_move(int x, int y)176         {177             //记录x,y的中间变量   跟冒泡排序相同用法,临时存放变量178             int temp_x = 0, temp_y = 0;179 180             //遍历蛇身进行移动181             for (int i = 1; Snake_Body[i] != null; i++)182             {183                 if (i >= 3)184                 {185                     //将记录前一个蛇段位置赋给中间变量186                     temp_x = Snake_Body_content_x;187                     temp_y = Snake_Body_content_y;188                 }189                 if (i == 1)190                 {191                     //将记录蛇头的改变前的位置给x y 赋给第一个蛇段,并记录蛇段的位置192                     temp_x = Snake_Body[i].Left;193                     temp_y = Snake_Body[i].Top;194                     Snake_Body[i].Left = x;195                     Snake_Body[i].Top = y;196                 }197                 else198                 {199                     //将记录前一个个蛇段的改变前的位置temp_赋给第二个蛇段,并记录改前位置200                     Snake_Body_content_x = Snake_Body[i].Left;201                     Snake_Body_content_y = Snake_Body[i].Top;202                     Snake_Body[i].Left = temp_x;203                     Snake_Body[i].Top = temp_y;204                 }205             }206         }207 208         /// 209         /// food的生成事件210         /// 211         public void Snake_food()212         {213             //创建食物214             Label Food = new Label();215             Food.Width = 20;216             Food.Height = 20;217 218             //生成一个随机位置的food219             Food.Top = R.Next(1, 20) * 20;220             Food.Left = R.Next(1, 20) * 20;221             // Food.Text = "";222             Food.Tag = "food";223             Food.Image = Image.FromFile(Application.StartupPath + @"\3.png");  //Application.StartupPath + @"\3.png"  获取程序的根目录中的Debug中的图片224             this.Controls.Add(Food);225         }226 227         /// 228         /// 蛇吃食物事件229         /// 230         public void Eat_time()231         {232             double x1 = 20, y1 = 20, x2 = 20, y2 = 20;233             //遍历Controls中所有Lable234             foreach (Label lb in this.Controls)235             {236                 //如果lb为food,将lable的位置记录237                 if (lb.Tag.ToString() == "food".ToString())238                 {239                     x2 = lb.Left;240                     y2 = lb.Top;241                 }242                 //如果lable为snake,将lable的位置记录243                 if (lb.Tag.ToString() == "0".ToString())244                 {245                     x1 = lb.Left;246                     y1 = lb.Top;247                 }248             }249 250             if (x2 == x1 && y2 == y1)  //判断蛇头和食物是否重合,251             {252                 Snake_eat();253 254                 //重新随机生成食物255                 foreach (Label lb in this.Controls)256                 {257                     if (lb.Tag.ToString() == "food".ToString())258                     {259                         lb.Top = R.Next(1, 20) * 20;260                         lb.Left = R.Next(1, 20) * 20;261                     }262                 }263             }264         }265 266         /// 267         /// 蛇触碰到食物的事件268         /// 269         public void Snake_eat()270         {271             int i = 0;272             //遍历到蛇尾 将食物添加到最后一个位置273             for (; Snake_Body[i] != null; i++) ;274                 //蛇触碰到food蛇段加1,定义蛇段275                 Label Snake_Boby_content = new Label();276                 Snake_Boby_content.Width = 20;277                 Snake_Boby_content.Height = 20;278                 Snake_Boby_content.Top = Snake_Body_content_y;  //记录最后一段的位置279                 Snake_Boby_content.Left = Snake_Body_content_x;280                 Snake_Boby_content.BackColor = Color.White;281                 Snake_Boby_content.Image = Image.FromFile(Application.StartupPath + @"\3.png");282                 Snake_Boby_content.Tag = i;283                 Snake_Body[i] = Snake_Boby_content;284                 Snake_Boby_content.BackColor = Color.Black;285                 this.Controls.Add(Snake_Boby_content);286         }

 

转载于:https://www.cnblogs.com/pushYYL/p/10069332.html

你可能感兴趣的文章
Less学习
查看>>
一个在线的C++帮助文档网站 转载
查看>>
软件架构的5种视图
查看>>
jQuery相关知识总结
查看>>
瑞星:“007小游戏论坛”、“2144小游戏”等网站被挂马
查看>>
用情境搜索开启未来之路,互联网营销
查看>>
一起谈.NET技术,在ASP.NET中自动合并小图片并使用CSS Sprite显示出来
查看>>
VMwave Workstation 12 PRO 下安装黑苹果OS X 10.11.1教程
查看>>
eval & exec(绕过长度限制思路学习)
查看>>
python学习资料
查看>>
JQuery与js具体使用的区别(不全,初学)
查看>>
Hyper-V快速导入虚拟机的两个注意事项
查看>>
【转】getopt模块,实现获取命令行参数
查看>>
安装JDK和配置环境变量
查看>>
behavior planning——10 behaior planning pseudocode
查看>>
C# 正则表达式大全
查看>>
jquery获取radio选中的值或者select做出判断事件
查看>>
STL——queue
查看>>
说一下函数重载和覆盖的区别
查看>>
C++关键字--volatile
查看>>