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

扫一扫,访问微社区

开发者专栏

关注:1972

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

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

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

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

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

53

主题

877

帖子

7569

积分

Rank: 9Rank: 9Rank: 9

UID
287
好友
44
蛮牛币
4481
威望
30
注册时间
2013-6-9
在线时间
1939 小时
最后登录
2017-11-24

七夕浪漫情人社区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++;
                }
        }
}


评分

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

查看全部评分


回复

使用道具 举报

排名
53168
昨日变化
21

0

主题

3

帖子

8

积分

Rank: 1

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

回复 支持 反对

使用道具 举报

排名
806
昨日变化
4

2

主题

293

帖子

1725

积分

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

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

回复 支持 反对

使用道具 举报

7日久生情
1868/5000
排名
1093
昨日变化
1

18

主题

414

帖子

1868

积分

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

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

回复

使用道具 举报

排名
1511
昨日变化
2

5

主题

319

帖子

1297

积分

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

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

回复

使用道具 举报

排名
16105
昨日变化
10

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偶尔光临
274/300
排名
9983
昨日变化
12

26

主题

94

帖子

274

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
2017/5000
排名
613
昨日变化
1

1

主题

531

帖子

2017

积分

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

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

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

回复

使用道具 举报

3偶尔光临
154/300
排名
15663
昨日变化
12

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 | 显示全部楼层

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

回复 支持 反对

使用道具 举报

7日久生情
1879/5000
排名
1584
昨日变化
8

33

主题

595

帖子

1879

积分

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

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1022/1500
排名
1323
昨日变化
6

4

主题

42

帖子

1022

积分

Rank: 6Rank: 6Rank: 6

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

点评

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

回复 支持 反对

使用道具 举报

3偶尔光临
237/300
排名
8471
昨日变化
7

0

主题

35

帖子

237

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

排名
53168
昨日变化
21

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 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

3偶尔光临
200/300
排名
11261
昨日变化
11

1

主题

83

帖子

200

积分

Rank: 3Rank: 3Rank: 3

UID
236868
好友
0
蛮牛币
518
威望
0
注册时间
2017-8-10
在线时间
52 小时
最后登录
2017-11-23
发表于 2017-8-30 15:12:01 | 显示全部楼层
感謝大大無私地分享
[发帖际遇]: JDYF1023 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

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

本版积分规则

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