Screeps

Pokud si stejně jako já chcete rozšířit obzory v JavaScriptu, můžu vám vřele doporučit strategickou online hru Screeps. O co jde přesně? Celá hra se odehrává ve světě složeném z jednotlivých místností, v kterých jsou prťavé potvůrky/robůtci/tentočky které řídíte. Zajímavé je, jak je ovládate. Přímo to nejde a tak si musíte napsat vlastní umělou inteligenci, které je bude posílat těžit, bojovat, stavět a tak dále. No a jako bonus u toho nemusíte sedět, protože vše jede dál i bez vaší přítomnosti. Teda do okamžiku, než se váš soused rozhodne, že by se mu hodila i vaše místnost. Pak dojde na hradby, atomové bomby a tentočky zabijáky. screeps

Čím začít

V začátku jde o to mít dostatek creepů a vylepšovat kontrolér, který vám vyšším levelem otevře další možnosti ke stavbě. Například skladiště, teleporty, možnost produkovat lepší creepy a tak podobně. Pokud vám klesne na 0, tak končíte. Na obojí potřebujete energii, která se těží ze žlutých čtverečků, takže vaši první creepové by měli umět ji natěžit, donést do spawnu a pokud je plný, tak jít upgradovat kontrolér. To zhruba dělá následující kód, který asi řekne víc než další popis.

module.exports.loop = function () {
    // Mazani pameti zemrelych creepu
    for(var name in Memory.creeps){
        if(!Game.creeps[name]) {
            delete Memory.creeps[name];
            console.log('Zemrel creep: ' + name);
        }
    }

    // Spawnovani novych creepu
    if(Object.keys(Game.creeps).length < 3) { // pokud jich je min jak 3
         var name = Game.spawns['Spawn1'].createCreep([WORK, CARRY, MOVE]); // Popis stavby tela
         console.log('Narodil se creep: ' + name );
    }
    for( var name in Game.creeps)  {
        var creep = Game.creeps[name];

        // Pokud je dost mista ve spawnu a jsem plny, tak odvezeme energii tam
        if(_.sum(creep.carry) == creep.carryCapacity 
            && !creep.memory.upgrading
            && (Game.spawns['Spawn1'].energyCapacity - Game.spawns['Spawn1'].energy >= _.sum(creep.carry))) {
            var target = creep.room.find(FIND_STRUCTURES, {filter: {structureType: STRUCTURE_SPAWN}})[0];

            if(creep.transfer(target, RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
                creep.moveTo(target);
            }

        // Pokud jsem plny (a spawn uz je taky plnej) jedu upgradovat controller a nebo v upgradovani pokracuju     
        } else if (_.sum(creep.carry) == creep.carryCapacity || creep.memory.upgrading) {
            var target = creep.room.controller;
            creep.memory.upgrading = true;
            if(creep.upgradeController(target) == ERR_NOT_IN_RANGE) {
                creep.moveTo(target);
            }

            // Hotovo. Mazu si z pameti ze mam upgradovat
            if (_.sum(creep.carry) == 0) delete creep.memory.upgrading;

        // Kdyz nic nemam, tak jdu tezit
        } else {
            var source = creep.pos.findClosestByPath(FIND_SOURCES);
            if(creep.harvest(source) == ERR_NOT_IN_RANGE) {
                creep.moveTo(source)
            }
        }
    }
}

Doporučuju ho maximálně na první pokusy, protože z důvodu snadného zobrazení na webu je všechno v jednom souboru a navíc nepočítá s tím, že by každý creep dělal něco jiného. Což je po pár hodinách třeba. Jeden neustále těží, další to odnáší, jiný je brání, někdo staví budovy a opravuje cesty. To všechno musíte navíc rozumně optimalizovat, protože každý hráč má omezenou paměť, kam si můžete ukládat stav mezi jednotlivým spuštěním scriptu a CPU, kdy vám je běh scriptu zaříznut, pokud používáte příliš často náročné operace, jako například pathfinding. Naštěstí si například cesty můžete ukládat do paměti a aktualizovat je jen jednou za čas. Navíc vám hra postupně přidává limit CPU a můžete jet chvíli na sekeru(pokud třeba jednou za 50 herních ticků potřebujete udělat složitější operaci).

Co za to

Hra stojí pár euro na steamu, ale hrát ji pak můžete i v prohlížeči(Pro Safari bohužel není moc optimalizovaná. No dobře, ona v pohodě běží asi jen v Chrome), ale on stejně člověk většinu času tráví v IDE či editoru. Koupí si zároveň předplatíte hraní na oficiálním serveru na měsíc. Pak musíte začít platit a nebo si spustit server vlastní. Zkusit si můžete na screeps.com také zdarma tutoriál.

OCS

Pokud vás Screeps zaujalo a už jste se alespoň trochu rozkoukali, tak se pro inspiraci podívejte na OCS, což je skupina lidí, která na Githubu spojila síly v tvorbě AI a nebo se k nám rovnou přidejte.