C# 全屏label控件实现的贪吃蛇。

C#  全屏label控件实现的贪吃蛇。

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;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;namespace snake
{public partial class Form1 : Form{// 定义常量private const int BlockSize = 20; // 方块的大小private const int Width = 40; // 游戏界面的宽度private const int Height = 30; // 游戏界面的高度// 记录分数private int Score = 0;// 地图的二维数组private Label[][] Blocks = new Label[Width][];// 存储地图上每个方块的引用Label[,] map = new Label[Height, Width];// 贪吃蛇的移动方向private char moveDirection;// 食物的位置private int food_i, food_j;// 游戏是否失败private bool isFailure;// 初始化游戏private void InitializeGame(){// 将地图上的方块标记为0for (int i = 0; i < Height; i++)for (int j = 0; j < Width; j++)Blocks[i][j].Tag = 0;// 设置初始移动方向为向右moveDirection = 'D';// 设置蛇的初始位置和长度Blocks[10][10].Tag = 1;for (int i = 1; i <= 5; i++){Blocks[10][10 - i].Tag = i + 1;}// 在随机位置生成食物Random random = new Random();food_i = random.Next(2, Height - 5);food_j = random.Next(2, Width - 5);// 设置窗体标题Text = "贪吃小蛇蛇  上下左右键盘操作方向";}// 定时器的回调函数,控制游戏逻辑private void Timer_Tick(object sender, EventArgs e){// 如果游戏失败,则退出if (isFailure){return;}// 移动贪吃蛇MoveSnake();// 更新界面显示Show1();}// 更新界面显示private void Show1(){// 遍历地图上的每个方块for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){int value = (int)Blocks[i][j].Tag;// 根据方块的值设置背景颜色Color color = value > 0 ? Color.FromArgb(111, 111, 111) : Color.FromArgb(222, 222, 222);Blocks[i][j].BackColor = color;// 设置方块的位置Blocks[i][j].Top = i * BlockSize;Blocks[i][j].Left = j * BlockSize;}}// 将食物方块的背景颜色设置为红色Blocks[food_i][food_j].BackColor = Color.Red;Blocks[food_i][food_j].Top = food_i * BlockSize;Blocks[food_i][food_j].Left = food_j * BlockSize;// 如果游戏失败,停止定时器,弹出提示框if (isFailure){timer1.Enabled = false;MessageBox.Show("Game Over~!!");button1.Enabled = true;}}// 移动贪吃蛇private void MoveSnake(){// 将蛇身体上的方块值加一for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){if ((int)Blocks[i][j].Tag > 0){Blocks[i][j].Tag = (int)Blocks[i][j].Tag + 1;}}}// 找到蛇尾和蛇头的位置int oldTail_i = 0, oldTail_j = 0, oldHead_i = 0, oldHead_j = 0;int max_value = 0;for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){int value = (int)Blocks[i][j].Tag;if (max_value < value){max_value = value;oldTail_i = i;oldTail_j = j;}if (value == 2){oldHead_i = i;oldHead_j = j;}}}// 计算蛇头新的位置int newHead_i = oldHead_i;int newHead_j = oldHead_j;if (moveDirection == 'W'){newHead_i = oldHead_i - 1;}else if (moveDirection == 'S'){newHead_i = oldHead_i + 1;}else if (moveDirection == 'A'){newHead_j = oldHead_j - 1;}else if (moveDirection == 'D'){newHead_j = oldHead_j + 1;}// 判断游戏是否失败if (newHead_i >= Height || newHead_i < 0 || newHead_j >= Width || newHead_j < 0 || (int)Blocks[newHead_i][newHead_j].Tag > 0){isFailure = true;return;}// 更新蛇头的位置Blocks[newHead_i][newHead_j].Tag = 1;// 判断是否吃到食物if (newHead_i == food_i && newHead_j == food_j){// 在随机位置生成新的食物Random random = new Random();food_i = random.Next(2, Height - 5);food_j = random.Next(2, Width - 5);// 增加分数Score += 1;txtScore.Text = "" + Score;}else{// 更新蛇尾的位置Blocks[oldTail_i][oldTail_j].Tag = 0;}}public Form1(){InitializeComponent();// 创建地图上的方块并添加到窗体中for (int i = 0; i < Height; i++){Blocks[i] = new Label[Width];for (int j = 0; j < Width; j++){Blocks[i][j] = new Label();Blocks[i][j].Height = BlockSize;Blocks[i][j].Width = BlockSize;Blocks[i][j].Tag = 0;Controls.Add(Blocks[i][j]);}}}// 开始按钮的点击事件private void button1_Click(object sender, EventArgs e){// 初始化游戏InitializeGame();// 启动定时器,控制游戏逻辑timer1.Start();// 重置分数Score = 0;txtScore.Text = "" + Score;// 禁用开始按钮button1.Enabled = false;}// 键盘按下事件private void Form1_KeyDown(object sender, KeyEventArgs e){// 根据按键设置移动方向switch (e.KeyCode){case Keys.Up:if (moveDirection != 'S'){moveDirection = 'W';MoveSnake();}break;case Keys.Left:if (moveDirection != 'D'){moveDirection = 'A';MoveSnake();}break;case Keys.Down:if (moveDirection != 'W'){moveDirection = 'S';MoveSnake();}break;case Keys.Right:if (moveDirection != 'A'){moveDirection = 'D';MoveSnake();}break;}}private void Form1_Load(object sender, EventArgs e){}}
}

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;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;namespace snake
{public partial class Form1 : Form{private const int BlockSize = 20;private const int Width = 40;private const int Height = 30;private int Score = 0;private Label[][] Blocks= new Label[Width][];//地图的二维数组Label[,] map = new Label[Height, Width];private char moveDirection;private int food_i, food_j;private bool isFailure;private void InitializeGame(){for (int i = 0; i < Height; i++)for (int j = 0; j<Width; j++)Blocks[i][j].Tag = 0;        moveDirection = 'D';food_i = 0;food_j = 0;isFailure = false;Blocks[10][10].Tag =1;for (int i = 1; i <= 5; i++){Blocks[10][10 - i].Tag =i + 1;}Random random = new Random();food_i = random.Next(2, Height - 5);food_j = random.Next(2, Width - 5);Text = "贪吃小蛇蛇  上下左右键盘操作方向";}private void Timer_Tick(object sender, EventArgs e){if (isFailure){return;}MoveSnake();Show1();}private void Show1() {for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){int value = (int)Blocks[i][j].Tag;Color color = value > 0 ? Color.FromArgb(111, 111, 111) : Color.FromArgb(222, 222, 222);Blocks[i][j].BackColor = color;Blocks[i][j].Top=i * BlockSize;Blocks[i][j].Left= j * BlockSize;}}Blocks[food_i][food_j].BackColor = Color.Red;Blocks[food_i][food_j ].Top=food_i * BlockSize;Blocks[food_i][food_j ].Left= food_j * BlockSize;if (isFailure) { timer1.Enabled = false;MessageBox.Show("Game Over~!!");button1.Enabled = true;}}private void MoveSnake(){for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){if ((int)Blocks[i][j].Tag > 0){Blocks[i][j].Tag = (int)Blocks[i][j].Tag+1;}}}int oldTail_i = 0, oldTail_j = 0, oldHead_i = 0, oldHead_j = 0;int max_value = 0;for (int i = 0; i < Height; i++){for (int j = 0; j < Width; j++){int value = (int)Blocks[i][j].Tag;if (max_value < value){max_value = value;oldTail_i = i;oldTail_j = j;}if (value == 2){oldHead_i = i;oldHead_j = j;}}}int newHead_i = oldHead_i;int newHead_j = oldHead_j;if (moveDirection == 'W'){newHead_i = oldHead_i - 1;}else if (moveDirection == 'S'){newHead_i = oldHead_i + 1;}else if (moveDirection == 'A'){newHead_j = oldHead_j - 1;}else if (moveDirection == 'D'){newHead_j = oldHead_j + 1;}if (newHead_i >= Height || newHead_i < 0 || newHead_j >= Width || newHead_j < 0 || (int)Blocks[newHead_i][newHead_j].Tag > 0){isFailure = true;return;}Blocks[newHead_i][newHead_j].Tag = 1;if (newHead_i == food_i && newHead_j == food_j){Random random = new Random();food_i = random.Next(2, Height - 5);food_j = random.Next(2, Width - 5);Score +=1;txtScore.Text=""+Score;}else{Blocks[oldTail_i][oldTail_j].Tag = 0;}}public Form1(){InitializeComponent();for (int i = 0; i < Height; i++){Blocks[i] = new Label[Width];for (int j = 0; j<Width; j++){Blocks[i][j] = new Label();Blocks[i][j].Height=BlockSize;Blocks[i][j].Width =BlockSize;Blocks[i][j].Tag = 0;Controls.Add(Blocks[i][j]);}}}private void button1_Click(object sender, EventArgs e){InitializeGame();timer1.Start();Score = 0;txtScore.Text = ""+Score;button1.Enabled = false;}private void Form1_KeyDown(object sender, KeyEventArgs e){switch (e.KeyCode){case Keys.Up:                   if (moveDirection != 'S'){moveDirection = 'W';MoveSnake();}break;case Keys.Left:if (moveDirection != 'D'){moveDirection = 'A';MoveSnake();}break;case Keys.Down:if (moveDirection != 'W'){moveDirection = 'S';MoveSnake();}break;case Keys.Right:if (moveDirection != 'A'){moveDirection = 'D';MoveSnake();}break;}}private void Form1_Load(object sender, EventArgs e){}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

T527 配置edp配置pwm不正常引起的背光不亮问题

前言 T527 主板在调试edp点屏的时候&#xff0c;配置了一个pwm8对应的引脚作为背光&#xff0c;这个pwm8默认在dts中是没有配置的&#xff0c;需要添加对应的pin脚配置&#xff0c;于是参考了其他pwm的配置&#xff0c;添加到了dts。但是开机后edp屏的背光就是不亮&#xff0c…

案例074:基于微信小程序的儿童预防接种预约管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

信息学奥赛一本通2035:【例5.2】平移数据

2035&#xff1a;【例5.2】平移数据 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 55733 通过数: 36735 【题目描述】 将aa数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。 【输入】 第一行为数组aa的元素个数&#xff1b; 第二行为nn个小于10001…

vue中provide和inject使用的注意事项

在Vue.js中&#xff0c;provide 和 inject 是用于父组件向子组件传递数据的高级选项。它们通常用于跨层级组件之间的通信&#xff0c;而不需要通过中间组件进行 props 或事件的传递。 provide 选项&#xff1a; provide 选项用于在父组件中声明需要传递给后代组件的数据。 /…

uniCloud 的 schema2code 【实用教程】

schema2code 用于通过 schema 文件&#xff0c;自动生成对表进行增删改查的操作页面。 以 uniCloud-aliyun/database/todo.schema.json 为例 {"bsonType": "object","required": [],"permission": {"read": true,"cr…

Halcon区域的面积和中心点area_center

Halcon区域的面积和中心点 提到区域的特征&#xff0c;最常用的莫过于区域的面积和中心点坐标信息。实际工作中&#xff0c;经常会使用面积或中心点进行特征的选择和定位。Halcon中的area_center算子就是用于实现这一功能的&#xff0c;该算子一次返回以下两个结果。 &#xf…

Vue3-33-路由-路由的别名配置 alias

别名的作用 路由中的别名配置&#xff0c;可以实现 多个路径 对应 同一个路由。 例如 &#xff1a; 路由的路径是 /a; 配置别名为 &#xff1a; /a2; 则 访问 /a 或 /a2 的时候&#xff0c;都可以访问到 同一个组件。 别名的特点 关键字 &#xff1a; alias 当通过别名进行路由…

认识CUDA

CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构&#xff08;ISA&#xff09;以及…

抽奖的问题

import randomlucky_num [] # 存放中奖人名单&#xff0c;避免多次中奖 lucky_count 0 # 表示每一种奖品人数够了for time in range(0, 3): # 抽三次奖lucky_count 0 # 每次刷新print(f第一次抽奖现在开始&#xff0c;这次抽的是{3-time}等奖\n)# 判断奖品是哪个if time…

金和OA c6 uploadfileeditorsave接口存在任意文件上传漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和-c6 uploadfileeditorsave 任意文件上传&#xff0c;攻击者…

线程的基础

文章目录 线程的介绍&#xff1a;创建线程的三种方式&#xff1a;一、继承Thread二、实现Runnable接口三、实现Callable接口 线程的优先级&#xff1a;多线程&#xff1a;线程终止&#xff1a;线程常用方法&#xff1a;用户线程和守护线程线程的生命周期&#xff1a;Synchroniz…

SpringBoot实用开发(六)-- RedisTemplate处理Hash类型的数据

目录 1.以map集合的形式添加键值对 2.获取变量中的键值对 3.查看hash表中指定字段是否存在

代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72.编辑距离、编辑距离总结篇

代码随想录 (programmercarl.com) 583. 两个字符串的删除操作 本题和LC115.不同的子序列 相比&#xff0c;其实就是两个字符串都可以删除了&#xff0c;情况虽说复杂一些&#xff0c;但整体思路是不变的。 1.dp数组及下标含义 dp[i][j]&#xff1a;表示使以下标i-1为结尾的字符…

【DevOps-04]】Operate阶段工具

一、简要说明 安装Docker安装Docker-compose二、安装Docker 官网地址:https://www.docker.com文档地址:Docker Docs仓库地址:https://hub.docker.com1、Docker相关网站 官方网站Get Docker | Docker Docs

MySQL慢查询日志分析(慢查询日志)

一、背景 &emsp;&emsp;MySQL的慢查询日志是MySQL提供的一种日志记录&#xff0c;他用来记录在MySQL中响应的时间超过阈值的语句&#xff0c;具体指运行时间超过long_query_time&#xff08;默认是10秒&#xff09;值的SQL&#xff0c;会被记录到慢查询日志中。 &em…

861. 二分图的最大匹配(匈牙利算法, 二分图的最大匹配)

861. 二分图的最大匹配 - AcWing题库 给定一个二分图&#xff0c;其中左半部包含 n1 个点&#xff08;编号 1∼n1&#xff09;&#xff0c;右半部包含 n2 个点&#xff08;编号 1∼n2&#xff09;&#xff0c;二分图共包含 m 条边。 数据保证任意一条边的两个端点都不可能在同…

AI:112-基于卷积神经网络的美食图片识别与菜谱推荐

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

一、前言 性能测试之于软件系统&#xff0c;是保障其业务承载能力及稳定性的关键措施。以软件系统的能力建设为主线&#xff0c;系统能力设计工作与性能测试工作&#xff0c;既有先后之顺序&#xff0c;亦有相互之影响。以上&#xff0c;在性能测试的场景决策&#xff0c;架构…

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(1)

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜&#xff0c;Kotlin&#xff08;1&#xff09; 实现查看图片的放大镜&#xff0c;放大镜随着手指在屏幕上的移动&#xff0c;放大镜里面展示手指触点为中心、半径长度的圆形放大后的图片。 剪切出一块圆形Path…

基于微信小程序的停车预约系统设计与实现

基于微信小程序的停车预约系统设计与实现 项目概述 本项目旨在结合微信小程序、后台Spring Boot和MySQL数据库&#xff0c;打造一套高效便捷的停车预约系统。用户通过微信小程序进行注册、登录、预约停车位等操作&#xff0c;而管理员和超级管理员则可通过后台管理系统对停车…