Unity贪吃蛇改编【详细版】

news2024/12/23 9:45:39

Big and small greedy snakes

游戏概述

游戏亮点

通过对称的美感,设置两条贪吃蛇吧,其中一条加倍成长以及加倍减少,另一条正常成长以及减少,最终实现两条蛇对整个界面的霸占效果。

过程中不断记录两条蛇的得分情况,以及吃到毒药的记录,所谓一朝被蛇咬,十年怕井绳。

游戏运行的硬件环境

1.运行平台:PC端

2.相关软件:Unity5.4.0f3 2D

3.硬件设备:配置Windows10的笔记本电脑及相关基本设备

游戏的玩法

1.通过鼠标点击加载,登录,键盘输入账号和密码

2.进入游戏,通过上下左右键,进行移动

3.过程中有两条蛇,通过对称的美感,设置两条贪吃蛇,其中一条加倍成长以及加倍减少,另一条正常成长以及减少,最终实现两条蛇对整个界面的霸占效果。

4.过程中不断记录两条蛇的得分情况,以及吃到毒药的记录,所谓一朝被蛇咬,十年怕井绳。最终得分高的胜利。其中毒药有-2以及-1设置,食物有+2以及+1设置。

5.如果失败,那么就进入game over 界面,然后可以选择重新开始,或者关闭程序。重新开始就重新进入游戏,再次失败就往复循环。

场景布置

LOGO开场界面

设置Canvas Scaler

1.UI Scale Mode

设置为scale with screen size

2.Reference Resolution

调整X为1920,Y为1080

3.Match

修改为1

这个部分主要是调适图片的标准

登录界面

设置UI,Canvas,其中的text以及inputfield

  1. 设置title,文字为Login,调整位置
  2. 窗体,包括两个inputfield,分别输入账号密码,调整大小
  3. Error以及botton,根据不同情况设置相应内容
  4. 背景图片设置,注意颜色搭配,一般选择绿色

游戏主场景

相机设置

修改相机参数 :ClearFlags 设置为SolidColor 让我们游戏中的场景纯颜色显示,Projection设置为Orthographic 正交相机 , size设置相机视角的大小。

游戏背景

设置游戏背景图、四面的墙壁、贪吃蛇的蛇头和食物的组件及属性,还有一个游戏失败和显示分数的UI界面。

背景图,新建2D Object-->Sprite 取名GameBG 设置图片精灵,调整scale大小为30*30。

Food设置

点击 is Trigger

添加Box Collider 2D

其中Size调整为0.7

其他设置同上

关键是把它设置为Prefab预制体

Snake设置

添加Rigidbody 2D

选择 is kinematic

设置Gravity为0

注意Collerction.Generic以及Linq

Restart界面

设置button,调整重新开始的场景切换

设置text以及背景图,大小以及位置

素材制作

LOGO开场界面

通过富有王者气质的蛇王形象,作为开场LOGO界面

呈现方式为:淡入淡出

持续时间为1+2+3秒

通过switch选择语句执行

登录界面

常用活泼的贪吃蛇背景图

颜色搭配为黄绿色,轻快明亮

界面设置合理,位置大小适当清晰即可

通过二维数组存储账号密码

游戏主场景

通过两个text记录分数,直观明了

食物丰富,空间丰富,规律合理设置

背景图采用蓝绿色,更加清晰直观

蛇头位置以及动画效果耐人寻味

采用极简风格编写

随机生成数方法来确定下边界,上边界

巧妙方法:将最末尾的蛇身移动到头位置,从而不用整体移动,维护数据结构顺序

设置布尔变量,逻辑判断,转换场景

重新开始界面

通过颜色落差,让人想要再玩一把

通过button按钮重新开始,切换场景

颜色,大小,位置,文字合理设置即可

其他制作

背景音乐

通过拖放背景音乐,使每个场景都是新的背景音乐

使游戏饶有兴趣,更有乐趣,动力,放松,娱乐特性增强。

脚本代码

开场界面

// LogoEvent.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class LogoEvent : MonoBehaviour {

//设置对象
public Image img;
    public float speed = 0.5f;
    public float waitTime = 1.0f;

//时间等待常量
Public const int HideToShow = 1;
    public const int Wait = 2;
public const int ShowToHide = 3;

//定义条件判断
    int currentState;
    float currentAlpha;
    float waitCount;


//初始化
//颜色以及状态
	void Start () {
        currentState = HideToShow; 
        img.color = new Color(1, 1, 1, currentAlpha);
	}

	void Update () {
//状态更新
switch (currentState)
        {
//展示状态,逐渐显示
            case HideToShow:
                currentAlpha += speed * Time.deltaTime;
                if (currentAlpha > 1) currentAlpha = 1;

                img.color = new Color(1, 1, 1, currentAlpha);

                if (currentAlpha == 1) currentState = Wait;

                break;
//转换状态,逐渐隐藏
           case ShowToHide:
                currentAlpha -= speed * Time.deltaTime;
                if (currentAlpha < 0) currentAlpha = 0;

                img.color = new Color(1, 1, 1, currentAlpha);

                if (currentAlpha == 0)
                    SceneManager.LoadScene("UI_Other");

                break;



//等待状态
            case Wait:
                waitCount += Time.deltaTime;
                if (waitCount >= waitTime) currentState = ShowToHide;

                break;

          
        }
	}
}

登录界面

//Submit.cs
//采用极简风格编写
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

public class submit : MonoBehaviour {
//设置对象
	public InputField ifID;
	public InputField ifPW;
	public Text error;

//输入数据
	public void Submit(){
		string userID = ifID.text;
		string userPW = ifPW.text;

		if (error.gameObject.activeSelf) {
			error.gameObject.SetActive (false);
		}
	
//空数据
	if (string.IsNullOrEmpty(userID) || string.IsNullOrEmpty(userPW)){
		error.text = "Can't empty";
		error.gameObject.SetActive(true);

		return;
	}


		bool isSucess = false;
//验证是否正确
	for(int i=0;i<Data.ACCOUNT.Length;++i){
		string dataID = Data.ACCOUNT[i][0];
		string dataPW = Data.ACCOUNT[i][1];

		if(dataID.Equals(userID)&&dataPW.Equals(userPW)){
			isSucess = true;
			break;
		}
	}

//验证通过
	if(isSucess){
		SceneManager.LoadScene("other");
	}else{
		error.text = "ID or Password error";
		error.gameObject.SetActive(true);

		return;
	}
}

账号密码设置

//Data.cs
//通过二维数组存储账号密码
using UnityEngine;
using System.Collections;

public class Data {
//数据结构定义
    public static string[][] ACCOUNT = new string[5][]{
        new string[]{
            "TOM","12345"
        },new string[]{
            "TOM2","12345"
        },new string[]{
            "TOM3","12345"
        },new string[]{
            "TOM4","12345"
        },new string[]{
            "TOM5","12345"
        }
    };

}

食物毒药界面(游戏主场景)

//Food.cs
//食物
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.SceneManagement; 
public class Food : MonoBehaviour {

       
        //Borders
        public Transform Top;
        public Transform Bottom;
        public Transform Left;
        public Transform Right;

        //food prefab
        public GameObject Prefab;

    //初始化各种对象

        // Use this for initialization
        void Start () {
                InvokeRepeating ("Form", 3, 4);
            }
    //不断重复调用方法
    //方法名,最初几秒钟以后,每隔多少秒
        
      
        //spawn one piece of food
        void Form(){
        //y position between top &bottom border
                int y = (int)Random.Range(Top.position.y,Bottom.position.y);

        //x position between left &right border
                int x = (int)Random.Range(Left.position.x,Right.position.x);

        //随机生成数方法
        //下边界,上边界

                //instantiate the food at (x,y)
                Instantiate(Prefab,new Vector2(x,y),Quaternion.identity);//default rotation
        //实例化
        //对象,位置,旋转角度
            }
}

//Poison.cs
//毒药
using UnityEngine;
using System.Collections;

public class Poison : MonoBehaviour {


        //Borders
        public Transform Top;
        public Transform Bottom;
        public Transform Left;
        public Transform Right;

        //food prefab
        public GameObject Prefab;

    //初始化各种对象

        // Use this for initialization
        void Start () {
                InvokeRepeating ("Form", 4, 4);
            }
    //不断重复调用方法
    //方法名,最初几秒钟以后,每隔多少秒
        
      
        //spawn one piece of food
        void Form(){
        //y position between top &bottom border
                int y = (int)Random.Range(Top.position.y,Bottom.position.y);

        //x position between left &right border
                int x = (int)Random.Range(Left.position.x,Right.position.x);

        //随机生成数方法
        //下边界,上边界

                //instantiate the food at (x,y)
                Instantiate(Prefab,new Vector2(x,y),Quaternion.identity);//default rotation
        //实例化
        //对象,位置,旋转角度
            }
}

蛇界面(游戏主场景)

//BigSnake.cs
//大蛇
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class BigSnake : MonoBehaviour {


    Vector2 dir = Vector2.right;
//当前移动方向


//数据结构列表
//存储身体长度
    //keep track of tail
    List<Transform> tail = new List<Transform>();

//是否遇到食物逻辑判断,布尔变量
    bool ate = false;


//设置预制体对象
    public GameObject tailPrefab;




    // Use this for initialization
    void Start () {
        InvokeRepeating ("Move", 0.3f, 0.3f);
    }
//不断重复调用方法
//方法名,最初几秒钟以后,每隔多少秒
//300ms
  





    // Update is called once per frame
    void Update () {
//更改方向
//通过输入赋值
        if (Input.GetKey (KeyCode.RightArrow))
            dir = Vector2.right;
        else if (Input.GetKey (KeyCode.DownArrow))
            dir = - Vector2.up;
        else if (Input.GetKey (KeyCode.LeftArrow))
            dir = - Vector2.right;
        else if (Input.GetKey (KeyCode.UpArrow))
            dir = Vector2.up;
    }

//设置两条蛇的输入参数
//第一条蛇,正常输入
//第二条蛇,完全相反,而且位置对称分布

    void Move(){

//保存蛇头位置v
        Vector2 v = transform.position;

//Do Movement 
        transform.Translate (dir);



//是否是食物
        if (ate) {
            GameObject g = (GameObject)Instantiate (tailPrefab, v, Quaternion.identity);
//实例化
//对象,位置,旋转角度


            tail.Insert (0, g.transform);
//维护数据结构,底部
            ate = false;
//恢复布尔变量逻辑判断



        }else if (tail.Count > 0) {
            tail.Last ().position = v;
//巧妙方法:将最末尾的蛇身移动到头位置,从而不用整体移动

//维护数据结构顺序
            tail.Insert (0, tail.Last ());
            tail.RemoveAt (tail.Count - 1);
//末尾位置,减一是数据结构从0开始的特性

        }
    }


    void OnTriggerEnter2D(Collider2D coll){
            if(coll.name.StartsWith("FoodPrefab")) {
                ate = true;
//碰到食物,逻辑判断


                Destroy(coll.gameObject);
//销毁本体

        }
           
//碰到其他,墙或身体
else{
            //lose
            
            }

    
    }

}

//SmallSnake.cs
//小蛇
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class Snake1 : MonoBehaviour {

	public Text Score;
	Vector2 dir = Vector2.right;
	//当前移动方向


	//数据结构列表
	//存储身体长度
	//keep track of tail

	List<Transform> tail = new List<Transform>();

	//是否遇到食物逻辑判断,布尔变量
	bool ate = false;
	bool ate1 = false;


	//设置预制体对象
	public GameObject Prefab;




	// Use this for initialization
	void Start () {
		InvokeRepeating ("Move", 0.3f, 0.3f);
	}
	//不断重复调用方法
	//方法名,最初几秒钟以后,每隔多少秒
	//300ms






	// Update is called once per frame
	void Update () {
		//更改方向
		//通过输入赋值
		if (Input.GetKey (KeyCode.RightArrow))
			dir = - Vector2.right;
		else if (Input.GetKey (KeyCode.DownArrow))
			dir =  Vector2.up;
		else if (Input.GetKey (KeyCode.LeftArrow))
			dir =  Vector2.right;
		else if (Input.GetKey (KeyCode.UpArrow))
			dir = - Vector2.up;

		Score.text = tail.Count.ToString();
	}




	void Move(){

		//保存蛇头位置v
		Vector2 v = transform.position;

		//Do Movement 
		transform.Translate (dir);



		//是否是食物
		if (ate) {
			GameObject g = (GameObject)Instantiate (Prefab, v, Quaternion.identity);

			//实例化
			//对象,位置,旋转角度


			tail.Insert (0, g.transform);

			//维护数据结构,底部
			ate = false;
			//恢复布尔变量逻辑判断



		}else if (ate1) {

			//实例化
			//对象,位置,旋转角度
			if (tail.Count > 1) {
				

				tail.RemoveAt (tail.Count - 1);
				}


			//维护数据结构,底部
			ate1 = false;
			//恢复布尔变量逻辑判断



		}
		else if (tail.Count > 0) {
			tail.Last ().position = v;
			//巧妙方法:将最末尾的蛇身移动到头位置,从而不用整体移动

			//维护数据结构顺序
			tail.Insert (0, tail.Last ());
			tail.RemoveAt (tail.Count - 1);
		
			//末尾位置,减一是数据结构从0开始的特性

		}
	}


	void OnTriggerEnter2D (Collider2D coll)
	{
		if (coll.name.StartsWith ("Poison")) {
			ate = true;
			//碰到食物,逻辑判断


			Destroy (coll.gameObject);
			//销毁本体

		}

		//碰到其他,墙或身体
		else if (coll.name.StartsWith ("Food1")) {
			ate1 = true;
			//碰到食物,逻辑判断


			Destroy (coll.gameObject);
			//销毁本体

		} else {

			SceneManager.LoadScene("Restart");
		}

	}
}

重新开始界面

/Restart.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

public class Restart : MonoBehaviour {
    //设置对象


    //输入数据
    public void Submit(){
        

//设置布尔变量
        bool isSucess = true;
//逻辑判断,转换场景
        if(isSucess){
            SceneManager.LoadScene("main");
        }
            

    }
} 

小结

通过switch选择语句执行

采用极简风格编写

通过二维数组存储账号密码

随机生成数方法来确定下边界,上边界
巧妙方法:将最末尾的蛇身移动到头位置,从而不用整体移动,维护数据结构顺序
设置布尔变量,逻辑判断,转换场景

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

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

相关文章

Python 踩坑记 -- 调优

前言 继续解决问题 慢 一个服务运行有点慢&#xff0c;当然 Python 本身不快&#xff0c;如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700&#xff0c;各依赖封装 3000&#xff0c;主线逻辑也是很久远的痕迹&#xff0c;长函数都很难看清楚一个 if els…

创建STM32F10X空项目教程

创建STM32F10X系列的空项目工程 官网下载STM32标准外设软件库 STM32标准外设软件库 创建一个空文件夹作为主工程文件夹在主工程文件夹中&#xff0c;创建三个空文件夹 CMSIS - 存放内核函数及启动引导文件 FWLIB - 存放库函数 USER - 存放用户的函数将STM32标准外设软件库文件…

弗洛伊德算法——C语言

弗洛伊德算法&#xff0c;是一种用于解决所有顶点对之间最短路径问题的经典算法&#xff0c;该算法通过动态规划的方法计算出从每个顶点到其他所有顶点的最短路径。 弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点&#xff0c;更新所有顶点对之间的最短路径。它通过以…

环形链表2证明

解法 快慢指针相遇后&#xff0c;其中一个指回头部&#xff0c;然后同步前进 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNod…

java(JVM)

JVM Java的JVM&#xff08;Java虚拟机&#xff09;是运行Java程序的关键部件。它不直接理解或执行Java源代码&#xff0c;而是与Java编译器生成的字节码&#xff08;Bytecode&#xff09;进行交互。下面是对Java JVM更详尽的解释&#xff1a; 1.字节码&#xff1a; 当你使用J…

通过命令行启动MySQL

通过命令行启动MySQL 右击&#xff0c;选择管理员运行 停止MySQL net stop你的服务名称 net stop MySQL启动MySQL net start你的服务名称 net start MySQL

实战项目: 负载均衡

0. 前言 这个项目使用了前后端,实现一个丐版的LeetCode刷题网站,并根据每台主机的实际情况,选择对应的主机,负载均衡的调度 0.1 所用技术与开发环境 所用技术: C STL 标准库 Boost 准标准库 ( 字符串切割 ) cpp- httplib 第三方开源网络库 ctemplate 第三方开源前端网…

pikachu中pkxss数据库怎么创建

在用小皮时候&#xff0c;只是知道个pikachu这个数据库&#xff0c;跟着视频看人家用pkxss数据库&#xff0c;自己也想用&#xff0c;查看了很多资料&#xff0c;又蒙又查&#xff0c;终于明白怎么弄&#xff0c;特此传授经验 图像中画横线的就是平常怎么创建数据库的&#xff…

HP惠普暗影精灵10 OMEN Gaming Laptop 16-wf1xxx原厂Win11系统镜像下载

惠普hp暗影精灵10笔记本电脑16-wf1000TX原装出厂Windows11&#xff0c;恢复开箱状态oem预装系统安装包&#xff0c;带恢复重置还原 适用型号:16-wf1xxx 16-wf1000TX,16-wf1023TX,16-wf1024TX,16-wf1025TX, 16-wf1026TX,16-wf1027TX,16-wf1028TX,16-wf1029TX, 16-wf1030TX,16-…

C++ 算法教程

归并排序 #include<iostream> using namespace std; template <class T> void Merge(T data[],int start,int mid,int end) {int len1 mid - start 1, len2 end - mid;int i, j, k;T* left new int[len1];T* right new int[len2];for (i 0; i < len1; i)…

爆火的治愈系插画工具又来了,额度居然有18w,根本花不完?

AI治愈插画又又又来了 今天给大家推荐一款完全免费的软件&#xff0c;用过的人都说好&#xff01; 先来看看我生成的图 制作过程非常简单&#xff0c;输入你想要生成的画面咒语。 工具地址&#xff1a;https://www.qiyuai.net/ 模型目前有两种 我上面的图就是用的第一种通用…

Shell 学习笔记 - 导读 + 变量定义

初识 Shell 本章学习目标 了解什么是 Shell了解 Shell 的版本及用途掌握 Shell 变量的用法 导读&#xff08; 了解 \color{cyan}{了解} 了解&#xff09; 现在的人们使用的操作系统&#xff08;Windows、Android、iOS 等&#xff09;都带有图形化界面&#xff0c;简单直观&…

秋招突击——第五弹——Java的SSN框架快速入门——SpringBoot的使用

文章目录 引言SpringBoot简介入门案例SpringBoot项目快速启动 SpringBoot概述起步依赖辅助功能 基础配置配置文件格式基础配置Yaml格式书写Yaml格式读取多环境开发多环境启动命令格式多环境开发兼容问题配置文件分类 整合第三方技术整合Junit基于SpringBoot实现SSM整合Springbo…

axure9设置组件自适应浏览器大小

问题&#xff1a;预览时不展示下方的滚动条 方法一&#xff1a;转化为动态面板 1.在页面上创建一个矩形 2.右键-转化为动态面板 3.双击进入动态面板设置 4.设置动态面板矩形的颜色 5.删除原来的矩形 6.关闭动态面板&#xff0c;点击预览 7.此时可以发现底部没有滚动条了 方法…

23 华三(自动获取的IP地址)

华三交换机 DHCP 配置 #version 7.1.070, Alpha 7170 //设备的版本信息 #sysname sw1 //修改设备的名字 #irf mac-address persistent timerirf auto-update enableundo irf link-delayirf member 1 priority 1#dhcp enable //开启DHCP 服务dhcp server forbidden-ip 192.168.…

PDFFactoryFinePrint软件安装包下载+详细安装教程

简介&#xff1a; pdfFactory Pro(虚拟打印机)是一个无须 Acrobat 创建 Adobe PDF 文件的打印机驱动程序。 pdffactory pro虚拟打印机提供了比其他程序提供得更简单、更有效率和更少的花费的创建 PDF 文件的解决方案。用于需要安全的 PDF(法律文档、公司信息等)和其他高级功能…

Vue53-Todo-list案例

一、需求&#xff1a; 二、组件的划分&#xff1a;按照功能划分 组件起名&#xff0c;不要和html内置元素重名&#xff01; Vue鼓励组件名用多个单词。 三、组件化编码流程 3-1、实现静态组件 将各个组件的基本框架写好&#xff0c;并在App.vue文件中进行引入和注册。 将已有…

HTTP协议 快速入门

http概述 无状态性&#xff1a;HTTP是一个无状态协议&#xff0c;这意味着服务器不会在请求之间保存任何会话信息。每个请求都是独立的&#xff0c;服务器不会记住之前的请求。 请求-响应模型&#xff1a;HTTP通信是基于客户端发送请求和服务器返回响应的模型。客户端&#xf…

ffmpeg解封装rtsp并录制视频-(1)解封装rtsp断网或摄像机重启后自动重连处理

头文件&#xff1a; xtools.h #pragma once #include <thread> #include <iostream> #include <mutex> //日志级别 DEBUG INFO ERROR FATAL enum XLogLevel {XLOG_TYPE_DEBUG,XLOG_TYPE_INFO,XLOG_TPYE_ERROR,XLOG_TYPE_FATAL }; #define LOG_MIN_LEVEL XLO…

【Android】基于webView打造富文本编辑器(H5)

目录 前言一、实现效果二、具体实现1. 导入网页资源2. 页面设计3. 功能调用4. 完整代码 总结 前言 HTML5是构建Web内容的一种语言描述方式。HTML5是Web中核心语言HTML的规范&#xff0c;用户使用任何手段进行网页浏览时看到的内容原本都是HTML格式的&#xff0c;在浏览器中通过…