Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Todos los Videojuegos son Wargames parte 1

–¿Quiénes son los verdaderos ancestros de los videojuegos?–

Cuenta la leyenda que el escritor de ciencia ficción H.G. Wells conocido mundialmente por La Guerra de los Mundos, obra en que la que la tierra es invadida por extraterrestres tenía un curioso pasatiempo: Jugó con soldados de juguete toda su vida. Uno podría pensar que le gustaba coleccionarlos hasta que lo visitaba sin avisar y se lo encontraba tendido en el piso jugando con sus miniaturas y maquetas de pueblos completos. Era tanta su afición que incluso llegó a escribir un manual muy completo sobre como jugar. Dicho manual escrito hace alrededor de un siglo fue conocido como Little Wars y contiene las reglas para organizar encuentros entre varios jugadores para organizar batallas competitivas y decidir quién es el ganador. Pero de ese manual les hablar\e más adelante en esta misma entrada.


Al mismo tiempo, o tal vez un poco antes. En la europa previa a la Primera Guerra Mundial soldados auténticos jugaban un juego con fichas, figuras a escala y mapas de territorios reales divididos en varios cuadrados y zonas delimitadas por lineas. No recuerdo el nombre exacto de este juego pero se dice que empezó como una manera de preparar a los oficiales y enseñarles estrategias sobre como mover sus fuerzas de manera eficiente y planificar mejor sus misiones. De hecho si somos estrictos y nos vamos todavía más atrás encontraríamos que casi todos los juegos de mesa jugados con fichas representan una batalla de una forma u otra. Pero me abstendré de hablar de esos juegos por hoy.

El asunto es que esos juegos de guerra que se jugaban con modelos a escala en tableros que representaban campos de batalla y al que se le aplicaba un conjunto de reglas tiene mucho que ver con lo que son hoy los videojuegos. ¿Pero qué tienen que ver unas figuritas tiesas de hace cien años con los modernos videojuegos 3D para PC Master Race y consolas de última generación que se vuelven obsoletas al año de haber salido? Mucho en realidad. Pero para eso pasemos a lo que yo llamo la pregunta fundamental de la programación de videojuegos.

De todas las cosas que me han preguntado sobre programación la que tal vez sea la mejor me la hizo un estudiante de ingeniería en computación y era: ¿Como es posible que el lenguaje ensamblador que lo único que hace son matemáticas básicas y copiar números de un lado a otro pueda usarse para hacer videojuegos?

La respuesta obvia sería que todo lo que corre en una computadora es código que procesa ceros y unos pero como eso no le dice nada a quien no sabe de programación y muy probablemente los primeros jugadores de juegos de guerra no sabian mucho del tema. La respuesta que yo les daría a esos jugadores si estuviera sentado en su mesa de juego sería: La computadora puede correr las reglas del juego mucho más rápido de lo que ustedes pueden mover las figuras por el tablero.

Debería comentar que existe la teoría de que el término “Gamer” que hoy los aficionados a los videojuegos usan para describirse a si mismos deriva del término “Wargamer” que era como se le conocía a los que jugaban juegos de guerra con figuras a escala y reglas definidas. Por lo que no es descabellado pensar que los videojuegos actuales descienden de esos antiguos juegos de guerra jugados con miniaturas.

Pero veamos un poco como se juega uno de estos juegos. Si bien leí el manual de juego Little Wars este es demasiado extenso para describirlo en detalle así que intentaré describir lo básico. En la versión original las figuras eran de soldados a pie, caballería y cañones. El campo de juego era un espacio grande y plano que podía ser el suelo de una recámara o un pedazo de jardín. Para darle ambiente en ese espacio había figuras a escala de casas, fortalezas o cualquier otra edificación dependiendo de donde se suponía que se libraba la batalla. Antes de comenzar ambos jugadores posicionaban a su ejército de su lado del campo y se preparaban para la señal de inicio del combate.

A partir del inicio de la batalla cada jugador tenía un espacio de dos minutos cronometro en mano para mover sus unidades por el terreno. Para mover las unidades había dos varas, una larga y una corta. Los soldados a pie podian moverse de su posición tan lejos como la vara corta o menos. La caballería usaba la vara larga que era dos veces el largo de la corta para lo mismo. Los cañones no se podian mover por si solos ni dispararse a menos que cuatro soldados a pie estuvieran en la misma posición para poder operarlo. Cuando dos o más soldados de un mismo jugador estaban lo bastante cerca se consideraba que eran una unidad y la cantidad de personal que tuviera esa unidad se usaba para determinar quién ganaba en los enfrentamientos. Pues cuando dos soldados enemigos se encontraban uno frente a otro y no había nada con qué protegerse ambos morian. Lo mismo ocurría con unidades grandes si ambas tenian la misma cantidad de hombres. Si una unidad grande se enfrentaba con otra más pequeña la pequeña era aniquilada y los sobrevivientes de la unidad ganadora se calculaban restando los números de la unidad caida. Por ejemplo si una unidad de 5 se enfrentaba a una de 3 ganaba la de 5 pero únicamente dos eran los que sobrevivian.

Como esto no le daba suficiente emoción al juego también era posible que los soldados pudieran tomar posiciones seguras para defenderse ya sea dentro de una casa, una torre o detrás de algún obstáculo. De este modo si eran atacados por una unidad inferior en número podian defenderse sin sufrir bajas. Sin embargo si eran rodeados por una unidad mucho mayor en número (por lo menos dos por cada uno de ellos) tenian la opción de salir y ser aniquilados o ser tomados como prisioneros. Cuando un soldado era hecho prisionero se le quitaba el arma y tenía que ser escoltado por dos soldados del ejército que lo capturó hasta el lado de la mesa del jugador con las mismas reglas de movimiento de cualquier otra unidad. Si en el camino uno de los dos escoltas moría el prisionero podía escapar pero como estaba desarmado cualquier enemigo que lo alcanzara lo podía matar instantaneamente y sin riesgo, pero si lograba regresar con vida a la base que era el lado de la mesa de su jugador recibía otra arma y podía regresar a la lucha.

Pero en la batalla también había cañones. Un cañon por si solo no hacía nada pero si cuatro soldados de un mismo ejército llegaban a su posición podian apuntarlo, dispararlo o moverlo aunque con algunas excepciones como no poder cruzar con el cañon terrenos difíciles como los rios. El libro no explicaba la mecánica de disparo del cañon pero algunos dicen que el cañon disparaba pequeñas pelotas con un resorte y si esa pelota golpeaba a un soldado lo eliminaba además de que podía ser usado para destruir estructuras que pudieran ser usadas como refugio para los tiradores. También era posible capturar un cañon del enemigo si un jugador lograba que cuatro de sus hombres lo alcanzaran.

Ganaba el jugador que pudiera vencer o capturar a todas las unidades de los otros jugadores pero existian otras modalidades de juego como capturar una bandera de otro jugador y llevarla al terreno propio, apoderarse de un poblado o instalación o escoltar a un personaje importante por terreno hostil. Si les interesa este juego pueden encontrar el manual de Little Wars en internet pues por su antiguedad ya está libre de derechos de autor.

La computadora no ve el juego como los jugadores lo ven

¿Y qué tiene esto que ver con programar? Primero que nada elegí Little Wars porque es un wargame lo bastante sencillo para explicarlo en términos de programación. Imaginemos que estamos jugando una partida con soldados de juguete y maquetas físicas y que tenemos a un lado a una computadora para apoyarnos en el juego. La computadora ya está programada con las medidas del campo, los lugares donde están los obstáculos y la posición de cada uno de los soldados de plástico. Y aquí es donde comienza la programación. Pues las medidas del campo son tres números que indican ancho, alto y profundidad. Digamos que estos valores están en cualquier unidad física como pulgadas o centímetros según su gusto. Para ubicar a cada soldado en el campo de batalla la computadora utiliza coordenadas espaciales (x,y,z). Estos valores indican cuantos pasos hay que dar del punto origen del campo hasta la posición donde se encuentra. El origen del campo puede estar en el centro para hacerlo facil de programar o en una esquina para hacerlo más entendible a los programadores principiantes. La posición de los obstáculos, refugios o terrenos difíciles se almacena en la computadora de la misma manera.


¿Y como sabe la computadora el movimiento de las figuras? En realidad no lo sabe. Alguien que no esté jugando tiene que estar escribiendo en un teclado esos cambios. Para esto podrian dibujar una cuadrícula en la mesa de juego para obtener las coordenadas x,y,z de un vistazo en lugar de usar instrumentos de geometría como reglas y escuadras. Y en cuanto a la medición de distancias la computadora es perfectamente capaz de hacerlo. Basta recordar al buen pitágoras y su teorema usado para medir distancias. No lo voy a explicar porque quiero pensar que si saben programar ya lo conocen o pueden buscarlo y entenderlo sin problemas. La computadora tiene una rutina que dados dos puntos en coordenadas x,y,z nos dice la distancia que hay entre ellos y así puede saber qué movimientos son válidos. Para esto los datos de cada figura deben de contar también con su valor de movimiento.

Con los datos que tenemos hasta ahora la computadora puede contar los dos minutos del turno para cada jugador y en ese turno comparar a qué distancia se encuentran las unidades unas de otras o si están en alguna estructura que las proteja sin necesidad de que se lo tengamos qué decir. La propia máquina detectará si un grupo de soldados están lo bastante cerca entre si para formar una unidad de combate, si un cañon es operable por un jugador al tener cuatro hombres a menos de cierta distancia. Si dos grupos están lo bastante cerca para enfrentarse, quién ganó y quienes sobrevivieron, cosa que es una simple resta. Para decidir si un soldado está en un lugar desde donde puede protegerse basta con tomar sus coordenadas x,y,z y ver si está a menos de una pulgada de distancia de uno de esos refugios. Suponiendo que las figuras tengan una pulgada de superficie. A los datos de cada soldado además de sus coordenadas y valor de movimiento agregamos una bandera que indique si está a cubierto o desprotegido. Cero será desprotegido y Uno a cubierto. Con esta mejora ya somos capaces de definir lo que pasa cuando los ejércitos se encuentran. Si un grupo con la bandera de cubierto está a uno son rodeados por otro grupo que sea el doble de ellos en número por lo menos y esto es una multiplicación por dos (o un shift binario) y una resta. Hacemos una rutina que se active cuando los atacantes estén a menos de una pulgada de un refugio. Multiplicamos por dos el número de defensores y lo restamos al número de atacantes. Si el resultado es cero o un valor negativo significa que los defensores pudieron defenderse y si el valor es positivo todos son capturados o se le da a los defensores la opción de salir a pelear y ser vencidos.

La mecánica de los prisioneros se programa con otras dos banderas. Para los principiantes les recuerdo que una bandera es una variable que puede valer cero o uno (falso o verdadero) y que puede reducirse a un simple bit. Una de estas banderas es la de Capturado. Si vale uno el soldado está capturado y no puede moverse por si mismo y la otra es Indefenso. Si indifenso es verdadero el soldado no puede defenderse si lo alcanza el enemigo y si dos enemigos armados lo alcanzan tienen la opción de capturarlo o matarlo. La condición en la que un soldado es capturado o queda libre también la puede detectar la computadora al comparar las distancias entre el soldado indefenso y los enemigos. Si encuentra al menos dos a una pulgada o menos de distancia. Del mismo modo si detecta uno o ningún enemigo a menos de una pulgada del soldado indefenso la bandera Capturado se pone a cero y recobra el movimiento aunque no pueda pelear y pueda emprender la huida.

La mecánica del cañon es más complicada. Pues si es un cañon que dispara pelotas de verdad no quedará otra que informarle a la computadora que unidades fueron alcanzadas por el cañonazo y si alguna estructura fue destruida. Y aunque la mecánica del cañon que lanza pelotas de verdad hace la batalla menos predecible también se puede programar una mecánica igual de impredecible pero eso lo veremos en la siguiente entrada. Los datos del cañon son por supuesto sus coordenadas x,y,z que nos dicen donde está, una bandera que indica si hay personal para dispararlo y una variable que indique cual de los jugadores lo tiene bajo su control.

En resumen, la computadora cuenta los dos minutos de cada turno y durante cada uno de esos turnos compara distancias y detecta todas las condiciones ya mencionadas y también verifica si la condición de victoria o derrota acordada se cumplió y todo lo hace leyendo variables, comparando números y haciendo sumas, comparaciones y alguna raiz cuadrada con aquello de lo de pitágoras. Pero cabe aclarar que hasta ahora hemos estado jugando con soldados de juguete físicos y lo único que la pantalla de la computadora nos muestra son mensajes de texto sobre lo que sucede en la batalla tales como “Jugador A captura un cañon” o “Los defensores B ocultos en la granja han sido capturados por el ejército de A” o cualquier otra cosa que las reglas nos digan que va a pasar según los datos de lo ocurrido en el juego. Hasta ahora lo que hemos programado poco tiene que ver con un videojuego de estrategia actual pero ya tiene la lógica y para la computadora ya es jugable. ¿Y qué le faltaría? Pues por supuesto una manera de representar en pantalla la acción y una manera de recibir datos por parte del usuario de una manera más natural como sería por las órdenes que este les diera a los soldados con el mouse y el teclado pero el como hacer eso no es el tema de esta serie.

En la siguiente entrada veremos como programar mecánicas que hagan la batalla más emocionante tales como los hit points, diferentes tipos de armas y ataques, disparos que no siempre den en el blanco, personajes con diferentes fortalezas y debilidades, explosiones y tal vez hasta magia. Al final y sin hacer mucho spoiler veremos que todo lo aprendido en los viejos wargames no solo sirve para programar juegos de estrategia por turnos sino todo tipo de videojuegos tanto por turnos como en tiempo real.

Anuncios

junio 17, 2016 - Posted by | Uncategorized

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: