Unity贪吃蛇改编【详细版】

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.mfbz.cn/a/714439.html

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

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 部门项目任务分配(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 部门项目任务分配(100分) 🌍 评测功能需要订阅专栏后私信联…

【eMTC】eMTC PBCH与LTE PBCH有什么不同

1 概述 eMTC是基于LTE演进的物联网技术&#xff0c;在R12中叫Low-Cost MTC&#xff0c;在R13中被称为LTE enhanced MTC &#xff0c;即eMTC&#xff0c;旨在基于现有的LTE载波满足物联网设备需求。eMTC基于蜂窝网络进行部署&#xff0c;支持上下行最大1Mbps的峰值速率&#xff…

lxml库在爬虫领域的贡献及应用

重头戏lxml库里面的xpath 一段代码给各位开开胃 这段代码首先导入了lxml库中的etree模块&#xff0c;然后定义了一个包含HTML内容的字符串html。接着&#xff0c;我们使用etree.HTML()函数解析这个HTML字符串&#xff0c;得到一个表示整个HTML文档的树形结构。最后&#xff0c;…

《大数据分析》期末考试整理

一、单项选择题&#xff08;1*9&#xff09; 1.大数据发展历程&#xff1a;出现阶段、热门阶段和应用阶段 P2 2.大数据影响 P3 1&#xff09;大数据对科学活动的影响 2&#xff09;大数据对思维方式的影响 3&#xff09;大数据对社会发展的影响 4&#xff09;大数…

C语言---------深入理解指针

目录 一、字符指针 二、指针数组&#xff1a; 三、数组指针&#xff1a; 1、定义&#xff1a; 2、&数组名和数组名区别&#xff1a; 3、数组指针的使用&#xff1a; 四、数组参数&#xff0c;指针参数&#xff1a; 1、一维数组传参&#xff1a; 2、二维数组传参&am…

单列集合顶层接口Collection及五类遍历方式(迭代器)

collection add方法细节&#xff1a; remove方法细节&#xff1a; contains方法细节&#xff1a; 如果集合中存储的是自定义对象, student之类的, 也想通过contains进行判断, 就必须在javaBean中重写equals方法 contains在arrayList中源代码&#xff1a;在底层调用了equals方…

对候选人得票的统计程序

一个结构体变量中可以存放一组数据&#xff08;如一个学生的学号、姓名、成绩等数据&#xff09;。如果有10个学生的数据需要参加运算&#xff0c;显然应该用数组&#xff0c;这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于&#xff1a;每个数组元素都是一…

认识Redis 主从同步、事务和Memcached的区别

08- 什么是 Redis 主从同步&#xff1f; Redis 的主从同步(replication)机制&#xff0c;允许 Slave 从 Master 那里&#xff0c;通过网络传输拷贝到完整的数据备份&#xff0c;从而达到主从机制。 主数据库可以进行读写操作&#xff0c;当发生写操作的时候自动将数据同步到从…

React+TS前台项目实战(十)-- 全局常用组件CopyText封装

文章目录 前言CopyText组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目常用复制文本组件封装&#xff0c;这个组件是一个用于拷贝文本的 React 组件&#xff0c;它提供了拷贝&#xff0c;国际化和消息提示的功能 CopyText组件 1. 功能分…

HTML表格的跨行与跨列:《红楼梦》人物与小学课表示例

在HTML中&#xff0c;表格不仅可以按常规行和列排列数据&#xff0c;还可以通过跨行&#xff08;rowspan&#xff09;和跨列&#xff08;colspan&#xff09;属性来合并单元格&#xff0c;以适应更复杂的数据展示需求。以下是跨行与跨列属性的介绍&#xff0c;以及两个示例&…

全网爆火《pvz植物大战僵尸杂交版》最新安装包,Android、Windows、ios安装包+教程!

今天阿星想和大家分享一个最近在B站上引起轰动的老游戏——《植物大战僵尸》&#xff01; 是的&#xff0c;你没听错&#xff0c;就是那个曾经让我们熬夜到天亮&#xff0c;一关接一关挑战的游戏。 让我们来聊聊&#xff0c;这款游戏怎么就突然又火了起来呢&#xff1f; 原来…

4款好用的文本扩展器!!提高工作效率!【送源码】

今天的文章中为大家带来几款好用的文本扩展器&#xff0c;帮助大家提供工作效率&#xff0c;减少重复劳动&#xff5e; Beeftext Beeftext 是一个文本扩展工具&#xff0c;可以帮助用户快速输入短语、段落或者常用的文本片段。它允许你创建自定义的缩写和对应的文本替换&…

HTTP-代理

HTTP-代理 web代理服务器是网络的中间实体&#xff0c;代理位于客户端和服务器之间&#xff0c;扮演者中间人的角色&#xff0c;在各端点之间来回传递http报文 web的中间实体 web上的代理服务器是代表客户端完成事务处理的中间人&#xff0c;如果没有web代理&#xff0c;htt…

【猫狗分类】Pytorch VGG16 实现猫狗分类4-开始训练

背景 现在&#xff0c;我们已经完成了&#xff0c;数据集的清洗&#xff0c;标签的制作&#xff0c;也把VGG16的模型建立好了。那接下来&#xff0c;我们应该把数据&#xff0c;放到我们搭建的vgg16的模型里面&#xff0c;让模型针对这些猫和狗的图片&#xff0c;去进行训练&a…

MyBatis操作数据库(一)

什么是MyBatis? MyBatis是一个优秀的持久层框架&#xff0c;⽤于简化JDBC的开发。 MyBatis本是Apache的⼀个开源项⽬iBatis&#xff0c;2010年这个项目由apache迁移到了googlecode&#xff0c;并且改名为MyBatis。 简单来说MyBatis是更加简单完成数据和数据库交互的框架 什么…

内存泄漏 内存溢出

概念 内存泄漏&#xff1a;是程序没有正确的释放已分配的内存&#xff0c;造成系统内存的浪费。内存泄漏很难发现&#xff0c;因为他不会直接导致程序崩溃&#xff0c;而是会慢慢降低程序的性能。 内存溢出&#xff1a;系统中存在无法回收的内存或使用的内存过多&#xff0c;…

【C#】使用JavaScriptSerializer序列化对象

在C#开发语言编程中&#xff0c;通常使用系统内置的JavaScriptSerializer类来序列化对象&#xff0c;以便将其转换为JSON格式的文本存储与后台服务通信, 在这里将为大家详细介绍一下这个过程。 文章目录 反序列化序列化忽略属性 假设处理的数据中有一个对象类, 如下 public cl…

逆天改命 17岁中专女生横扫全球数学竞赛

“逆天改命!17岁中专女生横扫全球数学竞赛,清华北大高手纷纷落马!” 最近全网被这则消息震惊了。 来!随便挑几个题目,让大家体验一下阿里巴巴全球数学竞赛的难度? 数学是人工智能算法的基石。它为算法提供了逻辑框架和分析工具,使得人工智能能够处理复杂的数据和问…

电商秒杀系统

一&#xff0c;细节 二&#xff0c;需要注意的细节 1.库存超卖问题 使用mysql数据库的 悲观锁 机制。在事务中使用 for update 语句&#xff0c;此时数据库会加锁&#xff0c;其他想要当前读的线程都会被阻塞&#xff0c;在事务处理完成之后释放这一条数据。该方法的缺点在于…

基于springboot实现入校申报审批系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现入校申报审批系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装入校申报审批系统软…