Winfrom 极简版贪吃蛇源码
该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序。如果你们有更好的改动方案,欢迎评论。
进入主题吧!
1.创建一个桌面应运程序,拖一个定时器控件。这样,程序界面完成。下面是源码!
/// <summary>
/// 键盘状态,初始为 start
/// </summary>
string Key_Name = "start"; /// <summary>
/// 蛇身数组
/// </summary>
Label[] Snake_Body = new Label[]; /// <summary>
/// 随机数,用于food
/// </summary>
Random R = new Random(); /// <summary>
/// 记录位置
/// </summary>
int Snake_Body_content_x = , Snake_Body_content_y = ; private void Form1_Load(object sender, EventArgs e)
{
this.Top = ;
this.Left = ;
this.Width = ;
this.Height = ;
this.BackColor = Color.White; //初始化一个Label蛇体,长度为5个Label 一个Label height = weight = 10 for (int i = ; i < ; i++)
{
//蛇段
Label Snake_Boby_content = new Label();
Snake_Boby_content.Height = ;
Snake_Boby_content.Width = ; //蛇段的位置
Snake_Boby_content.Top = ;
Snake_Boby_content.Left = - * ; //背景色
this.BackColor = Color.White;
//Snake_Boby_content.BackColor = Color.Black;
//Snake_Boby_content.Text = "▉";
Snake_Boby_content.Image = Image.FromFile(Application.StartupPath + @"\3.png"); //获取或设置包含有关控件的数据的对象
Snake_Boby_content.Tag = i; //加入蛇体
Snake_Body[i] = Snake_Boby_content;
this.Controls.Add(Snake_Boby_content);
} //每隔一段时间发生一次右移
tmTimer.Tick += new EventHandler(tmTimer_Tick); //按键时发生的事件监控
this.KeyDown += new KeyEventHandler(Form1_KeyDown); Snake_food(); //food 生成
//tmTimer.Start(); //计时器开始
tmTimer.Enabled = true;
tmTimer.Interval = ;
} /// <summary>
/// snake的自动移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tmTimer_Tick(object sender, EventArgs e)
{
//用来记录snake的head的xy坐标
int x, y;
x = Snake_Body[].Left;
y = Snake_Body[].Top;
//获取键盘代码 if (Key_Name == "start") //键盘状态处于初始状态
{
Snake_Body[].Left = x + ; //Snake_Body[0]右移10
Snake_move(x, y); //调用
}
if (Key_Name == "Right") //键盘状态处于向右状态
{
Snake_Body[].Left = x + ;
Snake_move(x,y);
}
if (Key_Name == "Up") //键盘状态处于向上状态
{
Snake_Body[].Top = y - ;
Snake_move(x,y);
}
if (Key_Name == "Down")//键盘状态处于向下状态
{
Snake_Body[].Top = y + ;
Snake_move(x, y);
}
if (Key_Name == "Left")//键盘状态处于向左状态
{
Snake_Body[].Left = x - ;
Snake_move(x, y);
} //穿墙设置
if (x > )
{
Snake_Body[].Left = ;
}
if (x < )
{
Snake_Body[].Left = ;
}
if (y > )
{
Snake_Body[].Top = ;
}
if (y < )
{
Snake_Body[].Top = ;
} //每动一次,判断是否与食物重合
Eat_time();
} /// <summary>
/// 对键盘按键输入的响应
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param> private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int x, y;
x = Snake_Body[].Left;
y = Snake_Body[].Top; //获取键盘代码
Key_Name = e.KeyCode.ToString(); if (Key_Name == "Right") //向右
{
Snake_Body[].Left = x + ;
Snake_move(x,y);
}
if (Key_Name == "Up") //向上
{
Snake_Body[].Top = y - ;
Snake_move(x, y);
}
if (Key_Name == "Down") //向下
{
Snake_Body[].Top = y + ;
Snake_move(x, y);
}
if (Key_Name == "Left") //向左
{
Snake_Body[].Left = x - ;
Snake_move(x, y);
} //每按一次,判断是否与食物重合
Eat_time();
} /// <summary>
/// 蛇的自动移动事件
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void Snake_move(int x, int y)
{
//记录x,y的中间变量 跟冒泡排序相同用法,临时存放变量
int temp_x = , temp_y = ; //遍历蛇身进行移动
for (int i = ; Snake_Body[i] != null; i++)
{
if (i >= )
{
//将记录前一个蛇段位置赋给中间变量
temp_x = Snake_Body_content_x;
temp_y = Snake_Body_content_y;
}
if (i == )
{
//将记录蛇头的改变前的位置给x y 赋给第一个蛇段,并记录蛇段的位置
temp_x = Snake_Body[i].Left;
temp_y = Snake_Body[i].Top;
Snake_Body[i].Left = x;
Snake_Body[i].Top = y;
}
else
{
//将记录前一个个蛇段的改变前的位置temp_赋给第二个蛇段,并记录改前位置
Snake_Body_content_x = Snake_Body[i].Left;
Snake_Body_content_y = Snake_Body[i].Top;
Snake_Body[i].Left = temp_x;
Snake_Body[i].Top = temp_y;
}
}
} /// <summary>
/// food的生成事件
/// </summary>
public void Snake_food()
{
//创建食物
Label Food = new Label();
Food.Width = ;
Food.Height = ; //生成一个随机位置的food
Food.Top = R.Next(, ) * ;
Food.Left = R.Next(, ) * ;
// Food.Text = "";
Food.Tag = "food";
Food.Image = Image.FromFile(Application.StartupPath + @"\3.png"); //Application.StartupPath + @"\3.png" 获取程序的根目录中的Debug中的图片
this.Controls.Add(Food);
} /// <summary>
/// 蛇吃食物事件
/// </summary>
public void Eat_time()
{
double x1 = , y1 = , x2 = , y2 = ;
//遍历Controls中所有Lable
foreach (Label lb in this.Controls)
{
//如果lb为food,将lable的位置记录
if (lb.Tag.ToString() == "food".ToString())
{
x2 = lb.Left;
y2 = lb.Top;
}
//如果lable为snake,将lable的位置记录
if (lb.Tag.ToString() == "".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(, ) * ;
lb.Left = R.Next(, ) * ;
}
}
}
} /// <summary>
/// 蛇触碰到食物的事件
/// </summary>
public void Snake_eat()
{
int i = ;
//遍历到蛇尾 将食物添加到最后一个位置
for (; Snake_Body[i] != null; i++) ;
//蛇触碰到food蛇段加1,定义蛇段
Label Snake_Boby_content = new Label();
Snake_Boby_content.Width = ;
Snake_Boby_content.Height = ;
Snake_Boby_content.Top = Snake_Body_content_y; //记录最后一段的位置
Snake_Boby_content.Left = Snake_Body_content_x;
Snake_Boby_content.BackColor = Color.White;
Snake_Boby_content.Image = Image.FromFile(Application.StartupPath + @"\3.png");
Snake_Boby_content.Tag = i;
Snake_Body[i] = Snake_Boby_content;
Snake_Boby_content.BackColor = Color.Black;
this.Controls.Add(Snake_Boby_content);
}
Winfrom 极简版贪吃蛇源码的更多相关文章
- c# 贪吃蛇源码
using UnityEngine; using System.Collections;using System.Diagnostics;using UnityEngine.SceneManageme ...
- H5 贪吃蛇源码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js贪吃蛇源码
1.注意,自己引入jquery,这个demo基于jquery的,我的jquery是写的本地的 2.没有写注释,看不懂的再问我吧, <!DOCTYPE html><html> & ...
- C语言实现贪吃蛇源码
先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...
- Underscore源码阅读极简版入门
看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: https://github.com/hanzichi/underscore-an ...
- OC版贪吃蛇
昨天写了一个js版贪吃蛇,今天突然想写一个OC版的,来对比一下两种语言的区别 oc版功能,适配所有尺寸iphone,可暂停,可设置地图和蛇的比例,可加速 对比一下会发现js版的相对OC版的会简单一些, ...
- TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇
TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...
- android版猜拳游戏源码分享
android版猜拳游戏源码分享安卓版猜拳游戏源码,该文件中带有安装测试包的,这个游戏源码比较简单的,现在有两个代码,一个自定义VIEW的,一个就是普通的imageView图片,游戏非常适合一些新手的 ...
- js消除小游戏(极简版)
js小游戏极简版 (1) 基础布局 <div class = "box"> <p></p> <div class="div&qu ...
随机推荐
- easyUI之表单
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- 面向对语法读取mysql数据库数据例:$db->query($sql)、$result->fetch_array()
前面我们介绍过如何使用面向对象语法连接mysql数据库,今天技术人员继续讲解如何读取数据.虽然与以前面向过程类似,但还是有些不同,需要大家用心了解. echo '面向对象语法连接数据库test db ...
- wpf相关好资源
Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF.aspx Odys ...
- Java SpringBoot React Redux
1.字符串转换相关 - React 前端JS部分 JSON.parse(JSON.stringify(copyRow)); 2.字符串分隔相关,弹出confirm确认框,显示换行信息 - React ...
- 问题root@localhost's password:localhost:permission denied,please try again
转载:https://www.cnblogs.com/hmy-blog/p/6500909.html 经过试验,上述方法在我的电脑中没有成功. 1.安装 open ssh:sudo apt-get i ...
- Python AES加密
使用pycrypto模块https://pypi.python.org/pypi/pycrypto/ >>> from Crypto.Cipher import AES>> ...
- redis 超时失效key 的监听触发使用
redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub / Sub频道,以便以某种方式接收影响Redis数据集的事件. 可能收到的事件的例子如下: 所有 ...
- 关于Content-Type中application/x-www-form-urlencoded 和 multipart/form-data的区别及用法
http://blog.csdn.net/soonfly/article/details/52082547 Form的enctype属性表示页面表单数据向服务器传输时的编码方式, 常用有两种:appl ...
- python-Web-django-商城-不登陆添加购物车
utils: # 商品多级联动 def get_category(categorys)->dict: ''' :param:商品类性 :return: {{[],[]},{[],[]},{[], ...
- DRF序列化器的使用
序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...