该源码是我在百度知识库借助前辈的的经验,加上自己的一点小改动写的一个非常简陋的贪吃蛇小程序。如果你们有更好的改动方案,欢迎评论。

  进入主题吧!

  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 极简版贪吃蛇源码的更多相关文章

  1. c# 贪吃蛇源码

    using UnityEngine; using System.Collections;using System.Diagnostics;using UnityEngine.SceneManageme ...

  2. H5 贪吃蛇源码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. js贪吃蛇源码

    1.注意,自己引入jquery,这个demo基于jquery的,我的jquery是写的本地的 2.没有写注释,看不懂的再问我吧, <!DOCTYPE html><html> & ...

  4. C语言实现贪吃蛇源码

    先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...

  5. Underscore源码阅读极简版入门

    看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: https://github.com/hanzichi/underscore-an ...

  6. OC版贪吃蛇

    昨天写了一个js版贪吃蛇,今天突然想写一个OC版的,来对比一下两种语言的区别 oc版功能,适配所有尺寸iphone,可暂停,可设置地图和蛇的比例,可加速 对比一下会发现js版的相对OC版的会简单一些, ...

  7. TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇

    TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...

  8. android版猜拳游戏源码分享

    android版猜拳游戏源码分享安卓版猜拳游戏源码,该文件中带有安装测试包的,这个游戏源码比较简单的,现在有两个代码,一个自定义VIEW的,一个就是普通的imageView图片,游戏非常适合一些新手的 ...

  9. js消除小游戏(极简版)

    js小游戏极简版 (1) 基础布局 <div class = "box"> <p></p> <div class="div&qu ...

随机推荐

  1. Git入门之在IDEA中使用Git上传maven项目

    下载安装git客户端: 参考博文:https://www.cnblogs.com/java-maowei/p/5950930.html 在IDEA怎么使用git上传spring的maven项目详解: ...

  2. Vim/gVim 中文显示为乱码的解决办法

    打开vimrc文件,在vim的安装目录下可以找到该文件,或在windows下是在vim/gvim下输入:edit $vim/_vimrc. 在文件的末尾添加一句 "set fileencod ...

  3. JAVA 基础编程练习题2 【程序 2 输出素数】

    2 [程序 2 输出素数] 题目:判断 101-200 之间有多少个素数,并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,则表明此数不是素数, ...

  4. linux之反向代理,反向代理实例,负载均衡实例

    目录 nginx反向代理 1. 概述 2. 反向代理服务器的工作原理 (1)作为内容服务器的替身 (2)作为内容服务器的负载均衡器 二. nginx反向代理实例 1.前期准备 2.代理服务器配置 3. ...

  5. vue中父组件调用子组件的方法

    原文地址 文章目录 什么是组件? 使用组件 组件 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自 ...

  6. 【ABAP系列】SAP ABAP DATA - COMMON PART

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP DATA - ...

  7. 《精通并发与Netty》学习笔记(03 - 客户端程序编写)

    上节我们编写了netty服务端的程序,这节我们来写客户端程序 第一步:改造服务端程序为: (1)MyServer类: package com.ssy.netty.demo01; import io.n ...

  8. hydra 使用

    Hydra介绍 Hydra是一个并行登录破解器,支持多种攻击协议.它非常快速和灵活,新模块易于添加.该工具使研究人员和安全顾问能够展示远程获得对系统未经授权的访问是多么容易. 它支持:Cisco AA ...

  9. 【计算机视觉】【并行计算与CUDA开发】GPU硬编码

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...

  10. JS小时倒计时

    let t1 = new Date("2019-11-26 15:51:00");// 从什么时间开始 let t2 = ));// 延迟几个小时 let interval = w ...