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 ...
随机推荐
- Javah提示未找到 ..的类
Javah相关错误,如下图所示:
- harber私有镜像仓库(4)
一.部署准备: 准备harbor软件包 在部署节点上: #mv harbor-offline-installer-v1.4.0.tgz /opt/ && cd /opt #tar zx ...
- Python3 Selenium自动化web测试 ==> 第五节 WebDriver高级应用 -- 使用JavaScript操作页面元素
学习目的: 中级水平技术提升 在WebDriver脚本代码中执行JS代码,可以解决某些 .click()方法无法生效等问题 正式步骤: Python3代码如下 # -*- coding:utf-8 - ...
- Linux下十大命令行下载工具
Wget 这是最有名的工具,可用于通过CLI下载.这款工具功能很丰富,可以充当某种功能完备的GUI下载管理器,它拥有一款理想的下载管理器所需要的所有功能,比如它可以恢复下载,可以下载多个文件,出现某个 ...
- robots.txt文件
网站通过一个符合Robots协议的robots.txt文件来告诉搜索引擎哪些页面可以爬取.Robots.txt协议全称“网络爬虫排除标准”.一般情况下,该文件以一行或多行User-agent记录开始, ...
- 【计算机视觉】UCLA开源图像检测器
UCLA (加州大学洛杉矶分校)发布了一个强大的图像检测软件的源码 ,该软件可以非常高速的检测每个图像的细节,例如可用于检测指纹和虹膜,或者用于自动驾驶.通过识别物体的边界进行提取.首先确定一个物体的 ...
- JS 自定义字典对象
<script type="text/javascript" language="javascript"> //自定义字典对象 function D ...
- Python全栈开发之5、模块
一.模块 1.import导入模块 #1.定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑),本质就是.py结尾的python文件,实现一个功能 包:python package 用 ...
- 2019牛客暑期多校训练营(第八场)-A All-one Matrices (单调栈+前缀和)
题目链接:https://ac.nowcoder.com/acm/contest/888/A 题意:给n×m的01矩阵,求出其中全为1的矩阵个数(不被其它全1矩阵包括). 思路:和第二场多校的次大子矩 ...
- Spring IOC的底层实现原理
PS:模块之间的相互依赖叫做耦合 传统方式的开发 UserService us=new UserService(); || v 面向接口编程 UserService us=new UserServi ...