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()
        {
            // 将地图上的方块标记为0
            for (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)
        {
           
            
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两阶段提交协议三阶段提交协议

两阶段提交协议 分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。 XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范&#xff08;即接口函数&#xff09;&#xff0c;交易…

网络安全—模拟ARP欺骗

文章目录 网络拓扑安装使用编辑数据包客户机攻击机验证 仅做实验用途&#xff0c;禁止做违法犯罪的事情&#xff0c;后果自负。当然现在的计算机多无法被欺骗了&#xff0c;开了防火墙ARP欺骗根本无效。 网络拓扑 均使用Windows Server 2003系统 相关配置可以点击观看这篇文章…

安卓和Android是两种不同的操作系统?

实际上&#xff0c;安卓和Android并不是同一种操作系统&#xff01; Android是由Google开发并维护更新的一款操作系统&#xff0c;目前仅能运行在Pixel手机上。 Google Pixel 与 iPhone手机&#xff1a;哪个更好&#xff1f;Google Pixel 与 Apple iPhone哪个手机才是性价比最…

【 RF 射频 电缆】 MIL-C-17F 标准 规格

第〇、&#xff1f;&#xff1f; RGXXXXX 第一、应用场景 标准号应用场景–&#xff08;–&#xff09;RG-8 RG-9 RG-11粗缆以太网–RG-58细缆以太网–RG-59 RG-75电视系统–RG-62ARCnet网络和IBM 3270网络–RG142电信设备之间的互连 航空电子机架 雷达 GPS 医疗–RG178通信…

Unity坦克大战开发全流程——结束场景——失败界面

结束场景——失败界面 在玩家类中重写死亡函数 在beginPanel中锁定鼠标

红日靶场第一关 attck

之前因为事情耽搁了&#xff0c;今天争取把第一关红日靶场完成 目前找到了关于外网服务器的网址 之前有过扫描目录得知了登陆界面 和爆破得到的密码 目前我们的想法是把病毒上传到网页当中&#xff0c;所以我们应该找个文件注入点 但是再次之前 我们需要找到网页的绝对路径 …

抽奖的问题

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

什么是 JSON?JSON详解

现在程序员还有谁不知道 JSON 吗&#xff1f;无论对于前端还是后端&#xff0c;JSON 都是一种常见的数据格式。那么 JSON 到底是什么呢&#xff1f; JSON 的定义 JSON &#xff08;JavaScript Object Notation&#xff09; &#xff0c;是一种轻量级的数据交换格式。它的使用…

LLM Agent之再谈RAG的召回多样性优化

1. Query多样性 2019 Query Expansion Techniques for Information Retrieval: a Survey 传统搜索Query的扩展&#xff0c;有基于用户搜索日志挖掘的相似Query&#xff0c;有基于相同召回文档关联的相似Query&#xff0c;也有基于SMT的Query改写方案。那和大模型时代更搭配的自…

C语言快速入门——高级特性

C语言高级特性 C语言高级特性函数创建和使用函数全局变量和局部变量函数参数和返回递归调用 指针什么是指针指针与数组多级指针指针数组与数组指针指针函数与函数指针 结构体、联合体和枚举创建和使用结构体结构体数组和指针联合体枚举typedef关键字 预处理文件包含系统库介绍宏…

Spring——Spring IOC(2)

1.Spring中的工厂类 1.1 ApplicationContext ApplicationContext的实现类&#xff0c;如下图&#xff1a; ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 Spring 的配置文件 1.2 B…

知虾会员**成为知虾会员,尊享专属权益**

在当今繁忙的生活中&#xff0c;线上购物已经成为现代人们的主要消费方式之一。而作为线上购物平台的领军者之一&#xff0c;Shopee为了提供更加个性化和便利的购物体验&#xff0c;推出了知虾会员&#xff08;Shopee会员&#xff09;服务。知虾会员不仅可以享受到一系列会员专…

Gromacs WARNING问题

上述示例中&#xff0c;NA 是对系统净电荷进行中和的阳离子。请根据您的系统特性和仿真需求调整这些值。 总体而言&#xff0c;这个警告是为了提醒您关于电荷中性化的问题&#xff0c;确保您的模拟结果更加物理可信。 收敛性未达到预期精度&#xff1a; 警告指出&#xff0c;优…

喜讯|智安网络实力上榜《ISC 2023数字安全创新能力全景图谱》

近日&#xff0c;由360牵头举办的互联网安全大会正式发布了《ISC 2023数字安全创新能力全景图谱》&#xff0c;智安网络凭借在网络安全行业领先的产品实力、专业的安全服务水平及多年累积的行业经验&#xff0c;从300余家厂商、1000多份案例中脱颖而出&#xff0c;成功入围安全…

打地鼠python程序设计说明,打地鼠游戏界面设计

这篇文章主要介绍了打地鼠python程序设计说明&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Pygame库是专门为了帮助做出的游戏和其他多媒体应用Python编程语言的一个开放源代…

Mysql和Redis数据一致性问题

MySQL和Redis数据一致性算是个很经典的问题,在之前也看到过很多相关的文章,最近心血来潮,想把一致性问题的解决方案和存在问题都总结一下。 不推荐方案 1 先更新MySQL,再更新Redis。 如上图有两个请求要同时进行更新操作,在并发情况下,B请求虽然更新时间晚于A请求,但是…

知虾分析——深入了解Shopee平台的知虾分析工具

Shopee是一家知名的电商平台&#xff0c;为了帮助卖家提高业务表现&#xff0c;他们提供了一款强大的数据分析工具——知虾分析。这个工具可以帮助卖家监控店铺的运营状况&#xff0c;优化销售策略&#xff0c;并提高整体的业务表现。本文将深入解析知虾分析的关键功能和用途&a…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…

【STM32】STM32学习笔记-TIM编码器接口(19)

00. 目录 文章目录 00. 目录01. 编码器接口简介02. 正交编码器03. 编码器接口基本结构04. 工作模式05. 实例(均不反相)06. 实例&#xff08;TI1反相&#xff09;07. 预留08. 附录 01. 编码器接口简介 Encoder Interface 编码器接口编码器接口可接收增量&#xff08;正交&#…

通过Vue自定义指令实现前端埋点

在营销活动中&#xff0c;通过埋点可以获取用户的喜好及交互习惯&#xff0c;从而优化流程&#xff0c;进一步提升用户体验&#xff0c;提高转化率。 在之前的埋点方案实现中&#xff0c;都是在具体的按钮或者图片被点击或者被曝光时主动通过事件去上报埋点。这种方法在项目中…