Unity实现汉诺塔游戏

汉诺塔的规则:

  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

时间: 2024-10-18 19:34:39

Unity实现汉诺塔游戏的相关文章

codevs3145 汉诺塔游戏

3145 汉诺塔游戏 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子

Pyhton:汉诺塔游戏

#汉诺塔游戏攻略! def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) #将前n-1个盘子从x移动到y上 print(x,'-->',z) #将最底下的最后一个盘子从x移动到z上 hanoi(n-1,y,x,z) #将y上的n-1个盘子移动到z上 n = int(input('请输入层数:')) hanoi(n,'x','y','z') 输出结果为: 请输入层数:3 x --> z x -->

经典分治 - 汉诺塔游戏

分治策略: 将父问题划分为多个子问题(注:子问题与父问题一定要具有自相似性),然后找递归出口. 1.子问题规模变小.2.子问题与父问题本质等价. 汉诺塔游戏简述:三个柱A.B.C,将从大到小的盘按规则从A柱移到B柱. 具体的分治算法实现: 1 - N从A移动到B,C为辅助. 等价于: 1.1 - (N - 1)从A移动到C,B为辅助 2.把N从A移动到B 3.1 - (N - 1)从C移动到B,A为辅助 话说当时刚开始想这个问题的时候,我把2 - N当作一个子问题移动对象,将1盘移到辅助柱子上,

3145 汉诺塔游戏——http://codevs.cn/problem/3145/

第一部分:题目 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子) 如对于n

CodeVs[3145 汉诺塔游戏]

题目描述 Description 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小

3145 汉诺塔游戏

题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子) 如对于n=3的情况,一个

codevs3145 汉诺塔游戏(经典中的经典,不能再经典了)

题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子) 如对于n=3的情况,一个

汉诺塔游戏

[题目描述] 在A.B.C三根柱子上,有n个不同大小的圆盘(设半径分别为1~n),一开始他们都叠在A上,你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: (1)每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方): (2)移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子): 例如,对于n=3的情况,一个合法的移动序列式: 1 from A to C 2 from A to B 1 fr

递归,汉诺塔游戏

def hanoi(n,a,b,c): if n==1: print(n,a+'->'+c) else: hanoi(n-1,a,c,b) print(n,a+'->'+c) hanoi(n-1,b,a,c) 原文地址:https://www.cnblogs.com/fkfkfk/p/9180155.html