首页 > 分享 > C#贪吃蛇小游戏

C#贪吃蛇小游戏

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/define_LIN/article/details/80600980

C#贪吃蛇小游戏

##思路
首先我们生成一个空白的的窗体,然后再放一个timer控件,好了我们的游戏界面就建好了。
直接写后台代码。
没错就是这么简陋,
你可能会问:”蛇喃?“,
别急,别急,
我们的蛇体和食物为在后台生成的label控件,
我们通过控制label控件在界面的显示来表示蛇的移动和生长!

开整
生成成员变量
代码中Key_Name为记录键盘状态的变量,初始为start
label标签的数组Snake_Boby
随机数R
记录位置的两个变量

//定义成员变量 /// <summary> /// 键盘状态,初始为 start /// </summary> string Key_Name = "start"; /// <summary> /// 蛇身数组 /// </summary> Label[] Snake_Boby = new Label[3000]; /// <summary> /// 随机数,用于生成food /// </summary> Random R = new Random(); /// <summary> /// 记录位置 /// </summary> int Snake_Boby_content_x = 0, Snake_Boby_content_y = 0;

1234567891011121314151617

贪吃蛇的初始化
在窗体的初始化事件Form1_Load中添加长度为5个label的蛇身
一个label的初始大小为10*10,并设置其的一些属性。
其中
Timer_Tick为蛇的移动事件,既每隔一次timer.Tick执行一次Timer_Tick
Form1_KeyDown为对键盘的监控
**Snake_food()**为食物的生成事件

private void Form1_Load(object sender, EventArgs e) { this.Top = 120; this.Left = 120; this.Width = 800; this.Height = 800; this.BackColor = Color.Blue; //初始化一个label蛇体,长度为5个label,一个label height= width = 10 for (int i = 0; i < 8; i++) { //蛇段 Label Snake_Boby_content = new Label(); Snake_Boby_content.Height = 10; Snake_Boby_content.Width = 10; //蛇段的位置 Snake_Boby_content.Top = 400; Snake_Boby_content.Left = 400 - i * 10; //背景色 this.BackColor = Color.White; Snake_Boby_content.BackColor = Color.Black; Snake_Boby_content.Text = "▉"; //获取或设置包含有关控件的数据的对象。 Snake_Boby_content.Tag = i; //加入蛇体 Snake_Boby[i] = Snake_Boby_content; this.Controls.Add(Snake_Boby_content); } //每隔一段时间发生一次右移 timer.Tick += new EventHandler(Timer_Tick); //按键时发生的事件监控 this.KeyDown += new KeyEventHandler(Form1_KeyDown); Snake_food(); //food 生成 timer.Start(); //Timer 开始计时 }

12345678910111213141516171819202122232425262728293031323334

蛇的移动事件
蛇的移动事件为整个程序的关键代码,
下面一大溜都是(⓿_⓿)
肯定有人会说博主又要偷懒了,直接把代码复制粘贴不管事了( ఠൠఠ )ノ
哼!
把我当成什么人了?
好的那让我们来看下一个事件!食物的生成!

/// <summary>`在这里插入代码片` /// 对键盘按键输入的响应 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void Form1_KeyDown(object sender, KeyEventArgs e) { int x, y; x = Snake_Boby[0].Left; y = Snake_Boby[0].Top; //获取键盘代码 Key_Name = e.KeyCode.ToString(); if (Key_Name == "Right") //向右 { Snake_Boby[0].Left = x + 10; Snake_move(x, y); } if (Key_Name == "Up") //向上 { Snake_Boby[0].Top = y - 10; Snake_move(x, y); } if (Key_Name == "Down") //向下 { Snake_Boby[0].Top = y + 10; Snake_move(x, y); } if (Key_Name == "Left") //向左 { Snake_Boby[0].Left = x - 10; Snake_move(x, y); } //每按一次,判断是否与食物重合 Eat_time(); } /// <summary> /// snake的自动移动事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void Timer_Tick(object sender, EventArgs e) { //用来记录snake的head的xy坐标 int x, y; x = Snake_Boby[0].Left; y = Snake_Boby[0].Top; if (Key_Name == "start") //键盘状态处于初始状态 { Snake_Boby[0].Left = x + 10;//Snake_Boby[0]右移10 Snake_move(x, y);//调用 } if (Key_Name == "Right") //键盘状态处于 向右 状态 { Snake_Boby[0].Left = x + 10; Snake_move(x, y); } if (Key_Name == "Up") //键盘状态处于 向上 状态 { Snake_Boby[0].Top = y - 10; Snake_move(x, y); } if (Key_Name == "Down") //键盘状态处于 向下 状态 { Snake_Boby[0].Top = y + 10; Snake_move(x, y); } if (Key_Name == "Left") //键盘状态处于 向左 状态 { Snake_Boby[0].Left = x - 10; Snake_move(x, y); } // 穿墙设置 if (x > 800) { Snake_Boby[0].Left = 0; ; } if (x < 0) { Snake_Boby[0].Left = 800; } if (y > 600) { Snake_Boby[0].Top = 0; } if (y < 0) { Snake_Boby[0].Top = 600; } //每动一次,判断是否与食物重合 Eat_time(); } /// <summary> /// 蛇身移动事件 /// </summary> /// <param name="x"></param> /// <param name="y"></param> public void Snake_move(int x, int y) { //记录xy的中间变量 int temp_x = 0, temp_y = 0; //遍历蛇身进行移动 for (int i = 1; Snake_Boby[i] != null; i++) { if(i >= 3) { //将记录的前一个蛇段位置赋给中间变量 temp_x = Snake_Boby_content_x; temp_y = Snake_Boby_content_y; } if (i == 1) { //将记录蛇头的改变前的位置的x y赋给第一个蛇段,并记录蛇段的位置 temp_x = Snake_Boby[i].Left; temp_y = Snake_Boby[i].Top; Snake_Boby[i].Left = x; Snake_Boby[i].Top = y; } else { //将记录前一个个蛇段的改变前的位置temp_赋给第二个蛇段,并记录改前位置 Snake_Boby_content_x = Snake_Boby[i].Left; Snake_Boby_content_y = Snake_Boby[i].Top; Snake_Boby[i].Left = temp_x; Snake_Boby[i].Top = temp_y; } } }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130

当然不是!(o゚v゚)ノ
蛇的移动事件主要包括:

上一个事件中我们用到的每隔一段时间执行一次的Timer_Tick方法,蛇的自动移动方法既通过判别Key_Name(键盘状态)来确定自动移动的方向,改变Snake_Boby[0](蛇头)的位置,然后Snake_Boby[0]位置改变后再调用Snake_move方法,
Snake_move方法是蛇移动的关键,既根据蛇头位置的改变,对蛇体进行遍历,将蛇头后面每一个元素的位置变为它前一个元素改变之前的位置,实现蛇的移动。
Form1_KeyDown方法既当this.KeyDown监控到键盘发生变化时,改变Key_Name(键盘状态)的值,并改变蛇头位置,执行Snake_move
并且这些移动事件最后都要执行**Eat_time()**方法判断是否与食物相遇
###食物生成
也是生成一个label控件,并设置大小,text等属性

/// <summary> /// Food的生成事件 /// </summary> public void Snake_food() { Label Food = new Label(); Food.Width = 20; Food.Height = 20; //生成一个随机位置的food Food.Top = R.Next(1, 20) * 20; Food.Left = R.Next(1, 20) * 20; Food.Text = "❤"; Food.Tag = "food"; Food.BackColor = Color.White; this.Controls.Add(Food); }

1234567891011121314151617

蛇吃食物事件
主要包括:

Eat_time方法判别是否和蛇头相遇,如果相遇,调用Snake_eat方法蛇长加一,且改变食物位置
Snake_eat遍历到蛇尾部,生成一个label位置设为,蛇尾改变前的位置。

public void Eat_time() { double x1 = 20, y1 = 20, x2 = 20, y2 = 20; //遍历Controls中所有label foreach (Label lb in this.Controls) { //如果lb为food,将label的位置记录 if (lb.Tag.ToString() == "food".ToString()) { x2 = lb.Left; y2 = lb.Top; } //如果label为snake,将label的位置记录 if (lb.Tag.ToString() == "0".ToString()) { x1 = lb.Left; y1 = lb.Top; } } if (x2 == x1 && y2 == y1) { Snake_eat(); //将食物移位 foreach (Label lb in this.Controls) { if (lb.Tag.ToString() == "food".ToString()) { lb.Top = R.Next(1, 20) * 20; lb.Left = R.Next(1, 20) * 20; } } } } /// <summary> /// 蛇触碰到食物的事件 /// </summary> private void Snake_eat() { int i = 0; //遍历到蛇尾 for (; Snake_Boby[i] != null; i++) ; //蛇触碰到food蛇段加一,定义蛇段 Label Snake_Boby_content = new Label(); Snake_Boby_content.Width = 10; Snake_Boby_content.Height = 10; Snake_Boby_content.Top = Snake_Boby_content_y; Snake_Boby_content.Left = Snake_Boby_content_x; Snake_Boby_content.BackColor = Color.White; Snake_Boby_content.Text = "▉"; Snake_Boby_content.Tag = i; Snake_Boby[i] = Snake_Boby_content; Snake_Boby_content.BackColor = Color.Black; this.Controls.Add(Snake_Boby_content); }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

本文转载自:C#winform 经典小游戏贪吃蛇V1.0(一)

相关知识

C#贪吃蛇小游戏
C#宠物小游戏《scw》的操作与命名教程
C的课程规范设计贪吃蛇小游戏内附完整源码及附件.doc
贪吃蛇游戏程序设计实验报告
使用MaxKB 增加互动小游戏——贪吃蛇
基于单片机的贪吃蛇游戏设计
python+pygame 贪吃蛇游戏
可爱宠物竞技网游 贪吃蛇
用C语言实现贪吃蛇游戏
贪吃蛇小游戏,在线玩,4399小游戏

网址: C#贪吃蛇小游戏 https://m.mcbbbk.com/newsview657289.html

所属分类:萌宠日常
上一篇: 利用unity3D制作贪吃蛇
下一篇: 贪吃蛇(C语言)2018