2016-10-01 277 views
4

在遊戲編程Screeps我用產卵毛骨悚然:如何在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); 
} 

的「未定義」的標籤是一個隨機名稱產卵蠕變。現在我想知道,因爲我有不同類型的毛骨悚然,如果我可以添加一個角色標籤的面前呢?例如,像[Transporter] RandomName一樣。

這可能嗎?

+0

你可以實現一個函數,將以您想要的格式生成名稱,並用生成的名稱 –

+0

代替undefined,這可能嗎?我不確定如果我可以更改未定義的值 – user3220962

+0

是的,這是可能的。我將在下面的答案中詳細闡述 –

回答

4

您可以實現一個函數,它將以您想要的格式生成名稱,並用生成的名稱替換undefined。從Screeps documentation

createCreep(體,[姓名],[存儲器])

開始蠕變產卵過程。所需能量可從 撤出房間內的所有產卵和擴展。

[...]

名(可選)字符串

新蠕變的名稱。它應該是唯一的 蠕變名稱,即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; 
} 
+0

我試過[Builder] + creep.random.name,但後來我得到錯誤Builder沒有定義,所以我認爲tit不能按計劃工作。有點無知如何做我自己的功能x) – user3220962

+0

如果你想完全隨機的名字,你可以嘗試這個答案上描述的解決方案http://stackoverflow.com/a/1349426/1814415 –

+0

不是真的。編號喜歡有一個前綴,顯示我的小兵的角色^,^ – user3220962

0

我發現,在screeps默認命名方案缺乏,因爲名字就不說了太多關於小兵的角色。爲此,我編寫了一個名爲util.nameBuilder的小型實用程序類。

它使用Memory.nameIndex = {};來跟蹤前綴已被分配給蠕變的次數。因爲我不想隨機增加計數,如果爬行產卵失敗我有getName(role)commitName(role)getName()返回一個名稱供使用,commitName()將使計數增加1.如果計數超過某個閾值(比如1000)以防止像harvester243874這樣的名字出現,您可能需要「摺疊」計數。如果createCreep()返回'正在使用的名稱'錯誤,我的生成方法實際上會調用commitName(role)

這段代碼的結果是一樣的名字: harvester1,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; 
6

我發現,只是他們的工作命名和當前的遊戲時間滿足這項需求良好。

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

一個卵只能讓一個爬行的時間,所以這個名字應該永遠是唯一的。

唯一的問題是,如果2+產卵儘量讓一個機器人在同一時間(相同打勾),任何人沒有首先開始產卵將無法與ERR_NAME_EXISTS,但你可以只讓他們在你的下一個週期。

enter image description here

+0

我喜歡這個想法。我會用canCreateCreep來改進它。然後添加遊戲時間的數字,直到沒有衝突。這樣,名字保持儘可能短。 –

3

到@馬修 - 雷古爾我只是給他們連接到他們的責任了一個隨機序列號類似:

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

雖然他移除了重複名稱的極小可能性