1. 程式人生 > >Unity實現漢諾塔遊戲

Unity實現漢諾塔遊戲

ges idt warn mage [0 lis lose gif bject

漢諾塔的規則:

  1. 有ABC三個柱子,A柱子上從小到大排列圓盤
  2. 要將A柱子上所有圓盤移動到C柱子上,每次只能移一個
  3. 圓盤放置必須從小到大,不能存在此盤子上面有比它大的存在。

比如三個漢諾塔玩法:

技術分享

理理思路,大體算法就是這個樣:

技術分享

那麽算法就很清晰了。

不知道哪一天我又想把這個遊戲擴展,我決定用四個類,讓遊戲的設計更條理一點:

Temp類//臨時存儲圓盤對象,就是正在移動的圓盤

Torus類//圓盤類,每個圓盤都有

Cylinder類//圓柱類,每個圓柱都用,鼠標點擊觸發遊戲

GameManage類//遊戲管理類,儲存的遊戲對象可以方便管理

技術分享
 1 using System.Collections;
2 using System.Collections.Generic; 3 using UnityEngine; 4 5 /// <summary> 6 /// 版本Unity2017.1.0f3 7 /// </summary> 8 9 public class Cylinder : MonoBehaviour 10 { 11 [SerializeField] 12 private int _index;//本柱序號 13 14 public List<GameObject> Torus_List = new List<GameObject>();//
存儲本柱圓環 15 16 [SerializeField] 17 private GameObject _Temp; 18 private bool _isTrans;//可以最上面可以移動 19 20 [SerializeField] 21 private GameManage GameManager; 22 23 public int Index 24 { 25 get { return _index; } 26 } 27 28 void OnMouseDown() 29 { 30 _isTrans = _Temp.GetComponent<Temp>().isNull;
31 if (_isTrans == true)//可以移動 32 { 33 if (Torus_List.Count != 0)//判斷柱子上是否有圓環 34 { 35 TakeTorus(); 36 } 37 else if (Torus_List.Count == 0)//判斷柱子上沒有東西 38 { 39 Debug.Log("你點擊的這個柱子沒有東西!"); 40 } 41 } 42 if (_isTrans == false) 43 { 44 if (Torus_List.Count == 0)//判斷要放置的柱子是否有物體 45 { 46 TranslateFunc(); 47 } 48 if (Torus_List.Count != 0)//判斷要放置的柱子有圓環 49 { 50 if (_Temp.GetComponent<Temp>().Torus_Obj != null) 51 { 52 int a_length = _Temp.GetComponent<Temp>().Torus_Obj.GetComponent<Torus>().TLength;//暫存的圓環長度 53 int b_length = Torus_List[Torus_List.Count - 1].GetComponent<Torus>().TLength; 54 if (a_length < b_length) 55 { 56 TranslateFunc(); 57 if (Torus_List.Count == GameManager.mytorus.Length && this._index == 3) 58 { 59 Debug.LogWarning("勝利!!!"); 60 } 61 } 62 else 63 { 64 Debug.Log("放置錯誤,請重新放置!!!"); 65 } 66 } 67 } 68 } 69 70 } 71 72 void TranslateFunc() 73 { 74 Torus_List.Add(_Temp.GetComponent<Temp>().Torus_Obj);//為泛型列表添加_Temp暫存得東西 75 Torus_List[Torus_List.Count - 1].transform.position = new Vector3(transform.position.x, transform.position.y-6 + (Torus_List.Count - 1), transform.position.z);//讓移動的圓環移動過去 76 _Temp.GetComponent<Temp>().Torus_Obj = null;//清空暫存 77 _Temp.GetComponent<Temp>().isNull = true;//可以再次移動,_Temp是空的 78 Debug.Log("已經移動到" + gameObject.name); 79 GameManager.AddScore();//步數增加 80 } 81 82 void TakeTorus() 83 { 84 //Debug.Log("圓柱被點擊!"); 85 //Debug.Log(Torus_List[Torus_List.Count - 1] + "為最上面的!"); 86 Torus_List[Torus_List.Count - 1].transform.position = _Temp.transform.position;//移動位置 87 _Temp.GetComponent<Temp>().Torus_Obj = Torus_List[Torus_List.Count - 1];//Temp暫存圓環 88 _Temp.GetComponent<Temp>().isNull = false;//Temp處已經有東西了 89 Torus_List.RemoveAt(Torus_List.Count - 1);//移除在在最上面的圓環 90 //Debug.Log(_isTrans); 91 } 92 }
Cylinder.cs

技術分享
 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 /// <summary>
 6 /// 版本Unity2017.1.0f3
 7 /// </summary>
 8 
 9 public class Torus : MonoBehaviour
10 {
11     [SerializeField]
12     private int t_Length;//圓環的大小
13 
14 
15     public int TLength
16     {
17         get { return t_Length; }
18     }
19 
20 }
Torus.cs

技術分享
 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 /// <summary>
 6 /// 版本Unity2017.1.0f3
 7 /// </summary>
 8 
 9 public class Temp : MonoBehaviour
10 {
11 
12     public bool isNull = true;//是否為空
13     public GameObject Torus_Obj;//臨時存儲對象
14 
15 
16 }
Temp.cs

技術分享
 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.UI;
 5 
 6 /// <summary>
 7 /// 版本Unity2017.1.0f3
 8 /// </summary>
 9 
10 public class GameManage : MonoBehaviour
11 {
12 
13     public GameObject[] mycylinders;//所有圓柱
14 
15     public GameObject[] mytorus;//所有圓環
16     public GameObject Temp;//臨時存儲
17 
18     public Text scoreText;
19     private int step;
20     void Start ()
21     {
22         //Debug.Log(mycylinders[0]);
23         for (int i = 0; i < mytorus.Length; i++)//讓所有圓環先加入第一個圓柱中
24         {
25             Debug.LogWarning("" + i + "個圓環被插入圓柱A");
26             mycylinders[0].GetComponent<Cylinder>().Torus_List.Add(mytorus[i]);
27         }
28     }
29 
30     public void AddScore()
31     {
32         step++;
33         scoreText.text = "移動步數:" + step;
34     }
35 }
GameManage.cs

技術分享

技術分享

Unity實現漢諾塔遊戲