unity使用鏈表實(shí)現(xiàn)貪吃蛇游戲
今天介紹一下如何利用鏈表結(jié)構(gòu)來(lái)創(chuàng)建一條貪吃蛇。
要實(shí)現(xiàn)的功能很簡(jiǎn)單,按下空格鍵使蛇加長(zhǎng)一節(jié),每次按下空格就在蛇尾加一個(gè)cube。按下左方向鍵,控制蛇的移動(dòng)。如圖所示:
//貪吃蛇的中心是:定義蛇身第一節(jié),即鏈表頭為temp。鏈表的子節(jié)點(diǎn)為next。蛇頭帶著temp(鏈表頭)走,temp帶著next(鏈表子節(jié)點(diǎn))走。

1. 創(chuàng)建一個(gè)cube設(shè)為預(yù)設(shè)體,作為蛇身的節(jié)點(diǎn)。在預(yù)設(shè)體上面添加BodyScript腳本。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class BodyScript : MonoBehaviour {
//創(chuàng)建子物體的連接節(jié)點(diǎn)(next節(jié)點(diǎn)從鏈表的第二個(gè)元素開始,next是從算上蛇頭的第三節(jié)開始)
//用來(lái)接收物體的臨時(shí)位置
private Vector3 myPos;
/// <summary>
/// 移動(dòng)方法
/// </summary>
/// <param name="pos">pos</param>
public void Move(Vector3 pos)
{
//將移動(dòng)之前的位置記錄下來(lái)
myPos = transform.position;
//更新物體位置--傳進(jìn)來(lái)的父物體的位置坐標(biāo)
transform.position = pos;
//如果當(dāng)前cube還有子節(jié)點(diǎn),不是蛇尾最后一節(jié)
if (next != null)
{
//將子物體移動(dòng)到父物體的位置
next.Move(myPos);
}
}
}
2.在Hierarchy面板上,創(chuàng)建一個(gè)cube作為蛇頭。添加一個(gè)SnakeMove腳本。來(lái)控制蛇頭并且創(chuàng)建鏈表。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class SnakeMove : MonoBehaviour {
//Cube預(yù)設(shè)體
public GameObject body_prefab;
//聲明一個(gè)計(jì)時(shí)器
float timer = 0;
//實(shí)例化蛇身的第一節(jié)。算上蛇頭的第二節(jié)(即鏈表的第一個(gè)節(jié)點(diǎn))
public BodyScript temp;
//指向最后生成的節(jié)點(diǎn)(相當(dāng)于指針,始終指向蛇尾)
public BodyScript point;
void Update () {
//計(jì)時(shí)器
timer += Time.deltaTime;
//每隔0.2秒來(lái)執(zhí)行移動(dòng)
if(timer >= 0.2f)
{
//移動(dòng)
Move();
//計(jì)時(shí)器清零
timer = 0;
}
//如果按下左方向鍵
if(Input.GetKeyDown(KeyCode.LeftArrow))
{
//向左旋轉(zhuǎn)
transform.Rotate(Vector3.up, -90);
}
//如果按下空格
if (Input.GetKeyDown(KeyCode.Space))
{
//實(shí)例化一個(gè)cube,作為蛇身的下一節(jié)(先把新生成的cube放置到視野外,現(xiàn)在還沒有把新生成的cube接到蛇身上)
GameObject newBody = Instantiate(body_prefab, new Vector3(444, 0, 0), Quaternion.identity) as GameObject;
//若子物體的節(jié)點(diǎn)為空(只有蛇頭的情況下,第一次按下空格,滿足這個(gè)if條件)
if (temp == null)
{
//temp賦值。這時(shí)候,蛇身有了第一節(jié),鏈表的第一個(gè)元素產(chǎn)生。
temp = newBody.GetComponent<BodyScript>();
//將指針指向蛇身的第一節(jié)(因?yàn)榇藭r(shí)只有一節(jié)身體)
point = temp;
}
//第二次,第三次生成時(shí)
else
{
point.next = newBody.GetComponent<BodyScript>();
//指向下一個(gè)物體的位置
point = point.next;
}
}
}
//創(chuàng)建接收物體的坐標(biāo)
Vector3 pos;
void Move()
{
//獲取當(dāng)前物體的坐標(biāo)
pos = transform.position;
//默認(rèn)向前移動(dòng)
transform.Translate(Vector3.forward);
//若鏈表頭不為空(就是蛇身第一個(gè)cube生成了)
if (temp != null)
{
//執(zhí)行子物體移動(dòng)的方法(鏈表頭開始移動(dòng))
//貪吃蛇的重點(diǎn)是,蛇頭的移動(dòng)帶動(dòng)鏈表頭的移動(dòng),鏈表頭再帶動(dòng)鏈表里的子節(jié)點(diǎn)移動(dòng)
temp.Move(pos);
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用C#編寫Linux守護(hù)進(jìn)程實(shí)例代碼
如今的編程是一場(chǎng)程序員和上帝的競(jìng)賽,程序員要開發(fā)出更大更好、傻瓜都會(huì)用到軟件,下面這篇文章主要給大家介紹了關(guān)于利用C#編寫Linux守護(hù)進(jìn)程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2018-01-01
C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將HTML轉(zhuǎn)換成純文本的方法,基于自定義類實(shí)現(xiàn)文本轉(zhuǎn)換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#關(guān)于System.Collections空間詳解
這篇文章主要介紹了C#關(guān)于System.Collections空間,需要的朋友可以參考下2014-07-07
C# byte數(shù)組與Image相互轉(zhuǎn)換的方法
這篇文章介紹了C# byte數(shù)組與Image相互轉(zhuǎn)換的方法,有需要的朋友可以參考一下2013-10-10

