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 ...
随机推荐
- <JavaScript>数组的sort()方法中比较函数是怎么工作的
sort()函数比较时调用的是每个数组项的toString()方法,并非按数值大小进行比较,所以往往得不到我们想要的结果. 比如: ,,,,]; values.sort( ); alert(value ...
- PCD(点云数据)文件格式
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=54 为什么用一种新的文件格式? PCD文件格式并非白费力气地做重复工作,现有 ...
- 005-文件权限解说、授权chmod和chown命令的用法
一.文件权限说明 1.1.linux 中 drwxr-xr-x权限含义 在 linux drwxr-xr-x意思如下: 第一位表示文件类型.d是目录文件,l是链接文件,-是普通文件,p是管道. 后面的 ...
- Qt编写自定义控件17-按钮进度条
前言 按钮进度条,顾名思义,表面上长得像一个按钮,单击以后切换成进度条指示按钮单击动作执行的进度,主要用在一些需要直接在按钮执行动作显示对应进度的场景,在很多网页中经常看到这种效果,这个效果有个优点就 ...
- 一百一十二:CMS系统之前台用户模型
安装shortuuid用于前台用户的主键:pip install shortuuid 创建模型 from datetime import datetimeimport enumfrom werkzeu ...
- python 连接 hive
1.python连接hive,其实是连接hiveserver,连接的包的impyla impyla安装: error: cc1plus 没有文件或目录 需要安装gcc 和g++,并且版本保持一致 er ...
- java 与 c# 3des 加解密
java 与 c# 3des 加解密 主要差异如下: 1. 对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...
- maria 忘记密码
1.找到mariadb配置文件命令:find / -name my.cnf 备注:一般是在 /etc/my.cnf 2.修改配置文件 在MariaDB配置文件/etc/my.cnf的[mysqld]配 ...
- 27.IP承载网容量仿真
接入,汇聚,核心 参考资料: 学堂在线,移动通信技术(2019秋)https://next.xuetangx.com/learn/SZIIT61031001367/SZIIT61031001367/1 ...
- 快速排序的js实现
该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. var ...