【问题标题】:How to generate a random name with a preceding nametag in Screeps?如何在 Screeps 中生成带有前面名称标签的随机名称?
【发布时间】:2017-02-10 03:21:27
【问题描述】:

在编程游戏 Screeps 中,我使用以下方法生成小兵:

if(transporters.length < 0 && harvesters.length > 2) {
var newName = Game.spawns['SpawnZone'].createCreep([WORK,CARRY,MOVE], undefined, {role: 'transporter'});
console.log('Spawning new Transporter: ' + newName);
}

“未定义”标签用于生成具有随机名称的cree。现在我想知道,既然我有不同类型的小兵,我是否可以在它前面添加一个角色标签?例如,[Transporter] RandomName。

这可能吗?

【问题讨论】:

  • 你可以实现一个函数,以你想要的格式生成名称,并用生成的名称替换 undefined
  • 这可能吗?我不确定是否可以更改未定义的值
  • 是的,有可能。我将在下面的答案中进一步详细说明

标签: javascript screeps


【解决方案1】:

您可以实现一个函数,以您想要的格式生成名称并将undefined 替换为生成的名称。来自 Screepsdocumentation:

createCreep(body, [name], [memory])

开始蠕变生成过程。所需的能量可以是 从房间中的所有生成和扩展中退出。

[...]

名称(可选)字符串

一个新creep的名字。它应该是独一无二的 蠕变名称,即 Game.creeps 对象不应包含另一个 具有相同名称的蠕变(哈希键)。如果未定义,则为随机名称 将生成。

Screeps 论坛实际上已经有一个solution 来满足您的需求。成绩单如下:

var names1 = ["Jackson", "Aiden", "Liam", "Lucas", "Noah", "Mason", "Jayden", "Ethan", "Jacob", "Jack", "Caden", "Logan", "Benjamin", "Michael", "Caleb", "Ryan", "Alexander", "Elijah", "James", "William", "Oliver", "Connor", "Matthew", "Daniel", "Luke", "Brayden", "Jayce", "Henry", "Carter", "Dylan", "Gabriel", "Joshua", "Nicholas", "Isaac", "Owen", "Nathan", "Grayson", "Eli", "Landon", "Andrew", "Max", "Samuel", "Gavin", "Wyatt", "Christian", "Hunter", "Cameron", "Evan", "Charlie", "David", "Sebastian", "Joseph", "Dominic", "Anthony", "Colton", "John", "Tyler", "Zachary", "Thomas", "Julian", "Levi", "Adam", "Isaiah", "Alex", "Aaron", "Parker", "Cooper", "Miles", "Chase", "Muhammad", "Christopher", "Blake", "Austin", "Jordan", "Leo", "Jonathan", "Adrian", "Colin", "Hudson", "Ian", "Xavier", "Camden", "Tristan", "Carson", "Jason", "Nolan", "Riley", "Lincoln", "Brody", "Bentley", "Nathaniel", "Josiah", "Declan", "Jake", "Asher", "Jeremiah", "Cole", "Mateo", "Micah", "Elliot"]
var names2 = ["Sophia", "Emma", "Olivia", "Isabella", "Mia", "Ava", "Lily", "Zoe", "Emily", "Chloe", "Layla", "Madison", "Madelyn", "Abigail", "Aubrey", "Charlotte", "Amelia", "Ella", "Kaylee", "Avery", "Aaliyah", "Hailey", "Hannah", "Addison", "Riley", "Harper", "Aria", "Arianna", "Mackenzie", "Lila", "Evelyn", "Adalyn", "Grace", "Brooklyn", "Ellie", "Anna", "Kaitlyn", "Isabelle", "Sophie", "Scarlett", "Natalie", "Leah", "Sarah", "Nora", "Mila", "Elizabeth", "Lillian", "Kylie", "Audrey", "Lucy", "Maya", "Annabelle", "Makayla", "Gabriella", "Elena", "Victoria", "Claire", "Savannah", "Peyton", "Maria", "Alaina", "Kennedy", "Stella", "Liliana", "Allison", "Samantha", "Keira", "Alyssa", "Reagan", "Molly", "Alexandra", "Violet", "Charlie", "Julia", "Sadie", "Ruby", "Eva", "Alice", "Eliana", "Taylor", "Callie", "Penelope", "Camilla", "Bailey", "Kaelyn", "Alexis", "Kayla", "Katherine", "Sydney", "Lauren", "Jasmine", "London", "Bella", "Adeline", "Caroline", "Vivian", "Juliana", "Gianna", "Skyler", "Jordyn"]

Creep.getRandomName = function(prefix){
    var name, isNameTaken, tries = 0;
    do {
        var nameArray = Math.random() > .5 ? names1 : names2;
        name = nameArray[Math.floor(Math.random() * nameArray.length)];

        if (tries > 3){
            name += nameArray[Math.floor(Math.random() * nameArray.length)];
        }

        tries++;
        isNameTaken = Game.creeps[name] !== undefined;
    } while (isNameTaken);

    return prefix+" "+name;
}

【讨论】:

  • 我试过 [Builder]+creep.random.name 但后来我得到错误 Builder is not defined 所以我认为 tit 没有按计划工作。有点无能为力如何做我自己的功能x)
  • 如果您想要完全随机的名称,您可以尝试此答案stackoverflow.com/a/1349426/1814415 中描述的解决方案
  • 并非如此。我喜欢有一个前缀来显示我的小兵的角色^,^
  • 您可以将前缀作为参数传递给函数并在返回之前将其连接起来
  • 其实我不介意名字后面有标签。有没有办法仍然使用随机函数(未定义)并将其添加到后面?我认为我犯了格式错误..认为它会像 undefined +'[Role]' 一样工作:/
【解决方案2】:

我发现 screeps 中缺少默认的命名方案,因为这个名字并没有过多地说明creeps 的作用。为此,我编写了一个名为 util.nameBuilder 的小型实用程序类。

它使用Memory.nameIndex = {}; 来跟踪前缀被分配给cree 的次数。因为如果cree 的生成失败,我不想随机增加计数,所以我有一个getName(role) 和一个commitName(role)getName() 返回一个供使用的名称,commitName() 会将计数增加 1。如果计数超过某个阈值(例如 1000),您可能希望“折叠”计数,以防止使用像harvester243874 这样的名称。如果 createCreep() 返回“名称已在使用”错误,我的 spawn 方法实际上会调用 commitName(role)

这段代码的结果是这样的名称: 收割机1, builder23, upgrader5

var nameBuilder = {
    getName: function(role) {
        if (Memory.nameIndex === undefined)
            Memory.nameIndex = {};

        if (Memory.nameIndex[role] === undefined) 
            Memory.nameIndex[role] = 0;

        return role + (Memory.nameIndex[role] + 1);
    },

    commitName: function(role) {
        var newIndex = Memory.nameIndex[role] + 1;
        Memory.nameIndex[role] = newIndex;
    }
};

module.exports = nameBuilder;

【讨论】:

    【解决方案3】:

    我发现仅仅用他们的工作和当前的游戏时间来命名就可以很好地满足需求。

    例如:"Builder" + Game.time.toString() = Builder1234

    一个spawn一次只能制造一个creep,所以名字应该是唯一的。

    唯一的问题是,如果 2 个以上的生成器尝试同时创建一个机器人(相同的滴答声),没有先启动生成器的人将失败并显示 ERR_NAME_EXISTS,但你可以让他们在你的下一个周期。

    【讨论】:

    • 我喜欢这个主意。我会用 canCreateCreep 改进它。然后添加游戏时间的数字,直到没有冲突。这样,名称就尽可能短。
    【解决方案4】:

    类似于@Matthew-Regul,我只是给了他们一个随机序列号,附加到他们的职责中:

    'UPGRADER_' + (Math.floor(Math.random() * 65534) + 1)
    

    虽然他消除了重复名字的极微小的可能性

    【讨论】:

      【解决方案5】:
      "Upgrader_" + spawn.name + "_" + Game.time
      

      创建一个保证的唯一名称。

      【讨论】:

        猜你喜欢
        • 2011-08-13
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多