Unity3d-UGUI实现的贪食蛇小游戏

news2024/11/18 13:25:51

 按鼠标WASD键来控制蛇的走向。

核心的代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;

/// 《UGUI贪吃蛇》

public class TCS2d : MonoBehaviour
{

    public bool isOver = false;
    public bool isStop = false;//是否停止
    
    [SerializeField]
    private Vector2 v2_MoveValue = new Vector2(0, 32);
    public GameObject sheResGm;
    public RectTransform she_Tou;//蛇身体预制件。当吃掉果实,就实例化,生成一个身体
    public GameObject she_NewRes;//一条小蛇预制体。当开始。 实例化小蛇
    public RectTransform img_GuoZi;//蛇将要吃掉的果子。
    public Transform t_SheParent;
    [SerializeField]
    private List<RectTransform> sheListChild = new List<RectTransform>();//蛇的身体组成,开始拖拽了4个在上面(在Unity面板可以看见)
    private List<Vector2> listStartV2 = new List<Vector2>();//用来记录初始的身体部分 坐标
    private RectTransform[] sheStartRectTAry;//用来记录初始 拖拽好的身体部分
    private const int i_MoveSize = 32;//蛇的移动坐标单位
    [SerializeField]
    private float she_Speed = 0.1f;//(移动间隔时间)蛇的移动速度,。越低越快
    public Text t_DeFen;//用来显示当前得分
    public Text t_Title;//用来显示结果
    public GameObject gmEnd_Panel;//结束界面
    private int i_Nunber;
    
    // Use this for initialization
    void Start()
    {
        
    }

    /// <summary>初始化
    /// </summary>
    void Init()
    {
        img_GuoZi.transform.SetParent(t_SheParent);//将果子提取出来避免被销毁
        if (sheListChild.Count!=0)
        {//销毁蛇(可能是结束后重新开始, 所以我们销毁蛇的所有身体)
            Destroy(sheListChild[0].parent.gameObject);
        }

        sheListChild.Clear();
        GameObject gmIns = Instantiate(she_NewRes) as GameObject;//生成小蛇
        gmIns.transform.SetParent(t_SheParent);
        gmIns.GetComponent<RectTransform>().localScale = Vector3.one;
        gmIns.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;

        for (int i = 0; i < gmIns.transform.childCount; i++)
        {//初始化蛇
            sheListChild.Add(gmIns.transform.GetChild(i).GetComponent<RectTransform>());
        }
        she_Tou = sheListChild[0];//设置蛇头
        img_GuoZi.transform.SetParent(she_Tou.parent);
        //Debug.Log("Delete:"+i_DeleteCount);
        GuoZi_RandomPosition();//随机果子位置
        v2_MoveValue = new Vector2(-32,0);//设置方向
        isStop = false;
        StartCoroutine("She_Move");//开始蛇的自动移动
    }

    void Update()
    {
        //电脑端,检测键盘的按下来控制蛇的移动
        if (Input.GetKeyDown(KeyCode.W))
        {//如果当前向左、右、上、 那么就可以向上,否则向下
            OnClick_BtnFangXiang(1);
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {//如果当前向左、右、下、 那么就可以向下,否则向上
            OnClick_BtnFangXiang(2);
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {//如果当前向上、下、左。 那么就可以向左,否则向右
            OnClick_BtnFangXiang(3);
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {//如果当前向上、下、右。 那么就可以向右,否则向左
            OnClick_BtnFangXiang(4);
        }
    }

    /// <summary>携程, 蛇的移动
    /// </summary>
    IEnumerator She_Move()
    {
        while (!isOver)
        {//是否结束
            if (!isStop)
            {//是否暂停
                Move_1();
            }
            yield return new WaitForSeconds(she_Speed);//每隔多少秒移动一下蛇的身体
        }
        yield return null;
    }

    public void Move_1()
    {
        Vector2 v2_Jl = she_Tou.anchoredPosition;
        she_Tou.anchoredPosition += v2_MoveValue;
        for (int i = 1; i < sheListChild.Count; i++)
        {
            Vector2 v2_Jl2 = sheListChild[i].anchoredPosition;
            sheListChild[i].anchoredPosition = v2_Jl;
            v2_Jl = v2_Jl2;
        }
        IF_End();
    }

    /// <summary>判断是否结束
    /// </summary>
    public void IF_End()
    {
        if (IF_End_1() || IF_End_2())
        {
            StopCoroutine("She_Move");//停止蛇的自动移动
            gmEnd_Panel.SetActive(true);
            isStop = true;
            t_Title.text = "生存失败!!!\n得分:" + i_Nunber;
        }

        if ( (int)(Vector2.Distance(she_Tou.anchoredPosition , img_GuoZi.anchoredPosition)) ==0)
        {
            i_Nunber++;
            t_DeFen.text = "得分:" + i_Nunber;
            GuoZi_RandomPosition();
            She_ADD();
        }
        else if (sheListChild.Count == 1000)
        {
            StopCoroutine("She_Move");//停止蛇的自动移动
            gmEnd_Panel.SetActive(true);
            t_Title.text = "恭喜您获得了满分!\n得分:" + i_Nunber;
        }
    }

    /// <summary>判断蛇头是不是吃了自己的身体
    /// </summary>
    bool IF_End_1()
    {
        for (int i = 2; i < sheListChild.Count; i++)
        {
            if (she_Tou.anchoredPosition == sheListChild[i].anchoredPosition)
            {
                return true;
            }
        }
        return false;
    }
    /// <summary>判断蛇头是否达到边界
    /// </summary>
    bool IF_End_2()
    {
        if (Mathf.Abs(she_Tou.anchoredPosition.x) > 512 || Mathf.Abs(she_Tou.anchoredPosition.y) > 512)
        {
            return true;
        }
        return false;
    }

    /// <summary>蛇的身体变长
    /// </summary>
    public void She_ADD()
    {//生成蛇的身体
        GameObject gmShe = Instantiate(sheResGm) as GameObject;
        gmShe.transform.SetParent(she_Tou.parent);//设定蛇行走的区域为父物体
        gmShe.GetComponent<RectTransform>().localScale = Vector3.one;//初始化缩放
        gmShe.GetComponent<RectTransform>().anchoredPosition = sheListChild[sheListChild.Count - 1].anchoredPosition;
        sheListChild.Add(gmShe.GetComponent<RectTransform>());
    }

    /// <summary>开始游戏按钮事件
    /// </summary>
    public void OnClick_Btn_StartGame()
    {
        gmEnd_Panel.SetActive(false);//关闭开始结束界面
        i_Nunber = 0;
        Init();
    }

    /// <summary>退出游戏按钮事件
    /// </summary>
    public void OnClick_Btn_Quit()
    {
        Application.Quit();
    }

    /// <summary>果子随机位置
    /// </summary>
    private void GuoZi_RandomPosition()
    {
        img_GuoZi.anchoredPosition = Get_Position();
    }

    /// <summary>随机果子位置并判断是否与蛇的身体重合
    /// </summary>
    /// <returns></returns>
    Vector2 Get_Position()
    {
        Vector2 v2Random = new Vector2(i_MoveSize * Random.Range(-16, 16), i_MoveSize * Random.Range(-16, 16));
        int i_Count1 = 0;//用来判断果子是不是随机到了蛇的身体上面了,如果是,重新随机
        for (int i = 0; i < sheListChild.Count; i++)
        {
            if (sheListChild[i].anchoredPosition == v2Random)
            {
                i_Count1++;
                break;
            }
        }
        if (i_Count1 > 0)
        {
            Get_Position();
        }
        return v2Random;
    }

    /// <summary>方向按钮键。可以手动拖给按钮事件。
    ///  Int代表的按键  1:W。 2:S 。 3:A 。 4:D
    /// </summary>
    public void OnClick_BtnFangXiang(int i_Fx)
    {
        if (!isStop)
        {
            switch (i_Fx)
            {
                case 1://如果当前向左、右、上、 那么就可以向上,否则向下
                    v2_MoveValue.y = v2_MoveValue.x == -32 || v2_MoveValue.x == 32 || v2_MoveValue.y == 32 ? 32 : -32;
                    v2_MoveValue.x = 0;
                    //StopCoroutine("");
                    isStop = true;
                    Move_1();
                    isStop = false;
                    //StartCoroutine("She_Move");
                    break;
                case 2://如果当前向左、右、下、 那么就可以向下,否则向上
                    v2_MoveValue.y = v2_MoveValue.x == -32 || v2_MoveValue.x == 32 || v2_MoveValue.y == -32 ? -32 : 32;
                    v2_MoveValue.x = 0;
                    isStop = true;
                    Move_1();
                    isStop = false;
                    break;
                case 3://如果当前向上、下、左。 那么就可以向左,否则向右
                    v2_MoveValue.x = v2_MoveValue.y == -32 || v2_MoveValue.y == 32 || v2_MoveValue.x == -32 ? -32 : 32;
                    v2_MoveValue.y = 0;
                    isStop = true;
                    Move_1();
                    isStop = false;
                    break;
                case 4://如果当前向上、下、右。 那么就可以向右,否则向左
                    v2_MoveValue.x = v2_MoveValue.y == -32 || v2_MoveValue.y == 32 || v2_MoveValue.x == 32 ? 32 : -32;
                    v2_MoveValue.y = 0;
                    isStop = true;
                    Move_1();
                    isStop = false;
                    break;
                default:
                    break;
            }
        }
        
    }

}

工程地址: https://download.csdn.net/download/Highning0007/88015671

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

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

相关文章

【Docker 部署Minio】

Docker 部署Minio 一、拉取Minio镜像二、配置1、创建如下目录2、创建容器并运行 三、访问 一、拉取Minio镜像 访问Docker Hub镜像站找到自己需要的Minio镜像 运行以下命令 sudo docker pull minio/minio二、配置 1、创建如下目录 mkdir -p /home/zx/minio/config mkdir -p…

Java设计模式之一:建造者模式

目录 一、什么是建造者模式 二、建造者模式如何使用 三、建造者模式的优势和应用场景 一、什么是建造者模式 Java建造者模式是一种创建对象的设计模式&#xff0c;它通过将对象的构造过程分离出来&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式适用于创建复…

在前端页面正确展示后端返回的验证码图片

前言&#xff1a; 在开发登录界面时&#xff0c;通过接口请求验证码&#xff1b;后端给返回的格式是Blob&#xff0c;直接用src引用没办法显示。 在控制台输入结果是&#xff1a; 第一想法就是通过 window.URL.createObjectURL(new Blob([res.data],{type:image/png}))转换成u…

【底部消息红点提示】uniapp开发小程序时,使用uni.setTabBarBadge设置底部菜单的红点

一、实现的效果 功能描述&#xff1a;无论点击底部的哪个菜单栏&#xff0c;都可以看到第二个菜单栏下显示的红点通知。 如果只在人脉当前页面设置的话&#xff0c;当你在第二个菜单栏的页面中调用uni.setTabBarBadge方法设置红点后&#xff0c;切换到第一个菜单栏的页面时&am…

力扣 332. 重新安排行程

题目来源&#xff1a;https://leetcode.cn/problems/reconstruct-itinerary/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 这道题目有几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环。解决&am…

【论文基本功】【LaTeX】附录【IEEE论文】

注意&#xff1a;本博客使用的所有命令都需要以使用 IEEEtran 文档类为前提&#xff0c;即 tex 文件的第一行中的必须是 \documentclass[可选参数]{IEEEtran}&#xff08;可选参数部分可以自由选择&#xff0c;如 \documentclass[10pt,journal,compsoc]{IEEEtran}。&#xff09…

C++primer(第五版)第十三章(拷贝控制)

一个类通过定义五种特殊的成员函数来控制这些操作: 拷贝构造函数 拷贝赋值运算符 移动构造函数 移动赋值运算符 析构函数 13.1拷贝,赋值与销毁 13.1.1拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用(必须是引用类型!),并且没有其他参数或是其他参数都有默认值(即…

基于matlab检测使用校准的立体摄像头拍摄的视频中的人物并确定其与摄像头的距离(附源码)

一、前言 此示例演示如何检测使用校准的立体摄像头拍摄的视频中的人物&#xff0c;并确定他们与摄像头的距离。 二、加载立体摄像机的参数 加载对象&#xff0c;这是使用应用程序或函数校准相机的结果。 三、创建视频文件阅读器和视频播放器 创建用于读取和显示视频的系统对…

LabVIEW开发X射线图像增强

LabVIEW开发X射线图像增强 X射线图像在临床诊断中起着重要作用。但是&#xff0c;由于各种原因&#xff0c;例如不均匀&#xff0c;低照度条件和一些噪点&#xff0c;图像质量通常不是很好。因此有必要增强这些图像&#xff0c;以方便后续处理或诊断。模糊集论是开发图像处理中…

C# Color的名称对应该工具

工具效果如下图&#xff1a; 代码&#xff1a; namespace WinFormsColor {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void displayColor(){Control listControl this.Controls["listView_Color"];if (listControl ! null)…

mysql的一些练习题

1. 第1题 mysql> create database Market charset utf8; Query OK, 1 row affected (0.01 sec)第二题 mysql> use Market Database changed mysql> mysql> create table customers(-> c_num int(11) primary key auto_increment,-> c_name varchar(50),-&…

【自动化测试】

一、自动化测试定义 首先来说一下什么是软件测试&#xff1f; 软件测试简单来说就是在规定的条件下对程序进行操作以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。 那么什么是自动化测试呢? 自动化测试是把以人为驱动的测试…

使用Jxbrowser7替换浏览器请求内容和header

前几天一个伙计让我帮他做jxbrowser的请求内容(requestBody&#xff0c;Header)的替换&#xff0c;特此记录。 通过官网文档查阅&#xff0c;我们可以通过BeforeSendUploadDataCallback和BeforeStartTransactionCallback来实现body和header的替换

MySQL之DQL(涵盖所有查询!!!)

文章目录 前言一、基础查询1.1 语法1.2 实例 二、条件查询2.1 语法2.2 条件查询实例2.3 模糊查询实例 三 、排序查询3.1 语法3.2 实例 四 、聚合函数4.1 概念4.2 聚合函数分类4.3 聚合函数语法4.4 实例 五、分组查询5.1 语法5.2 实例 六、分页查询6.1 语法6.2 实例 前言 在上一…

Docker 是什么,在 Ubuntu 虚拟机上安装(部署)Docker

本文目录 1. Docker 简介1.1 什么是 Docker1.2 Docker 与虚拟技术的区别和联系1.3 为什么要用 Docker 2. 几个基本概念2.1 镜像2.1.1 分层存储 2.2 容器2.3 仓库2.3.1 Docker Registry 公开服务2.3.2 私有 Docker Registry 3. Docker 安装3.1 卸载旧版本 Docker3.2 更新及安装工…

Visual Studio 2017下的C++开发环境搭建

Visual Studio 是Microsoft旗下的开发工具包系列产品&#xff0c;是一个基本完整的开发工具集&#xff0c;它包括整个软件生命周期中所需要的大部分工具&#xff0c;如UML工具、代码管控工具、集成开发环境(IDE)等等&#xff0c;是最流行的Windows平台应用程序的集成开发环境。…

动态规划之63 不同路径 II(第5道)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那…

ROS-Moveit和Gazebo联合仿真

文章目录 URDF功能包配置configlaunchCMakeLists.txtpackage.xmlurdf文件 Moveit功能包配置configlaunch 运行 URDF功能包配置 config 首先在SW2URDF生成的功能包下Config目录下新建文件joint_trajectory_controller.yaml robot_arm_controller:type: "position_contro…

Tomcat使用数据库连接池数据库

1.连接池技术的作用 数据池允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是重新建立一个。这项技术能明显地提高对数据库操作的性能。 2.什么是连接池技术 数据库连接池在初始化时将创建一定数量的数据库连接&#xff0c;具体数量的由连接池的最小数据库连接数来设…

什么是Uniswap v3?

目录 1. 集中化流动性&#xff1a;2. 集中化资金池管理&#xff1a;3. 多个流动性池&#xff1a;4. 高级订单类型&#xff1a;5. 协议费用优化&#xff1a; Uniswap v3 是去中心化交易所 Uniswap 的第三个主要版本&#xff0c;它于2021年5月发布。相比于 Uniswap v2&#xff0c…