该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序。如果你们有更好的改动方案,欢迎评论。
进入主题吧!
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 }