开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1702

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1077|回复: 13

[yukuyoulei] 单脚本纯GUI实现《汉诺伊塔》

[复制链接]  [移动端链接]
排名
28
昨日变化

51

主题

839

帖子

6915

积分

Rank: 9Rank: 9Rank: 9

UID
287
好友
43
蛮牛币
2745
威望
30
注册时间
2013-6-9
在线时间
1703 小时
最后登录
2017-5-29

七夕浪漫情人社区QQ达人活力之星原创先锋认证开发者

QQ
发表于 2016-11-8 11:11:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 yukuyoulei 于 2016-11-8 12:59 编辑

是的,我又来了……

汉诺伊塔大家都玩儿过吧?规则很简单,3根柱子,第一根柱子上从小到大几个木块呈金字塔状堆叠,将这几个木块从第一个塔全部移动到其它的一个塔上,移动时遵循不能将大木块放到小木块的规则,简单易上手,后期还很烧脑哦!
1.png



废话少说,上代码:
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class UHanoi : MonoBehaviour
{
        int CurLevel
        {
                get
                {
                        return PlayerPrefs.GetInt("CurLevel") + 1;
                }
                set
                {
                        PlayerPrefs.SetInt("CurLevel", value - 1);
                }
        }
        int towerCount = 3;
        int floorCount
        {
                get
                {
                        return 3 + CurLevel - 1;
                }
        }
        float towerWidth;
        float towerHeight;
        List<List<int>> lTowers = new List<List<int>>();
        void Start()
        {
        }
        void DoInit()
        {
                lTowers.Clear();
                for (int i = 0; i < towerCount; i++)
                {
                        lTowers.Add(new List<int>());
                }
                for (int i = floorCount; i > 0; i--)
                {
                        lTowers[0].Add(i);
                }

                floorWidth = Screen.width / (towerCount + 1);
                floorHeight = Screen.height * 0.5f / (floorCount + 1);
                towerWidth = floorWidth * 1.2f;
                towerHeight = floorHeight * (floorCount + 2);
        }
        void DoStart()
        {
                bStarting = true;
                ioperationCount = 0;
                selectedTower = null;
        }
        bool bStarting;
        float btnWidth = 200;
        float btnHeight = 100;
        float floorWidth = 0;
        float floorHeight = 0;

        int? selectedTower;
        int ioperationCount;
        void OnGUI()
        {
                GUI.Label(new Rect(10, 10, 1000, 20),"Level:" + CurLevel);
                if (!bStarting)
                {
                        if (GUI.Button(new Rect(Screen.width / 2 - btnWidth, Screen.height / 2 - btnHeight, btnWidth, btnHeight), "Start"))
                        {
                                DoInit();
                                DoStart();
                        }
                        return;
                }

                if (bGameOver)
                {
                        GUI.Label(new Rect(Screen.width / 2 - btnWidth, Screen.height / 2 - btnHeight - 30, btnWidth * 2, 30), "Success! You spend " + ioperationCount + " operations");
                        if (GUI.Button(new Rect(Screen.width / 2 - btnWidth, Screen.height / 2 - btnHeight, btnWidth, btnHeight), "Restart"))
                        {
                                bGameOver = false;
                                bStarting = false;
                        }
                        return;
                }

                for (int i = 0; i < towerCount; i++)
                {
                        if (selectedTower.HasValue && selectedTower.Value == i)
                        {
                                GUI.Box(new Rect(i * (towerWidth + 10) + 20, Screen.height * 0.8f - floorHeight * (floorCount + 2), floorWidth * 1.2f, towerHeight), "");
                        }
                        if (GUI.Button(new Rect(i * (towerWidth + 10) + 20, Screen.height * 0.8f - floorHeight * (floorCount + 2), floorWidth * 1.2f, towerHeight), ""))
                        {
                                if (bGameOver)
                                {
                                        return;
                                }
                                if (selectedTower.HasValue)
                                {
                                        if (selectedTower.Value == i)
                                        {
                                                selectedTower = null;
                                                return;
                                        }

                                        if (lTowers[i].Count == 0 || lTowers[selectedTower.Value][lTowers[selectedTower.Value].Count - 1] < lTowers[i][lTowers[i].Count - 1])
                                        {
                                                DoMoveFloor(i);
                                        }
                                }
                                else if (lTowers[i].Count > 0)
                                {
                                        selectedTower = i;
                                }
                        }

                        GUI.Box(new Rect(i * (towerWidth + 10) + 20, Screen.height * 0.8f - floorHeight * 0.5f, floorWidth * 1.2f, floorHeight * 0.5f), "|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||");
                        GUI.Box(new Rect(i * (towerWidth + 10) + 20 + towerWidth / 2 - 10, Screen.height * 0.8f - towerHeight, 20, towerHeight), "=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n=\r\n");
                        for (int j = 0; j < lTowers[i].Count; j++)
                        {
                                float curFloorWidth = lTowers[i][lTowers[i].Count - j - 1] * 0.15f * floorWidth;
                                GUI.Box(new Rect(i * (towerWidth + 10) + 20 + towerWidth * 0.5f - curFloorWidth * 0.5f, Screen.height * 0.8f - floorHeight * 0.5f - floorHeight * (lTowers[i].Count - j), curFloorWidth, floorHeight), "");
                        }
                }
        }
        bool bGameOver;
        void DoMoveFloor(int moveToTower)
        {
                int ifloor = lTowers[selectedTower.Value][lTowers[selectedTower.Value].Count - 1];
                lTowers[selectedTower.Value].RemoveAt(lTowers[selectedTower.Value].Count - 1);
                lTowers[moveToTower].Add(ifloor);
                ioperationCount++;
                selectedTower = null;

                if (moveToTower != 0 && lTowers[moveToTower].Count == floorCount)
                {
                        bGameOver = true;
                        CurLevel++;
                }
        }
}


评分

参与人数 2鲜花 +52 收起 理由
z3280z + 2 很给力!
朱迪 + 50 很给力!

查看全部评分


回复

使用道具 举报

排名
46663
昨日变化
22

0

主题

3

帖子

8

积分

Rank: 1

UID
182033
好友
0
蛮牛币
4
威望
0
注册时间
2016-11-8
在线时间
3 小时
最后登录
2016-12-30
发表于 2016-11-8 14:58:13 | 显示全部楼层
感謝大大無私地分享

回复 支持 反对

使用道具 举报

排名
705
昨日变化

2

主题

283

帖子

1673

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
11079
好友
1
蛮牛币
3499
威望
0
注册时间
2013-12-25
在线时间
408 小时
最后登录
2017-5-26
发表于 2016-11-9 09:09:49 | 显示全部楼层
感謝大大無私地分享

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1492/1500
排名
1444
昨日变化

16

主题

359

帖子

1492

积分

Rank: 6Rank: 6Rank: 6

UID
88581
好友
0
蛮牛币
6902
威望
0
注册时间
2015-4-2
在线时间
511 小时
最后登录
2017-5-27
QQ
发表于 2016-11-9 09:11:03 | 显示全部楼层
目标4Kfighting

回复

使用道具 举报

排名
1319
昨日变化

5

主题

319

帖子

1294

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
35634
好友
5
蛮牛币
1788
威望
0
注册时间
2014-7-22
在线时间
294 小时
最后登录
2017-1-19
QQ
发表于 2016-11-9 10:37:52 | 显示全部楼层
简单粗暴

回复

使用道具 举报

排名
14367
昨日变化
4

0

主题

41

帖子

84

积分

Rank: 2Rank: 2

UID
182318
好友
0
蛮牛币
128
威望
0
注册时间
2016-11-9
在线时间
14 小时
最后登录
2017-5-2
发表于 2016-11-9 13:45:57 | 显示全部楼层
点赞楼主

回复

使用道具 举报

3偶尔光临
268/300
排名
8931
昨日变化
2

29

主题

97

帖子

268

积分

Rank: 3Rank: 3Rank: 3

UID
164457
好友
0
蛮牛币
12957
威望
0
注册时间
2016-8-27
在线时间
82 小时
最后登录
2017-3-28
发表于 2016-11-9 14:01:16 | 显示全部楼层
感謝大大無私地分享

回复 支持 反对

使用道具 举报

7日久生情
1653/5000
排名
774
昨日变化
2

1

主题

448

帖子

1653

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
111260
好友
0
蛮牛币
6239
威望
0
注册时间
2015-6-30
在线时间
278 小时
最后登录
2017-5-29
发表于 2016-11-9 14:35:55 | 显示全部楼层

点赞楼主
[发帖际遇]: 漫无边际 在网吧通宵,花了 2 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

3偶尔光临
154/300
排名
13973
昨日变化
2

0

主题

102

帖子

154

积分

Rank: 3Rank: 3Rank: 3

UID
137557
好友
1
蛮牛币
150
威望
0
注册时间
2016-2-25
在线时间
20 小时
最后登录
2017-4-20
发表于 2016-11-9 15:44:51 | 显示全部楼层

感謝大大無私地分享
感謝大大無私地分享

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1347/1500
排名
2433
昨日变化
10

24

主题

478

帖子

1347

积分

Rank: 6Rank: 6Rank: 6

UID
69941
好友
1
蛮牛币
4945
威望
0
注册时间
2015-1-20
在线时间
425 小时
最后登录
2017-5-29
发表于 2016-11-9 15:56:25 | 显示全部楼层
6666666666666666666666666666666666666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
647/1000
排名
2286
昨日变化
14

4

主题

42

帖子

647

积分

Rank: 5Rank: 5

UID
80951
好友
0
蛮牛币
1559
威望
0
注册时间
2015-3-17
在线时间
157 小时
最后登录
2017-5-29
发表于 2016-11-10 10:07:24 | 显示全部楼层
"|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" 这个是什么意思呢????

点评

哈哈,那是为了表示那里是不可操作区域。。  发表于 2016-11-10 13:17

回复 支持 反对

使用道具 举报

2初来乍到
111/150
排名
11182
昨日变化
1

0

主题

11

帖子

111

积分

Rank: 2Rank: 2

UID
178878
好友
0
蛮牛币
127
威望
0
注册时间
2016-10-28
在线时间
49 小时
最后登录
2017-5-15
发表于 2016-11-14 10:50:27 | 显示全部楼层
感謝大大無私地分享
感謝大大無私地分享

回复 支持 反对

使用道具 举报

排名
46663
昨日变化
22

0

主题

6

帖子

13

积分

Rank: 1

UID
189708
好友
0
蛮牛币
9
威望
0
注册时间
2016-12-5
在线时间
5 小时
最后登录
2017-5-5
发表于 2017-1-11 13:30:51 | 显示全部楼层
感谢分享
[发帖际遇]: weiyan 在论坛发帖时没有注意,被小偷偷去了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表