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

news2024/9/21 12:32:45

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)
        {
           
            
        }
    }
}

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

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

相关文章

神经网络:激活函数的介绍

神经网络的激活函数是一种非线性函数&#xff0c;它被应用于每个神经元的输出&#xff0c;以引入非线性性质到网络中。 激活函数的目的是将输入转换为输出&#xff0c;并且将输出限制在特定的范围内。它们非常重要&#xff0c;因为线性变换&#xff08;例如加法和乘法&#xf…

七夕祭

title: 七夕祭 date: 2024-01-03 22:47:05 tags: 传送门 题目大意 解题思路 行的感兴趣的摊点或者列的感兴趣的摊点的数量能被行数或者列数整除&#xff0c;则能够实现要求。“均分”思想&#xff0c;设总感兴趣摊点数 T T T 和行数列数 n n n&#xff0c;当前感兴趣的摊点数…

ansible 配置jspgou商城上线(MySQL版)

准备环境 准备两台纯净的服务器进行&#xff0c;在实验之前我们关闭防火墙和selinux systemctl stop firewalld #关闭防火墙 setenforce 0 #临时关闭selinux hosts解析(两台服务器都要去做) [rootansible-server ~]# vim /etc/hosts 10.31.162.24 ansible-ser…

某和医院招采系统web端数据爬取, 逆向js

目标网址:https://zbcg.sznsyy.cn/homeNotice 测试时间: 2024-01-03 1 老规矩,打开Chrome无痕浏览,打开链接,监测网络,通过刷新以及上下翻页可以猜测出数据的请求是通过接口frontPageAnnouncementList获取的,查看返回可以看出来数据大概率是经过aes加密的,如图: 通过查看该请…

Spark Streaming的DStream与窗口操作

实时数据处理已经成为当今大数据时代的一个重要领域&#xff0c;而Spark Streaming是Apache Spark生态系统中的一个关键模块&#xff0c;用于处理实时数据流。本文将深入探讨Spark Streaming中的DStream&#xff08;离散流&#xff09;概念以及如何使用窗口操作来处理实时数据。…

人工智能如何重塑金融服务业

在体验优先的世界中识别金融服务业中的AI使用场景 人工智能&#xff08;AI&#xff09;作为主要行业的大型组织的重要业务驱动力&#xff0c;持续受到关注。众所周知&#xff0c;传统金融服务业在采用新技术方面相对滞后&#xff0c;一些组织使用的还是上世纪50年代和60年代发…

PostgreSQL荣获DB-Engines 2023年度数据库

数据库流行度排名网站 DB-Engines 2024 年 1 月 2 日发布文章宣称&#xff0c;PostgreSQL 荣获 2023 年度数据库管理系统称号。 PostgreSQL 在过去一年中获得了比其他 417 个产品更多的流行度增长&#xff0c;因此获得了 2023 年度 DBMS。 DB-Engines 通过计算每种数据库 2024 …

java税务信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web税务信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

互联网分布式应用之SpringCloud

SpringCloud Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 微服务项目介绍 2. Eure…

C# halcon 工业产品尺寸测量

产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序&#xff0c;主要用于图像处理和测量。以下是对代码的一些总结&#xff1a; 1. **图像显示与加载&#xff1a;** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …

设计模式_结构型模式_装饰器模式

装饰器模式和代理模式很像。 代理模式是已经知道代理谁了&#xff0c;所以只是对委托类的访问权限进行限制&#xff0c;因此用户只需要访问相应的代理类就可以。装饰器模式并不知道要装饰谁&#xff0c;所以需要传入具体的被装饰对象进行功能的添加 目的&#xff1a; 增加现有…

关于设计模式的一点总结

一、GoF 23种设计模式 1.分类 GoF 23种设计模式可分为几类&#xff1a;创建型、结构型和行为型。如下表 分类设计模式创建型单例模式、工厂方法模式、抽象工厂模式、原型模式、建造者模式结构型代理模式、适配器模式、装饰者模式、桥接模式、组合模式、门面模式、享元模式行…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 首次运行DevEco Studio

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— DevEco Studio下载与安装 上一篇文章详细说明了Dev Eco Stdio的下载即安装过程&#xff0c;本回讲一下首次运行DevEco Studio的过程。 笔者电脑的操作系统是Windows 11。点击“开始菜单”&#xff0c;在弹…

金融服务公司如何通过人工智能实现任务转型

金融服务行业正在使用人工智能和机器学习提升各项业务流程的速度和准确性。利用人工智能和机器学习技术&#xff0c;金融服务公司可以大幅度降低风险&#xff0c;防止欺诈&#xff0c;优化投资策略&#xff0c;提高运营效率&#xff0c;并提供更为个性化的客户服务。 金融行业为…

(vue)增加行,对应行删除

(vue)增加行&#xff0c;对应行删除 效果&#xff1a; 代码&#xff1a; <div v-for"(ele,i) of algorithmList" :key"i"><el-form-item label"模型类型"><el-selectv-model"ele.algorithmId"placeholder"选择模…

Java LinkedList解密

一、LinkedList最底层的原理 LinkedList其实底层是链表&#xff1a; 当初始化的时候&#xff0c;会将链表这个节点的值、prev指针和next指针初始化。 二、LinkedList初始化 无参构造并没有做什么。有参构造会先调用无参构造&#xff0c;然后调用addAll方法将链表的节点都初始化…

GaussDB数据库使用COPY命令导数

目录 一、前言 二、GaussDB数据库使用COPY命令导数语法 1、语法COPY FROM 2、语法COPY TO 3、特别说明及参数示意 三、GaussDB数据库使用COPY命令导数示例 1、操作步骤 2、准备工作&#xff08;示例&#xff09; 3、把一个表的数据拷贝到一个文件&#xff08;示例&…

Web应用开发:介绍

Web应用开发&#xff0c;介绍一下 文心一言&#xff08;文心大模型3.5&#xff09; Web应用开发是一种使用Web技术创建和部署应用程序的过程。Web应用通常是指通过网络浏览器访问的应用程序&#xff0c;它们可以提供各种功能&#xff0c;如在线银行、在线购物、社交媒体平台等…

2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…

优雅地展示20w单细胞热图|非Doheatmap 超大数据集 细胞数太多

单细胞超大数据集的热图怎么画&#xff1f;昨天刚做完展示20万单细胞的热图要这么画吗&#xff1f; 今天就有人发消息问我为啥他画出来的热图有问题。 问题起源 昨天分享完 20万单细胞的热图要这么画吗&#xff1f;&#xff0c;就有人问为啥他的数据会出错。我们先来看下他的…