00002 贪婪洞窟.003.6:怪物、宝箱和掉落

2024-04-08 09:48

本文主要是介绍00002 贪婪洞窟.003.6:怪物、宝箱和掉落,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



00002 贪婪洞窟.003.6:怪物、宝箱和掉落

       怪物的定义在monstersAttribute_X.plist中,各个字段都很容易理解。唯一要说明的是那些攻防属性,它们都是拥有2个元素的数组。元素0用于普通怪,元素1用于精英怪。

整理怪物为HTML表格的Swift代码如下:

let version = "贪婪洞窟(v1.5.0)"

let monstersAttribute_1:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/monstersAttribute_1.plist")

let monstersAttribute_2:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/monstersAttribute_2.plist")

let monstersAttribute_3:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/monstersAttribute_3.plist")

let names:NSDictionary? =NSDictionary(contentsOfFile:"/Users/x/\(version) /LocalString_zh.plist")

 

func stringValue(value:String?)->String

{

    if value==nil

    {

        return ""

    }

    else

    {

        return value!

    }

}

func getName(id:String)->String

{

    return stringValue(names!.valueForKeyPath("\(id)") as? String)

}

 

let properties = ["level","hp","defence","atk_min","atk_max","exp","coin",

    "atk_fire","atk_water","atk_wood","atk_light","atk_dark",

    "def_fire","def_water","def_wood","def_light","def_dark"]

func generatePropertiesHeader()->String

{

    var header = ""

    for i inproperties

    {

        header += "<td>\(i)(普通)</td>"

    }

    for i inproperties

    {

        header += "<td>\(i)(精英)</td>"

    }

    return header

}

var result = "<tableborder='1'>"

result += "<tr><td>id</td><td>名称</td><td>弱点</td><td>攻速</td><td>描述</td>\(generatePropertiesHeader())</tr>"

func generateProperties(monstersAttribute: NSDictionary, key:String)->String

{

    var puTong = ""

    var jingYing = ""

    for i inproperties

    {

        let v = monstersAttribute.valueForKeyPath("\(key).\(i)")

        if v == nil

        {

            puTong += "<td>&nbsp;</td>"

            jingYing += "<td>&nbsp;</td>"

        }

        else

        {

            let values = v as! [String]

            puTong += "<td>\(values[0])</td>"

            jingYing += "<td>\(values[1])</td>"

        }

    }

 

    return puTong + jingYing

}

func generateListItem(monstersAttribute: NSDictionary, key:String)->String

{

    let name = getName(monstersAttribute.valueForKeyPath("\(key).name") as! String)

    let weakpoint = monstersAttribute.valueForKeyPath("\(key).weakpoint") as! String

    let speed = monstersAttribute.valueForKeyPath("\(key).speed") as! String

    let des = getName(monstersAttribute.valueForKeyPath("\(key).des1") as! String)

   

    return "<tr><td>\(key)</td><td>\(name)</td><td>\(weakpoint)</td><td>\(speed)</td><td>\(des)</td>\(generateProperties(monstersAttribute, key: key))</tr>"

}

func generateList(monstersAttribute: NSDictionary)->String

{

    let allKeys = monstersAttribute.allKeys.sort({ (t1, t2) -> Bool in

        return NSInteger.init(t1 as! String)! < NSInteger.init(t2 as! String)! ? true:false

    })

   

    var list = ""

    for key in allKeys

    {

        list +=generateListItem(monstersAttribute, key: key as! String)

    }

    return list + "<tr><td colspan='\(5+properties.count*2)'><hr/><hr /><hr /></td></tr>"

}

 

result +=generateList(monstersAttribute_1!)

result +=generateList(monstersAttribute_2!)

result +=generateList(monstersAttribute_3!)

 

result += "</table>"

 

print(result)

       monstersAttribute_X.plist中,没有掉落配置,这难免让人觉得奇怪。

       其实用到掉落的地方有不少,怪物有、宝箱有、罐子也有,只要是按几率给予玩家物品的地方,都可以用到掉落。开发者将掉落集合到了一个文件中,按照地牢层进行配置,这个文件就是treasureAttribute_X.plist

       对于每一层,有4种类别的掉落,分别是怪物、墙壁、钱袋子和宝箱:

       11 = {

              "KEY_MONSTERS" = { …… };

              "KEY_WALL" = { …… };

              "KEY_COIN_BAG" = { …… };

              "KEY_BOXES" = { …… };

       };

       钱袋子必然掉落金币,也只掉落金币,而不是各种几率下的物品。因此,它的配置比较简单:

                   "KEY_COIN_BAG"= {

                            "KEY_COIN_MIN"= 6;

                            "KEY_COIN_MAX"= 10;

                   };

       只是掉落金币的最大最小范围罢了。

       墙壁是什么东西一时没想出来:

                   "KEY_WALL"= {

                            "KEY_PROBABILITY_PLIST_ID"= 81002;

                   };

       81002对应的具体掉落物品为(掉落信息在下面会具体讲):

弱效生命药剂:100

弱效魔法药剂:100

铁镐:100

灵视卷轴:100

小牙齿:100

恶魔粑粑:100

蝙蝠翅膀:100

灰烬:100

石块:100

破口袋:100

       宝箱和怪物都有很多种。它们的掉落配置是按照种类来的。

                   "KEY_BOXES"= {

                            2001= {

                                     "KEY_PROBABILITY_PLIST_ID"= 13002;

                                     "KEY_IMG_ID"= 1;

                            };

                            2002= {

                                     "KEY_PROBABILITY_PLIST_ID"= 14002;

                                     "KEY_IMG_ID"= 2;

                            };

                            ……

                   };

            };

       20012002是宝箱的id,具体对应什么宝箱可参考前面的文章。

       KEY_PROBABILITY_PLIST_ID指定的便是掉落id,该id必须在prizePoolAttribute.plist中存在。

       KEY_IMG_ID的作用未知。

         怪物的掉落配置和宝箱类似,只不过它有两个掉率选项。

                   "KEY_MONSTERS"= {

                            1005= {

                                     "KEY_PROBABILITY_PLIST_ID"= (

                                              41005,

                                               71003,

                                     );

                            };

                            1006= {

                                     "KEY_PROBABILITY_PLIST_ID"= (

                                               41006,

                                               71003,

                                     );

                            };

                            ……

                   };

       机灵点的大概已经想到怪物为啥有两个掉率选项了。不错,正和怪物的属性一样,一个用于是普通怪,一个用于精英怪。

       下面需要说说prizePoolAttribute.plist

它的格式并不复杂:

         310011= {

                   "KEY_TREASURE_ID"= ( …… );

                   "KEY_PROBABILITY"= (…… );

};

310011是掉落idKEY_TREASURE_IDKEY_PROBABILITY都是一个数字数组,前者对应装备和物品的id,后者对应掉落几率。

                   "KEY_TREASURE_ID"= (

                            12281,

                            22281,

                            32281,

                            42281,

                            52281,

                            62281,

                            ……

                   );

                   "KEY_PROBABILITY"= (

                            0,

                            133,

                            266,

                            399,

                            532,

                            665,

                            ……

                   );

不考虑被……省略的内容,1228162281的掉落计算大概如下:

在闭区间[0, 665]中生成一个随机数,如果落在:

l        [0,133):掉落12281

l        [133,266):掉落22281

l        ……

l        [665,665]:掉落62281

好吧,最后一个看起来很不协调,也许后面的665应当加上一个值。不过这怎么弄都是猜测,我就不说了。

下面给出根据掉落id返回掉落物品列表的Swift代码:

let version = "贪婪洞窟(v1.5.0)"

let prizePoolAttribute:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/prizePoolAttribute.plist")

let equipmentAttribute:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/equipmentAttribute.plist")

let itemsAttribute:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/itemsAttribute.plist")

let names:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version) /LocalString_zh.plist")

 

func stringValue(value:String?)->String

{

    if value==nil

    {

        return ""

    }

    else

    {

        return value!

    }

}

func getName(id:String)->String

{

    return stringValue(names!.valueForKeyPath("\(id)") as? String)

}

func getDropEIName(id:String)->String

{

    let v = equipmentAttribute!.valueForKeyPath("\(id).name")

    if v != nil

    {

        var rare:String = ""

        switch (equipmentAttribute!.valueForKeyPath("\(id).rare") as! NSString).integerValue

        {

        case 1:rare = "白色"

        case 2:rare = "蓝色"

        case 3:rare = "金色"

        case 4:rare = "暗金"

        default://rare = "套装"

            rare = getName(equipmentAttribute!.valueForKeyPath("\(id).suit_des") as! String)

        }

       

        return getName(v as! String)+"(\(rare))"

    }

   

    let v2 = itemsAttribute!.valueForKeyPath("\(id).name")

    if v2 != nil

    {

        return getName(v2 as! String)

    }

   

    return ""

}

func getDrops(id:String)->String

{

    let v = prizePoolAttribute!.valueForKeyPath("\(id).KEY_TREASURE_ID")

    if v == nil

    {

        return ""

    }

   

    var probabilities:[Int] = []

    for i in prizePoolAttribute!.valueForKeyPath("\(id).KEY_PROBABILITY") as! [String]

    {

        probabilities.append(Int.init(i, radix: 10)!)

    }

   

    var drops = ""

    let items = v as! [String]

    for i in 0...items.count-1

    {

        var probability = ""

        if i == items.count-1

        {

            probability = String(probabilities[i] - probabilities[i-1])

        }

        else

        {

            probability = String(probabilities[i+1] - probabilities[i])

        }

        drops += getDropEIName(items[i]) + ":\(probability)\n"

    }

    return drops

}

       上面的那个81002对应的掉落物品列表就是用这段代码生成的:

弱效生命药剂:100

弱效魔法药剂:100

铁镐:100

灵视卷轴:100

小牙齿:100

恶魔粑粑:100

蝙蝠翅膀:100

灰烬:100

石块:100

破口袋:100

装备和物品名称后面的数字并非prizePoolAttribute.plist中的原始数值,而是按照个人的理解进行了一定的计算。计算方法:

n个物品的掉落数值=n+1个物品的原始掉落数值-n个物品的原始掉落数值

如果是最后一个物品,其掉落数值和前面一个(倒数第二个)相同。

代码本身有点瑕疵,也不够完善,应当能够根据怪物、宝箱的id来获取或指定其对应的掉落物品列表,但这需要界面的配合,以后会完善的。

这篇关于00002 贪婪洞窟.003.6:怪物、宝箱和掉落的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885244

相关文章

cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。

Cocos2d-x中类CCProgressTimer实现游戏人物血条 一、CCProgressTimer的基本使用步骤: cocos2d-x的进度条函数CCProgressTimer,我们可以这样定义: 1. //s_pPathSister1为图片的路径 2. CCProgressTimer *left = CCProgressTimer::create(

『功能项目』怪物消亡掉落宝箱【18】

本章项目成果展示 我们打开上一篇17销毁怪物蛋的Shaders消融特效的项目, 本章要做的事情是在怪物消亡时掉落一个宝箱功能, 首先在资源商店下载一个宝箱物品 拖拽至场景中 完全解压缩 重命名Box 放进Prefabs预制体文件夹后在场景中删除 增加Box两个组件并修改其大小 对Box预制体增加一个光亮效果 修改脚本:

『功能项目』销毁怪物蛋的Shaders消融特效【17】

本章项目成果展示 我们打开上一篇16主角的信息显示的项目, 本章要做的事情是在怪物消亡时生成一个销毁特效 首先创建一个Unlit Shader 重命名为Dissolve 双击进入脚本后编写脚本: Shader "Unlit/Dissolve"{Properties{//物体基础材质纹理[Header(Base Texture)][Space(10)][NoS

『功能项目』怪物的信息显示【15】

本章项目成果展示 我们打开上一篇14怪物反击主角复活的项目, 本章要做的事情是当主角进入怪物的攻击范围之内时显示怪物的血量信息 在Canvas创建一个空物体 将空物体GameObject钉到视角上方 重命名为KingInfoUI 在子级创建一个Image 在资源文件夹下创建一个空文件命名为Image 将创建的怪物信息对象UIKingInfoU

『功能项目』怪物反击主角复活【14】

本章项目视频展示 当前文章成果展示 我们打开上一篇13技能爆炸与伤害数值显示的项目, 新建一个脚本InfoSystem.cs 新建一个游戏管理器GameManager.cs 在场景中创建一个空物体命名为GameManager 将GameManager.cs脚本挂载至空物体GameManager对象身上 增添PlayerRayClickNavigat

『功能项目』怪物受击后显示受击状态UI【12】

本专栏每10章会做一次项目优化,但不影响具体功能 我们可以打开优化前的项目10也可以打开优化后的项目11 双击King或者怪物熊预制体 - 进入预制体空间后创建一个Image改名为StateUI01 代表第一个受击状态 修改Canvas的渲染模式  -  改为世界WorldSpace 调节Image(StateUI01)尺寸0.01缩放,并移动到怪物头顶上 将以下资源导入之

UE5游戏——显示打击怪物的伤害值显示

要在Unreal Engine 5中实现显示打击怪物时的伤害数值,你可以按照以下步骤操作: 1. 创建UI元素: 在UE5的内容浏览器中创建一个新的User Widget蓝图(或者直接从项目设置的默认UI蓝图开始)。在这个蓝图中添加一个Text Block组件用于显示伤害值。 2. 设置UI蓝图: 调整Text Block的位置和外观使其适合游戏界面。在Widget蓝图中添加事件图表,并在

贪婪大陆(线段树题解)

P2184 贪婪大陆 用线段树维护一个区间的sum和tag(懒标记) 我的第一打,没用上容斥原理 显然如果第五个区间也加入第三种,我们再访问3-5有多少种用我下面的代码只能是2种 #include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+10;#define ls (u<<1)

『功能项目』怪物受击的动画事件【10】

我们打开上一篇09着色器光透魔法球的项目, 本章要做的事情是在场景中创建一个怪物对象,当怪物被主角的魔法球击中后播放受击动画效果,此类技术用到动画事件帧,在动画上创建脚本。 首先打开资源商店选择一个免费资源的怪物模型加载至项目中 将导入包的熊Bear资源模型Prefab放置场景中 完全解压缩 创建一个怪物熊的动画状态机 命名为MonsterBearA

【D-DCVRP】求解DCVRP改进贪婪算法(三)

一、Held-Harp模型 海尔德和卡尔普在1970年提出景点模型,用于求解TSP问题的最优解下界· 该模型同样可以用于DCVRP问题,既有定理1成立。 定理1:根据Held-Karp模型使用向量 π = ( 0 , π 1 , π 2 , ⋯   , π n ) \pi=(0,\pi_1,\pi_2,\cdots,\pi_n) π=(0,π1​,π2​,⋯,πn​)改造DCVRP问题中1