QQ:285679784   欢迎加入博主CSDN资源QQ群799473954(附加信息:CSDN博客)一起学习 !

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinSnakeGame
{public partial class frmSnakePlus : Form{#region 游戏变量/// <summary>/// 贪食蛇初始长度/// </summary>private int snakeCount{get { return Convert.ToInt32(cmbSnakeCount.SelectedItem); }}/// <summary>/// 贪食蛇初始大小/// </summary>private int snakeSize{get { return Convert.ToInt32(cmbSnakeSize.SelectedItem); }}/// <summary>/// 食物数量/// </summary>private int foodCount{get { return Convert.ToInt32(cmbFoodCount.SelectedItem); }}/// <summary>/// 爬行速度/// </summary>private int snakeSpeed{get { return Convert.ToInt32(cmbSpeed.SelectedItem); }}/// <summary>/// 贪食蛇分数/// </summary>private int snakeScore = 0;/// <summary>/// 正在爬行/// </summary>private bool snakeAction = false;/// <summary>/// 爬行方向/// </summary>private Keys KeyCode = Keys.Right;/// <summary>/// 组成贪食蛇的集合/// </summary>private List<Label> snakeCells = new List<Label>();/// <summary>/// 食物集合/// </summary>private List<Label> foodCells = new List<Label>();#endregion#region 构造函数public frmSnakePlus(){InitializeComponent();}private void frmSnakePlus_Load(object sender, EventArgs e){cmbSnakeCount.SelectedItem = "1";cmbSnakeSize.SelectedItem = "10";cmbFoodCount.SelectedItem = "10";cmbSpeed.SelectedItem = "100";chbNodie.Checked = false;InitGame();}#endregion#region 游戏控制/// <summary>/// 初始游戏/// </summary>private void InitGame(){this.SnakeTimer.Stop();this.snakeAction = false;this.KeyPreview = true;this.DrawPanel.Focus();this.KeyCode = Keys.Right;this.snakeScore = this.snakeCount;btnStart.Enabled = true;btnClose.Enabled = btnStop.Enabled = false;// 清空贪食蛇snakeCells.Clear();// 清空食物foodCells.Clear();// 清空游戏区域DrawPanel.Controls.Clear();InitSnake();InitFood();}/// <summary>/// 初始化贪食蛇/// </summary>private void InitSnake(){// 初始化贪食蛇for (int i = snakeScore - 1; i >= 0; i--){// 创建方格Label _cell = CreateCell(new Point(i * this.snakeSize, 0));// 将方格添加到蛇身集合snakeCells.Add(_cell);// 绘制到游戏区域this.DrawPanel.Controls.Add(_cell);}// 显示信息SnakePoint.Text = string.Format("X:{0}    Y:{1}    snakeScore:{2}", snakeCells[0].Location.X, snakeCells[0].Location.Y, snakeScore);}/// <summary>/// 开始游戏/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){btnStop.Enabled = btnClose.Enabled = true;btnStart.Enabled = false;this.snakeAction = true;this.SnakeTimer.Start();}/// <summary>/// 暂停游戏/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStop_Click(object sender, EventArgs e){btnStart.Enabled = btnClose.Enabled = true;btnStop.Enabled = false;this.snakeAction = false;this.SnakeTimer.Stop();}/// <summary>/// 结束游戏/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnClose_Click(object sender, EventArgs e){btnStart.Enabled = true;btnStop.Enabled = btnClose.Enabled = false;this.InitGame();}/// <summary>/// 定时控件:控制贪食蛇的自动运动/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void SnakeTimer_Tick(object sender, EventArgs e){int xRan = snakeCells[0].Location.X;int yRan = snakeCells[0].Location.Y;if (this.KeyCode == Keys.Up){yRan -= this.snakeSize;   //向上移动}else if (this.KeyCode == Keys.Down){yRan += this.snakeSize;   //向下移动}else if (this.KeyCode == Keys.Left){xRan -= this.snakeSize;   //向左移动}else if (this.KeyCode == Keys.Right){xRan += this.snakeSize;   //向右移动}bool isOut = (xRan < 0 || xRan > (this.DrawPanel.Height - this.snakeSize) || yRan < 0 || yRan > (this.DrawPanel.Height - this.snakeSize));// 检测贪食蛇是否在游戏区域中if (isOut && !chbNodie.Checked){this.SnakeTimer.Stop();MessageBox.Show("Game Over!");this.InitGame();return;}// 无敌模式:穿墙设置else if (isOut && chbNodie.Checked){if (xRan > this.DrawPanel.Width){xRan = 0;}if (xRan < 0){xRan = this.DrawPanel.Width;}if (yRan > this.DrawPanel.Height){yRan = 0;}if (yRan < 0){yRan = this.DrawPanel.Height;}}for (int i = snakeScore - 1; i > 0; i--){// 蛇身所有格子前进到前一个格子的位置snakeCells[i].Location = new Point(snakeCells[i - 1].Location.X, snakeCells[i - 1].Location.Y);}// 蛇头前进一个格子snakeCells[0].Location = new Point(xRan, yRan);List<Label> _findFoods = foodCells.Where(n => n.Location == snakeCells[0].Location).ToList<Label>();for (int i = 0; i < _findFoods.Count(); i++){// 消除游戏区域中的食物this.DrawPanel.Controls.Remove(_findFoods[i]);//消除数组中的食物foodCells.Remove(_findFoods[i]);// 蛇身变长Label _cell = CreateCell(snakeCells[snakeCells.Count - 1].Location, Color.Blue);snakeCells.Add(_cell);this.DrawPanel.Controls.Add(_cell);//增加蛇身长度snakeScore++;}if (foodCells.Count == 0){InitFood();}SnakePoint.Text = string.Format("X:{0}    Y:{1}    snakeScore:{2}", snakeCells[0].Location.X, snakeCells[0].Location.Y, snakeScore);}/// <summary>/// 监控方向键:改变贪食蛇的运动方向(上下左右)/// </summary>/// <param name="keyCode"></param>/// <returns></returns>protected override bool ProcessDialogKey(Keys _keyCode){// 只对上下左右按键做出响应if (_keyCode == Keys.Up || _keyCode == Keys.Down || _keyCode == Keys.Left || _keyCode == Keys.Right){// 记录按下的方向键this.KeyCode = _keyCode;if (!snakeAction){snakeAction = true;SnakeTimer.Start();btnStop.Enabled = btnClose.Enabled = true;btnStart.Enabled = false;}return false;}else{return base.ProcessDialogKey(_keyCode);}}#endregion#region 生产食物/// <summary>/// 食物初始化/// </summary>private void InitFood(){CreateFood(foodCount);}/// <summary>///生产食物/// </summary>/// <param name="foodCount"></param>private void CreateFood(int foodCount){Random ran = new Random();//随机类int xRan, yRan;for (int i = 0; i < foodCount; i++){// 随机生成食物放置的X、Y坐标xRan = ran.Next(0, this.DrawPanel.Width / this.snakeSize) * this.snakeSize;yRan = ran.Next(0, this.DrawPanel.Height / this.snakeSize) * this.snakeSize;if (xRan > this.DrawPanel.Width - 10 || xRan > this.DrawPanel.Height - 10){xRan = ran.Next(0, this.DrawPanel.Width / snakeSize) * snakeSize;yRan = ran.Next(0, this.DrawPanel.Height / snakeSize) * snakeSize;}Point FoodPoint = new Point(xRan, yRan);// 检索指定坐标处的子控件var newFood = this.DrawPanel.GetChildAtPoint(FoodPoint);if (newFood == null){// 创建方格Label _cell = CreateCell(FoodPoint, Color.White);// 将方格添加到食物集合foodCells.Add(_cell);// 绘制到游戏区域this.DrawPanel.Controls.Add(_cell);}}}#endregion#region 通用方法/// <summary>/// 创建格子/// </summary>/// <returns></returns>private Label CreateCell(Point point){Label _cell = new Label();_cell.Size = new Size(this.snakeSize, this.snakeSize);_cell.Location = point;_cell.BackColor = Color.Red;_cell.BorderStyle = BorderStyle.FixedSingle;return _cell;}/// <summary>/// 创建格子/// </summary>/// <returns></returns>private Label CreateCell(Point point, Color color){Label _cell = new Label();_cell.Size = new Size(this.snakeSize, this.snakeSize);_cell.Location = point;_cell.BackColor = color;_cell.BorderStyle = BorderStyle.FixedSingle;return _cell;}#endregion#region Eventprivate void btnSetting_Click(object sender, EventArgs e){if (this.Height == 589){this.Height = 660;}else{this.Height = 589;}}/// <summary>/// 设置初始长度/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmbSnakeCount_SelectedIndexChanged(object sender, EventArgs e){InitGame();}/// <summary>/// 设置初始大小/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmbSnakeSize_SelectedIndexChanged(object sender, EventArgs e){InitGame();}/// <summary>/// 设置食物数量/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmbFoodCount_SelectedIndexChanged(object sender, EventArgs e){InitGame();}/// <summary>/// 开启无敌模式/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void chbNodie_CheckedChanged(object sender, EventArgs e){//InitGame();this.KeyPreview = true;this.DrawPanel.Focus();}/// <summary>/// 设置爬行速度/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void cmbSpeed_SelectedIndexChanged(object sender, EventArgs e){SnakeTimer.Interval = this.snakeSpeed;this.KeyPreview = true;this.DrawPanel.Focus();}#endregion}
}

c# winfrom 贪食蛇游戏相关推荐

  1. linux终端贪吃蛇,分享|nSnake: 在Linux的终端上玩经典的贪食蛇游戏

    你知道20世纪末的那些古老的诺基亚手机上最棒的东西是什么吗? 贪食蛇! 我以前在这个看似无聊但却让人上瘾的游戏上花费了大把的时间.在古老的诺基亚手机被智能手机取代的同时,贪食蛇也被另外的无聊但却令人上 ...

  2. tomcat websock html5,websocket实战(4) websocket版贪食蛇游戏(tomcat官方自带)

    通过前面3篇的阐述,相信可以构建一个简单的socket应用了.当然,也会遗漏了许多知识点,相信会在以后分享的实例中捎带说明下. 本文的主要是分析下tomcat官方自带的贪食蛇游戏.为什么选择分析这个项 ...

  3. 使用强化学习快速让AI学会玩贪食蛇游戏(轻量级二十分钟训练+代码)

    如何让AI玩会贪食蛇,甚至比你厉害 概述 构建问题(强化学习求解的一般步骤) 环境 动作定义 状态定义 奖励设计 训练奖励值收敛图 采用第4种状态定义方法 初步训练效果 最终训练效果 模型泛化迁移能力 ...

  4. 强化学习与ChatGPT:快速让AI学会玩贪食蛇游戏!

    大家好,我是千寻哥,现在自动驾驶很火热,其实自动驾驶是一个很大的概念,主要涉及的领域包括强化学习以及计算机视觉. 今天给各位讲讲强化学习的入门知识,并且手把手和大家一起做一个强化学习的Demo. 一. ...

  5. 一个完整的嵌入式程序_【荐读】贪食蛇游戏的Android嵌入式系统设计

    贪食蛇游戏的Android嵌入式系统设计 Design of Android Embedded-System for Greedy Snake Game 作者: 韩 中, 苟和平, 李 援:琼台师范学 ...

  6. Java版贪食蛇游戏的设计与实现毕业设计

    技术:Java.JSP等 摘要: 使用java语言,贪吃蛇游戏,其界面简单易于操作,受到了世界各地玩家的喜爱.近年来,作为一种的高级语言java收到了大家的欢迎欢迎,具有简单.易于理解的特性,被广泛应 ...

  7. C语言 实现贪食蛇游戏

    参照博客"贪食蛇的C语言实现"的图形界面,用了大概一天的时间我也写了一个简单版的贪食蛇,能玩. 游戏截图 1.调用Windows API 解决画图问题 2.初始化画出围墙,蛇身体 ...

  8. 80行JavaScript代码实现的贪食蛇游戏,简约之美

    新建一个文本文件,将下列80行代码粘贴进去,重命名为.html, 用浏览器打开: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transit ...

  9. ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

最新文章

  1. 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂
  2. python编程100例头条-我用Python编程语言做了一些神奇好玩的事情
  3. 老板和用户你听谁的——手机网站改版踩坑记
  4. Bitmap那些事之内存占用计算和加载注意事项
  5. 用 JavaScript 操作字符串
  6. SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题
  7. SAP License:SAP中的报表利器Report Painter
  8. Docker 的出现
  9. aba问题实际中有什么影响_实际影响是什么?
  10. 计算机程序设计vb怎么保存,VB编程:读取文本文件和保存文本文件的方法
  11. 离散求边缘密度_求一把能退烧的机械键盘?——机械键盘购买“指北”
  12. hosts文件位置在哪里?(3种打开hosts文件的方法)
  13. leaflet虚线(leaflet篇.60)
  14. 2019杭电多校 Snowy Smile hdu6638 (线段树最大子段和)
  15. 生物信息学|miRNA-疾病关联预测的图形自动编码模型
  16. java arraylist 添加_java ArrayList添加元素全部一样
  17. windows服务器系统发展史,从1.0到Win10:Windows操作系统进化史
  18. 头歌-EduCoder:袋鼠过河问题
  19. vue——this.$parent算法
  20. java怎么定义一维数组_Java定义一个一维数组有哪几种方法

热门文章

  1. BLDC方波控制双闭环Simulink仿真模型
  2. 通过Ip得到城市实现步骤
  3. vivoy27android版本,步步高vivo Y27 开启USB调试模式
  4. MyBatis中连接的获取过程
  5. js正则表达式大全(转)
  6. 中国省城市列表(中国的性格+拼音)
  7. 增加出库通知单统计事件
  8. 使用 QTcpServer设置多线程客户端,解决大数据解析方案
  9. 【Python】用户输入一个四位自然数,计算并输出其千位、百位、十位和个位上的数字,用Python程序写出来
  10. 获取axios返回的值