#119 No problem, bro, no sabía si estabas hablando de OOP o haciendo la broma, por lo de que "no está OOP" (del OP del overpowered de la jerga nerd). Por si acaso, asumí que ambas. Ya que te referías a OOP de verdad, como contestación adicional no, JS no es un lenguaje orientado a objetos por definición, y no utiliza clases, herencia y polimorfismo como tal. Pero se puede hacer algo parecido con varios patrones.
#124 Ya lo he leido. La version web online hay que pagar.
Lo unico que veo gratis es el tutorial como dice #123.
#125 https://screeps.com/a/#!/sim
Si te sale el tutorial directamente pulsa back, y tendras 3 opciones:
Tutorial, training mode, custom mode. All free.
#128 Y sin el digamos, si. En esos 3 modos todo el codigo se ejecuta en tu navegador. En el online tu codigo se ejecuta en su servidor.
No soy precisamente fan de JS, pero vamos a probar el jueguecito.
Si no te importa, #1, voy a robarte vilmente el contenido del post para otro foro(citándote, claro).
Yo lo he dejado trabajando con el código de #1 , esta noche le hare una visita a ver en que puedo mejorar y desarrollar un par de cosillas.
Pero como quiere alguien que no odie js joder es que joder
for(var name in Game.creeps) {
var creep = Game.creeps[name]; <--- WTF? En qué quedamos que es Game.creeps?
}
#133 Te contesto sin haber jugado prácticamente por lo que creo que es, si patino que alguien me corrija.
Game.Creeps es un array con los Creeps que tienes, y estos creeps tienen variables asignadas (por ejemplo role o name). Luego se asigna la variable "creep", en cada loop del for, según lo que contenga la variable name del creep que toque en ese loop. El array para que lo entiendas sería algo así como:
Game.Creeps = [Creep1 (name=Harverster1), Creep2 (name=Harverster2), Creep3 (name=Harverster3)]
Entonces
for(var name in Game.creeps) { --> Para cada variable name, dentro de Game.Creeps
var creep = Game.creeps[name]; --> La variable "creep" es igual a el Creep cuyo nombre sea la variable name en ese momento.
}
#133 Lo que se conoce como hash, un diccionario que almacena pares <clave, valor>. For (var name in Game.creeps) es un bucle en el que name tomará como valor cada una de las claves.
var miHash = {
a: 1,
b: "dos",
c: new Date()
}
for(var property in miHash){
console.log(property);
}
Resultado:
a
b
c
Si accedes a miHash[property] accederás a miHash["a"], miHash["b"] y miHash["c"]. En Javascript puedes acceder a las propiedades de un objeto de varias maneras. Las más utilizadas son objeto.propiedad (miHash.a, miHash.b) que suele ser lo más natural, sobre todo si vienes de POO, u objeto['propiedad' <-- un string], que es muy útil cuando quieres, por ejemplo, acceder a una serie de propiedades que no conoces de antemano. Si te llega un array arr =['a','b'], la única manera de acceder a esas propiedades sin conocer antes su valor es miHash[arr[el índice que quieras]].
En serio veis normal que exista un for simplificado en un diccionario/mapa y que mágicamente te devuelva el nombre? Es confuso como él solo, debería de devolverte una entrada del diccionario/mapa y luego ya poder elegir.
Programo en Java/Kotlin
val map = HashMap<Int, String>()
for ((i, s) in map) {
... // code
}
#140 Pues el problema está en que programas en Java, y estás acostumbrado a ese tipo de lenguajes. Intuyo que normalmente tocas lenguajes fuertemente tipados. Acostumbrarse a otros lenguajes más parecidos a JS, como pueden ser Ruby o Python requiere entender el origen y la utilidad del lenguaje.
Por ejemplo, entiende que JS es un lenguaje que inicialmente fue pensado como un lenguaje "limitado, pequeño" pensado para ejecutarse en un navegador, y ahora está en alza, ha salido del browser y está evolucionando de forma acorde. En el caso de Ruby, Matz (su creador) ya explicó que su propósito era crear un lenguaje eficiente y muy semántico, por eso encontrarás cosas (que podrás amar, o considerar una herejía) como poder crear una fecha con 3.days.ago. Cosas buenas de Java: que es muy difícil cagarla, que es estricto, lo que es un int siempre será un int. Cosas malas: poco flexible en algunos aspectos, portabilidad "cuestionable".
Cosas buenas de JS: que tienes muchísima libertad, puedes redefinir objetos, funciones en tiempo de ejecución, realizar programación funcional. Cosas malas: si no te controlas y pones orden, la puedes cagar y enmarañar de mil maneras.
Como te digo... es cuestión de gustos. A mí, personalmente, me encanta la programación. Prefiero JS, pero me gusta programar en Java/C# también, y me encantaría ponerme con C (admiro a los que pican C a diario) si tuviera muuucho tiempo.
Ejemplo muy simple. Quieres iterar como te mola a ti en tu lenguaje:
Bueeeeeeno, como lo lleváis? Yo he avanzado un montón, me da cosilla compartir mi código nuevo, fruto del sudor de mi frente xD. Me explico.
Actualmente el rol de harvester consistía en mover un creep hacia un source, minar y cuando está full volver a la base a almacenar. Ahí se pierde MUCHO tiempo, así que he repartido la tarea en 2 creeps:
Minero: El creep buscará un source, se desplazará a él y lo empezará a minar. Dicho creep no tiene la función CARRY por lo que toda su energia irá al suelo. Ese creep jamás se moverá de su posición, estará siempre pegado a un source minando como un negro.
Helper: Un creep con partes de CARRY + MOVE solamente, no necesita WORK. Se mueve muy rapido y buscará energia esparcida en el suelo, si la encuentra se desplazará y la devolverá a la base.
De ésta forma conseguimos un creep que no parará de trabajar y 2 o 3 helpers que recogeran la energia del suelo y la moverán. Ahora viene lo bueno:
El creep helper tiene una comprobación, cada vez que se desplaza ejecutará lo siguiente:
var creepCurrentPosition = creep.pos;
if(Game.map.getTerrainAt(creepCurrentPosition) == 'plain'){
creep.room.createConstructionSite(creepCurrentPosition, STRUCTURE_ROAD);
}
De ésta forma, mientras el helper se desplaza mirará si está encima del "suelo", de ser así designará la construcción de una carretera. El creep con rol builder detectará la designación y la construirá, haciendo que los creeps que se desplazan por un mismo camino lo hagan el doble de rápido.
Ahora mis creeps pueden planificar una construcción automáticamente. Viva la IA joder!!
#141 no. Si alguien lo crea agradecería estar como admin.
#143 yo estoy ahora terminando con el tutorial, que he tenido cosas que hacer, y a ver si me mola y empiezo a escribir algo de código organizado (odio tener piezas desperdigadas).
Si la cosa va bien, esta misma noche creo repo y si queréis grupo (o créalo tú si prefieres estar como máximo admin, que yo soy algo irregular con las actualizaciones, pero podría ayudar con lo que hiciera falta )
#144 Yo tengo repo creado ya, pero mi colega no puede sincronizarlo desde el juego... Quieres probar?
Qué pasada de juego! En github hay algún que otro proyecto que también es de este estilo pero no tiene un resultado gráfico, todo va por logs.
Le voy a echar un vistazo a la demo y según lo que me parezca a lo mejor me animo a comprarlo!
#148 A ver pedazo de trolls, que yo no tengo ni idea de Java, ni C, ni Python, soy de sistemas... y estoy montando un ejercito de creeps en 2 días. xD