ÍNDICE
- Introducción
- ¿Qué es CoreWars?
- Estructura del Core
- Guía de introducción a Redcode (Movido a #2)
- 3.1 Introducción básica
- 3.2 Lista básica de opcodes
- 3.3 Mi primer contacto con un warrior: el Imp
- 3.4 Modos de direccionamiento
- 3.5 Avanzando un poco: el Dwarf
- 3.6 Modificadores de instrucción
- Estrategias básicas
- MARSes e IDEs
- KOTH (Rey de la pista)
Z. Enlaces[/b]
0. Introducción
Buenas a todos. Con esta guía sólo pretendo compartir en castellano y como mejor pueda los pocos conocimientos que he ido adquiriendo poco a poco sobre CoreWar, para ahorrar a la gente el trabajo que yo he hecho, y a ver si con suerte alguien se anima y podemos pasarlo bien Tampoco pretendo hacer la guía perfecta, ni una guía completa. Sólo quiero una pequeña introducción, para animar a la gente a que investigue por su cuenta.
Aviso, todavía sé muy poco sobre corewars, prácticamente acabo de empezar, pero me ha parecido un juego increíble, y espero que a vosotros también. Por cierto, los avisos de erratas o cosas que no se entiendan se agradecerán enormemente.
1. ¿Qué es CoreWars?
CoreWar o CoreWars es un divertido juego de programación inventado en 1984 por D.G. Jones y A.K. Dewdney, en el que dos o más luchadores programados por los jugadores pelean por el control de un ordenador virtual (Memory Array Redcode Simulator, MARS) ejecutando una instrucción tras otra alternativamente. El objetivo del juego es hacer que todos los procesos de los programas enemigos se cierren al ejecutar una instrucción ilegal, dejando a tu programa como único habitante del MARS. Los luchadores se programan en RedCode, un dialecto del lenguaje ensamblador con algunas peculiaridades que explicaré más adelante.
Partida de CoreWar a través del interfaz gráfico de pMARS
2. Estructura del Core
Para entender la estructura del core conviene entender que no es más que una "simulación" de un ordenador cualquiera. De hecho se llama core por reminiscencia de un antiguo término para llamar a la memoria de un ordenador.
El core no es más que un array lineal de memoria (Normalmente con un tamaño de 8000 instrucciones aunque puede variar) que a su vez se componen de un opcode (La instrucción en sí) y dos campos numéricos, cada uno con su propio modo de direccionamiento.
Aunque antes he dicho que la memoria en el core es lineal, en realidad es circular. Cuando acaba, vuelve al principio, por lo que en un core de tamaño 8000, la instrucción 8001 es en realidad la instrucción 1.
Otra de las características más importantes del core es que los programas que se ejecutan en él no saben la dirección absoluta en la que están, ni pueden acceder a ninguna dirección de forma absoluta. Toda referencia a otras direcciones de memoria se hace de forma relativa a la instrucción que se está ejecutando, siendo 1 la siguiente instrucción, 0 la intrucción que se está ejecutando en este momento y -1 la instrucción anterior (Y por supuesto, 5 es la instrucción 5 pasos más adelante.)
3. Guía de introducción a Redcode
¡Sección movida a #2!
4. Estrategias básicas
En esta sección voy a tratar de dar una pequeña explicación de algunas estrategias básicas que siguen los luchadores. Al ser sólo una descripción breve del comportamiento no importa que no se sepa todavía usar Redcode, es sólo para que se vea el potencial de CoreWar. La mayoría de programas usan una o dos de estas estrategias en combinación, ¡O incluso más! Algunos incluso se modifican a sí mismos para pasar de usar una estrategia a otra. Obviamente los programas no están limitados a estas estrategias. Incluso de vez en cuando aparece una estrategia nueva completamente diferente que revoluciona todo.
Las tres estrategias más comunes (Bomber, replicator y scanner) también se conocen como "Piedra, papel y tijeras", porque cuando luchan entre sí normalmente actúan como en el juego: Papel gana a piedra, tijeras a papel, piedra a tijeras.
* Un replicator (papel)Silk replicators usan la ejecución paralela para copiarse enteros con tan sólo una instrucción, empezando a ejecutarse al mismo tiempo.
* El bomber (piedra)scanners. Dwarf (Uno de los ejemplos de #2) es un bomber.
* Un scanner (tijeras)replicators. En lugar de atacar a ciegas intenta encontrar a su enemigo antes de lanzar el ataque hacia su objetivo. Esto lo hace especialmente bueno contra enemigos difíciles de matar, como los replicators, pero también lo hace muy vulnerable ante distracciones. Suelen ser más complejos, y por tanto de mayor tamaño y más frágiles que otros tipos de warriors. Normalmente acaban el juego con bombas que ralentizan al enemigo, creando procesos que sólo crean otros procesos de nuevo, ralentizando los procesos útiles. Una vez que el enemigo es tan lento que deja de ser útil, se procede a bombardear con instrucciones ilegales para matarlo.
Aparte de estas tres distinciones básicas podemos encontrar otras estrategias menos comunes, o que se usan de apoyo para las tres principales:
* Un core clear es un programa que de forma secuencial sobreescribe cada instrucción del core, incluso a veces a sí mismo. No es muy común encontrar core clears puros, pero sí como estrategia para acabar el juego en muchos bombers y scanners.
* El bomb-dodger (esquiva-bombas)bombers que consiste en escanear el core hasta encontrar una bomba que haya puesto el programa enemigo. Entonces el bomb-dodger se copia a sí mismo (O parte de su código) en esa dirección, asumiendo que el bomber no va a volver a atacar la misma posición en bastantes ciclos.
5. MARSes e IDEs
En mi corta experiencia con CoreWar me he enontrado con un par de MARSes interesantes. Para un montón de sistemas operativos, se encuentra pMARS, que tiene incluso una versión que tira de SDL para mostrar el core gráficamente. Es el más utilizado. Para Windows, CoreWin es una buena opción. Un buen MARS y bastante fácil de utilizar.
En cuanto a IDEs no puedo recomendar mucho. Para Windows he probado nMars, que me encanta para ver gráficamente mis programas, y A.R.E.S., algo más complejo pero con muchas más facilidades a la hora de debuggear. Para otros SOs, lo siento, no puedo ayudar de momento
Algunos de estos MARSes utilizan una extensión del Redcode semi-estándar en la que se interpretan ciertos comentarios, como por ejemplo ;name <Nombre del programa> o ;author <Nombre del programador> en la cabecera del programa para sacar información extra. ;redcode-94 al principio del programa le indica al MARS que debe utilizar la extensión ICWS-94.
Un programa típico que recibiría un MARS puede parecerse a lo siguiente:
;redcode-94
;name Imp
;author A.K. Dewdney
;strategy The first imp.
imp: MOV imp, imp+1
END imp
Algunos torneos o MARSes interpretan la linea ;strategy para explicar la estrategia que usa el programa.
6. KOTH (Rey de la pista)
¿Qué sería de CoreWars sin un sistema de torneos online? Efectivamente, hay varios torneos KOTH (King of the Hill) gratuítos en internet que operan por e-mail tras un pequeño registro. Incluso hay hills para principiantes que borran los programas clasificados cada cierto tiempo de vida.
Algunos de los más populares son KOTH y KOTH@SAL, ([email protected] es la dirección a la que hay que enviar el código.)
Para elegir la hill en la que quieres que compita tu programa, la primera línea de este no debe ser ;redcode sino ;redcode-<ID_DE_LA_HILL>. Por ejemplo, para entrar en la Beginners' Hill de KOTH@SAL tiene que comenzar por ;redcode-94b. Lógicamente también parsean los comentarios de nombre, autor, estrategia, etc. El resto de comentarios que parsean se encuentran explicados en las webs de cada KOTH.
Z. Enlaces
Casi todas las guías que puedes encontrar están en esta recopilación de tutoriales de corewar. También es muy recomendable leer esta estupenda guía para principantes, aunque está en inglés, de donde he sacado bastantes de los ejemplos de esta mini-guía.
http://corewar.co.uk y http://www.corewar.info/ también son buenas páginas de consulta.