关于V1.0

  为什么我给这个版本定义为V1.0嘞,因为在这个版本中仅仅实现了蛇的自动行进,按键对蛇的行进方向的操作和吃掉食物蛇身的增长等操作。
但是任何事情都必须一步一步来,当我们完成这个乞丐版的贪吃蛇,就为我们版本的更新打下了基础。
##思路
首先我们生成一个空白的的窗体,然后再放一个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;

贪吃蛇的初始化

在窗体的初始化事件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 = 10for (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 开始计时}

蛇的移动事件

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

        /// <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]右移10Snake_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;}}}

当然不是!(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;//生成一个随机位置的foodFood.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);}

蛇吃食物事件

主要包括:

  • Eat_time方法判别是否和蛇头相遇,如果相遇,调用Snake_eat方法蛇长加一,且改变食物位置
  • Snake_eat遍历到蛇尾部,生成一个label位置设为,蛇尾改变前的位置。
        public void Eat_time(){double x1 = 20, y1 = 20, x2 = 20, y2 = 20;//遍历Controls中所有labelforeach (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);}

效果

最后

在这个版本基础上升级C#winform 经典小游戏贪吃蛇V2.0(二)

我们的乞丐版贪吃蛇就完成了!
如果你按照我的步骤一步一步来,就会体验到你的Snake,
从From_Load出现到你的屏幕上,然后Snake_move它开始单调得向右移动,
Form1_KeyDown and Timer_Tick 它开始按照你的意思开始移动,上下左右,来回穿梭
Snake_food你的屏幕上出现一个爱心形状的食物,但是你吃不到它
Eat_time and Snake_eat 终于它变成了你期待的样子
可是它似乎又缺点啥?
编程总是这样,它诱惑我们去得到我们期待的东西,我们一步步接近我们的期待,这个过程可能充满曲折,但却是充满的惊喜,当我们似乎得到我们想要的后,却又发现好像还有那么一段距离
GitHub

C#winform 经典小游戏贪吃蛇V1.0(一)相关推荐

  1. Java经典小游戏——贪吃蛇简单实现(附源码)

    文章目录 一.使用知识 二.使用工具 三.开发过程 3.1素材准备 3.2 开发过程 3.2.1 创建项目 3.2.2 页面设计 3.23 画蛇 3.24创建蛇的食物 3.2.5增加蛇的存活状态 3. ...

  2. Android 300行代码实现经典小游戏贪吃蛇

    前言 贪吃蛇算是一个非常经典的小游戏了,本人00后,初次游玩是在小时候用诺基亚手机进行游玩的.这次算是复刻一下经典hhh,贪吃蛇算是一个制作起来非常简单的小游戏,本文使用Kotlin语言进行开发,用J ...

  3. python经典小游戏贪吃蛇_Python开发贪吃蛇小游戏

    独完成一个设计的工作量的可能性很小,因为你总会遇到这样那样的问题.在编写的时候,一个小小的符号,一个常量变量的设定,这都无不考量着我们的细心与严谨.所以,我理解到了作为一个编程人员首先应具有良好的心理 ...

  4. 如何用不到200行代码实现经典小游戏贪吃蛇,附源代码及详细实现思路

    不多废话,直接上链接 链接:https://pan.baidu.com/s/1ZKtVNhzR4fIzNZSGWgFKQw?pwd=zglt  提取码:zglt 有需要的好兄弟们可以直接取用,想要了解 ...

  5. Java小游戏——贪吃蛇

    Java小游戏之贪吃蛇 系统目标 贪吃蛇是一个益智类游戏,通过本游戏的设计和实现,可以提升Java技术能力,提升自己独立开发的能力及掌握项目的开发流程. 开发环境 系统环境:Windows 开发工具: ...

  6. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  7. 微信小游戏——贪吃蛇

    博客简介 本篇博客介绍的是微信小游戏贪吃蛇的案例,详细的开发过程,并且提供代码压缩包下载. 案例简介 布局 构建对象 响应事件 蛇头对象的移动 蛇身的移动 食物刷新 绘制得分 碰撞检验 开始界面和结束 ...

  8. JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二)

    目录 JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三) 前言 1. 任务描述 1.1  ...

  9. 小游戏贪吃蛇的c++源代码

    小游戏贪吃蛇的c++源代码,快来看看,还带解释 #include #include #include #include #include <conio.h> #include #inclu ...

最新文章

  1. 利用opencv进行移动物体检测
  2. mapreduce.job.reduce.slowstart.completedmaps
  3. nvidia显示设置不可用_白送大福利?实战FreeSync显示器开启NVIDIA GSync Compatible
  4. 子进程无法从标准输入读取数据
  5. RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World
  6. java正则表达式 ascii,是否可以检查字符串是否在Java中仅包含ASCII?
  7. BZOJ4545: DQS的trie 广义后缀自动机_LCT
  8. java数值加法null得到什么,fastjson 处理null值,对象为null时返回{},数字为null返回[]...
  9. 宝塔linux网络连接错误,宝塔linux面板部署防火墙后网页打不开报http564错误的解决办法...
  10. java 手机信息管理系统照相功能_Android实现手机拍照功能
  11. 新微擎 v1.7.9 图文回复 标题emoji
  12. Calibre修改保存电子书为中文
  13. Zephyr NVS文件系统原理及应用
  14. Unity 动态更改鼠标样式
  15. 生活大爆炸第二季 那些精妙的台词翻译
  16. 蓝牙中的三种音频编码:Apt-X、SBC、AAC,请问分别有什么区别?
  17. feapder爬虫框架使用
  18. 区块链 图灵完备是什么
  19. speedoffice(Excel)如何画直线
  20. angular1的分页

热门文章

  1. 苹果X屏黑了-苹果x屏幕黑屏也无法开机怎么回事?
  2. appium---第一个脚本--启动一个已存在的app
  3. DNS主从同步服务配置
  4. 初识 GDPR:史上最严格的数据保护条例
  5. PLC需要有什么样的基础才能学?
  6. 移动端UC浏览器不支持Blob的解决方案
  7. 统计英文字数c语言,c语言题目,纯英文字数统计,怎么错了?
  8. 会议通知html页面,【会议通知H5】送你最新会议邀请函H5教程,请点击查收!
  9. Java8 ConcurrentHashMap的get()方法真的不需要加锁吗?
  10. 培养数字化人才 护航大学生就业 千锋教研院2022年教研战略发布会隆重举行