VIBORAS.bat - Manual de Usuario

El programa VIBORAS.bat es una nueva versión del popular juego "Snake", del que existen muchas versiones. Este programa tiene la particularidad de estar escrito en un archivo Batch de comandos de Windows/Dos que se considera un lenguaje de programación rudimentario y arcaico, por lo que conseguir el desempeño que ofrece esta versión parece sobrepasar las limitaciones propias de estos archivos.

VIBORAS.bat es un juego de video en el que pueden participar hasta cuatro jugadores simultáneamente los cuales controlan una víbora diferente cada una: #1-Amarilla, #2-Verde, #3-Morada y #4-Aqua. Cada víbora se controla con un grupo de teclas que están distribuídas uniformemente en todo el teclado: las teclas de flechas para la víbora #1, las teclas "WASD" para la #2, las teclas "GVBN" para la #3 y las teclas "OKLÑ" para la #4, por lo que las manos de hasta cuatro personas pueden estar presionando estas teclas sin interferencias. Si fuera necesario, esta disposición de teclas se puede cambiar muy facilmente.

Esta característica convierte el original (y aburrido) juego Snake para un sólo usuario en otro muy diferente con hasta tres oponentes y varios puntos que favorecen la competencia, pero incluso el juego mono-usuario se ve beneficiado por las nuevas características que aporta este programa.


Indice

  1. Avance del juego
  2. Básico: Ajustes manuales
  3. ¿Y cómo se juega?
  4. Ganar nuevas habilidades
  5. Apareciendo foods
  6. Interfaces y expresiones
  7. ¡Larga vida a las víboras!

Avance del juego

La presencia de varias víboras en un mismo campo abre nuevas posibilidades en el juego. Por ejemplo, cuando una comida aparece en el campo, la víbora que se encuentre mas cerca la comerá y esto la dará una ventaja en velocidad para llegar primero a la siguiente comida, excepto si ésta aparece mas cerca de otra víbora. Cuando el juego comienza, la víbora que vaya ganando dependerá de la suerte (las posiciones aleatorias en las que aparece cada comida), pero cuando las víboras sean mas largas y rápidas, el jugador que sepa elegir el mejor camino para llegar a la siguiente comida finalmente ganará. Si se introduce un mecanismo discreto que compense a las víboras que vayan perdiendo, el juego puede ser muy divertido.

También hay nuevas relaciones que antes no existían entre las víboras. Si una víbora se atraviesa repentinamente en el trayecto de otra, la otra víbora chocará si el jugador que la controla no está listo para este súbito cambio (como sucede con las motocicletas de la película Tron, la original). Una víbora larga puede encerrar a otra mas pequeña en una trampa de manera que la mas chica no tenga lugar a dónde moverse. Estas situaciones se pueden enriquecer o compensar introduciendo nuevas opciones en el juego. He recurrido a mis propias ideas en los métodos utilizados para implementar estas características, como son la posibilidad de detener el movimiento de la víbora o cambiarlo a reversa, o la introducción de diferentes tipos de comida que proporcionen nuevas habilidades a las víboras.
Top

Básico: Ajustes manuales

Para utilizar este juego simplemente ejecute el archivo del programa VIBORAS.bat; se abrirá una ventana con el fondo negro, llamada "ventana de cmd.exe". La primera vez que se active el programa será conveniente completar unos cuantos ajustes manuales para obtener la mejor experiencia del juego.

Los dos ajustes principales consisten en seleccionar el tamaño del campo de juego (lo que se hace con una línea similar a ésta: set /A "cols=80, lines=36", más detalles después) y seleccionar el tipo de letra (fuente) que se usará en la ventana de cmd.exe. Note que estos dos ajustes están relacionados entre sí y además están limitados por la resolución de la pantalla. Una fuente grande es fácil de ver, pero limita el tamaño del campo de juego. Una fuente pequeña permite un campo de juego mas grande, pero si los caracteres son muy chicos pueden hacer difícil identificar líneas y columnas individuales. El tamaño máximo del campo de juego es 128 columnas por 63 líneas. La ventana no debe tener barras de desplazamiento.

Para seleccionar la fuente, dé click con el botón derecho del ratón en el borde superior de la ventana de cmd.exe y seleccione "Propiedades". En "Fuente" seleccione un tipo de letra de "Fuentes de mapa de bits" y después un "Tamaño"; termine dando "Aceptar". El tipo de letra seleccionado se usará todas las veces que el programa se vuelva a ejecutar, hasta que se cambie otra vez.

Para que las víboras se muevan adecuadamente se debe seleccionar un tamaño de letra cuadrado; por ejemplo: 8x8. El archivo VIBORAS.zip del juego incluye otras dos fuentes cuadradas: "Terminal 12x12.FNT" y "Terminal 16x16.FNT". Para instalarlas simplemente copie estos archivos al folder "C:\Windows\Fonts" (abra el explorador de archivos, en "Equipo" seleccione "Disco local (C:)", después "Windows" y "Fonts") y responda "Sí" a la pregunta: "La fuente 'Terminal' ya está instalada. ¿Desea reemplazarla?". Después de esto, cierre la ventana de cmd.exe y vuelva a ejecutar el programa; los nuevos tamaños de letra 12x12 y 16x16 ya estarán disponibles en "Fuentes de mapa de bits". Si no es así, reinicie la computadora.

Si la tecla colocada a la derecha de la letra "L" (que es la letra "Ñ" en teclados en español) no responde para controlar a la víbora #4, se debe hacer un pequeño ajuste en el programa. Para ello, dé click con el botón derecho del ratón sobre el archivo VIBORAS.bat y seleccione "Editar". En "Edición" seleccione "Buscar", ingrese ":Input" (dos-puntos Input, sin las comillas) y oprima Enter; una línea aparecerá. Debajo de la línea ":Input" hay dos líneas que empiezan con set "NextToL=; simplemente coloque la línea con el valor 192 en último lugar. Cierre la ventana con la    x    "X" roja y responda "Guardar". ¡Listo! ;)
Top

¿Y cómo se juega?

El control básico de la víbora consiste en cambiar su dirección mediante las teclas de flecha a la izquierda y derecha. Este cambio de dirección siempre se hace en relación al movimiento de la víbora (que es uno de los puntos clave que hace a este juego tan interesante).

La forma de jugar consiste en que la víbora coma los diferentes tipos de comida (food) que aparecen en el campo de juego; cada vez que la víbora come una food, aumenta un poco su tamaño y su velocidad. Si la víbora choca contra un obstáculo, como el borde del campo o su propio cuerpo, la víbora "morirá". Después de eso el programa preguntará, en la parte superior de la ventana, si desea jugar otra vez; conteste "Y" o "N".

En el juego Snake original, para un sólo jugador, el objetivo es que la víbora "viva" el mayor tiempo posible aumentando siempre su tamaño y velocidad. En esta versión también se puede jugar contra hasta tres oponentes simultáneos, por lo que la estrategia es diferente e incluye diversas formas en que una víbora puede atacar a otra y las respectivas maniobras de defensa.

El juego se puede poner en pausa con la barra de espacio. Después de eso, para continuar jugando oprima "Y"; para terminar el juego, oprima "N".

También se puede cambiar la velocidad de la víbora mediante las teclas de flecha hacia arriba y abajo como se indica en seguida, lo que genera los siguientes modos de movimiento:

Turbo: El doble de la velocidad Normal (aparece el indicador "Turbo").
Down - Up (esta flecha hacia arriba requiere un Turbo-food, detalles adelante).
Normal: Velocidad actual, sin indicador.
Down - Up  
Slow: La mitad de la velocidad Normal (aparece el indicador "Slow").
Down - Up  
Stop: La víbora se detiene (aparece el indicador "Stop").
Down (esta flecha hacia abajo requiere un Reverse-food, detalles adelante).
Reverse: La víbora se mueve en reversa a velocidad Slow, y continúa así.

Cuando la víbora está en modo Stop, las flechas a la izquierda y derecha mueven la víbora una posición hacia esa dirección. Si una food es comida en los modos Turbo, Slow o Stop, el modo de movimiento automáticamente regresa a Normal.
Top

Ganar nuevas habilidades

Estos son los diferentes tipos de food que permiten a las víboras ganar nuevas habilidades:


Top

Apareciendo foods

Hay varias formas de lograr que las diversas foods aparezan en el campo de juego. Para hacer esto, las foods se dividen en dos clases:

  1. Foods Constantes. Esta clase, compuesta por StdFoods y ResFoods (Standard y Reserved foods), se activa mediante un número de foods que permanece constante; esto significa que cada vez que una food de esta clase es comida, una nueva food del mismo tipo aparecerá. Por ejemplo:
    1. Snakes=1, StdFoods=1 es el juego original.
    2. Snakes=2, StdFoods=1 son dos víboras luchando por sólo una food.
    3. Snakes=2, StdFoods=2 son dos víboras luchando por dos foods, que pueden ser comidas por cualquier víbora.
    4. Snakes=2, ResFoods=1 son dos víboras, cada una con su propia comida. No hay lucha por food.
    5. Snakes=2, StdFoods=1, ResFoods=1 son dos víboras, cada una con una food reservada para ellas, mas una food común por la cual luchar.
    6. Snakes=3, StdFoods=1 son tres víboras que luchan por sólo una food.
    7. Snakes=3, ResFoods=1 son tres víboras, cada una con su propia comida; no hay lucha por food.

    Etcétera: cualquier otra combinación en el número de víboras, Standard-foods y Reserved-foods funciona de la misma forma.

  2. Foods Variables. Esta clase está formada por el resto de foods las cuales aparecen en la pantalla a intervalos variables de tiempo (excepto StdBoost y ResBoost que son opciones de StdFoods y ResFoods, respectivamente). Estos intervalos de tiempo se especifican basándose en otras condiciones, las cuales se definen mediante expresiones aritméticas llamadas food expressions. Estas expresiones se deben colocar en un archivo de especificación del juego, que es un archivo de texto creado con el editor Notepad de Windows. El archivo VIBORAS.zip incluye varios archivos .txt de ejemplo con expresiones diseñadas para activar diversas opciones de juego. Para activar las expresiones de algún archivo, arrástrelo y suéltelo sobre el programa VIBORAS.bat.

    Si bien el uso avanzado de esta facilidad requiere de cierto dominio en matemáticas, se pueden aprovechar muchas de sus características basándose en ejemplos sin necesidad de profundizar en el tema. Se sugiere tomar algún archivo .txt de especificación incluído y cambiar el valor de alguna variable, guardar el archivo y repetir el juego hasta entender el funcionamiento de dicha variable.

    Lo que sigue es una descripción mínima de esta facilidad, la suficiente para comprenderla. Para una descripción mas detallada, consulte la documentación en inglés.

    La expresión aritmética puede usar una serie de variables de interface diseñadas para ello. Por ejemplo, la variable seconds permite generar foods basadas en el tiempo de juego transcurrido. La variable ^!random^! (así debe escribirse, por cuestiones técnicas) genera un número aleatorio. El número que entregan estas expresiones funciona como un indicador para una determinada food: un valor mayor que cero implicará crear la food; si es menor o igual a cero, no se creará. En algunos casos el valor de la expresión es el valor que tendrá la food, como es el caso de Lapse.

    Normalmente la food creada es de color blanco y cualquier víbora la puede comer, pero si además se asigna un valor mayor que cero a la variable justFor, entonces la food creada estará reservada solamente para la víbora indicada por esta variable mediante un valor entre 1 y 4. Si el valor es mayor a 4, entonces se creará una food reservada para cada víbora en forma similar a la variable ResFoods antes descrita (excepto en el caso de Lapse, de la que solamente puede haber una food en el campo). Si una víbora intenta comer una food que no está reservada para ella (que no sea blanca ni de su mismo color), la víbora chocará contra la food como si fuera un obstáculo.

    Normalmente la food creada permanecerá en el campo hasta que una víbora la coma, pero si además se asigna un valor mayor que cero a la variable timeOut en la food-expression, entonces la food solamente durará ese número de segundos en el campo y después se borrará.


Top

Interfaces y expresiones

Como se dijo antes, en este documento no se explican los pasos para crear las expresiones; solamente se muestran ejemplos de su uso. Comencemos.

StdBoost es una opción de Standard-foods. Cuando una Standard-food es creada, puede ser creada como una Boost-food, es decir, con un valor mayor a 1 dado por esta expresión.

  1. set "StdBoost=0" Es lo mismo que no definir nada: las Standard-foods siempre se crearán con valor 1.
  2. set "StdBoost=6" Todas las Standard-foods se crearán con valor 6.
  3. set "StdBoost=^!random^!%10" Las Standard-foods se crearán con un valor aleatorio entre 1 y 9 (el residuo de dividir el número aleatorio entre 10).
  4. set "StdBoost=(a1=^!random^!%10, cond=(a1-5>>31)+1, cond*a1)" La mitad de las Standard-foods se crearán con valor 1; la otra mitad con un valor aleatorio entre 5 and 9. Esta misma expresión se puede escribir de esta forma, mas corta: set "StdBoost=(a1=^!random^!%10,((a1-5>>31)+1)*a1)".
  5. set "StdBoost=seconds/60" Las Standard-foods se crearán con un valor que irá aumentando cada minuto de juego.

Todo valor Boost automáticamente se limitará a 9.


IMPORTANTE: Las expresiones de StdBoost y ResBoost se evalúan solamente cuando se necesitan (cuando se come una Standard o Reserved food), pero todas las demás food-expressions se evalúan una vez en cada ciclo del programa cuando está en ejecución, es decir, muchas veces por segundo. Esto implica que estas expresiones deben incluír algún tipo de control de repetición para evitar que se creen muchas foods. Esto se hace mediante una variable persistente que conservará su valor en cada ciclo del programa, por lo que tendremos que inicializarla al principio (lo que se hace con la variable init).

Por ejemplo, para crear una Turbo-food cada 3 minutos de juego:

Después de que una nueva food es creada y el valor de n1 es cambiado a cero, este valor debe permanecer en cero hasta que el segundo de tiempo actual cambie, es decir, hasta que el tiempo deje de ser múltiplo de 3 minutos; esto se puede escribir así: n1=n1-c2+^^^!n1*^^^!c1. Esta fórmula mantiene el valor de n1 en 1 durante 3 minutos. Entonces, la primera vez que c2 cambia a 1, la fórmula cambia el valor de n1 a cero. Después de eso, los valores de c2 y de ^^^!n1*^^^!c1 serán ambos cero todas las veces que esta fórmula se repita en el mismo segundo. Cuando el segundo cambie, c1 cambiará a cero y ^^^!n1*^^^!c1 dará un 1. En ese momento, la fórmula cambiará n1 a 1 otra vez.

Las expresiones finales para hacer esto se escriben así:

set "init=n1=1"
set "Turbo=( c1=^^^!(seconds%180), c2=n1&c1, n1+=^^^!n1*^^^!c1-c2, c2 )"


Ahora supongamos que una Turbo-food debe ser creada solamente para la víbora mas pequeña cuando la diferencia de tamaño entre las víboras mas larga y mas corta sea mayor a 10. Después de eso, la creación de nuevas foods debe ser desactivada hasta que esta diferencia de tamaño sea menor a 8.

En este caso c2 y c4 pueden ser ambas 0 o sólo una de ellas puede ser 1; ambas no pueden ser 1 al mismo tiempo. La fórmula para activar/desactivar n1 está dada por n1=n1-c2+c4; es decir:

Recuerde que una food se reserva para la víbora indicada por la variable justFor. Las expresiones para esta Turbo-food reservada se escriben así:

set "init=n1=1"
set "Turbo=( a1=maxSize-minSize, c1=(a1-10>>31)+1, c2=n1&c1, c3=^^^!((a1-8>>31)+1), c4=^^^!n1&c3, n1+=c4-c2, justFor=minSnake, c2 )"

Top

¡Larga vida a las víboras!

Cuando una víbora choca, el jugador correspondiente queda fuera del juego. Como tarde o temprano toda víbora chocará, la manera de aumentar la permanencia en el juego es alargando la vida de las víboras después de chocar. La forma de hacerlo es mediante la reproducción de víboras, es decir, la posibilidad de que una víbora ponga un huevo y de éste salga una víbora hija cuando la madre choque. Este es el procedimiento para hacerlo.

  1. El proceso de reproducción requiere que la víbora tenga un tamaño mayor a eggSize+5.
  2. Cuando el jugador oprima la tecla colocada a la derecha de la flecha hacia arriba (que es PageUp en los teclados estándar) la víbora pondrá un huevo, su cuerpo se reducirá en eggSize segmentos y su velocidad se reducirá a la mitad. El huevo aparecerá como un sólo segmento que indica la dirección que tendrá la víbora hija al nacer.
  3. La víbora hija saldrá del huevo cuando su madre muera, es decir, inmediatamente después que la madre choque o hasta que su cuerpo sea removido del campo. Este punto es controlado por la variable exit.
  4. La víbora hija tendrá la mitad de la velocidad y del tamaño del segmento utilizado para crear el huevo, y la misma dirección.
  5. Una víbora solamente puede poner un huevo.
  6. Una víbora puede comer su propio huevo y así recuperar la mitad del tamaño del segmento utilizado para crearlo.
  7. Si otra víbora intenta comer un huevo que no le pertenece, chocará contra él.

Para activar la reproducción de víboras se debe dar un valor mayor que cero a ambas variables eggSize y exit en un archivo de especificación. El valor de esta última variable controla el momento en que un juego termina y lo que debe hacerse con los cuerpos de las víboras que chocan.

exit= El juego termina cuando: Las víboras que chocan:
0 La primer víbora choca.  
1 La última víbora choca. Se retiran del campo.
2 La última víbora choca. Se conserva la última víbora de cada color.
3 La última víbora choca. Se conservan todas en el campo.

Un valor de eggSize mayor que cero permite que las víboras pongan huevos, pero si exit vale cero el juego terminará cuando la primer víbora choque aunque haya huevos en el campo.

Los cuerpos de las víboras muertas que queden en el campo serán obstáculos para todas las demás víboras. Si una víbora choca contra sí misma, sólo se borrará desde la cola hasta el punto del choque, lo que dejará el resto de su cuerpo encerrando un área del campo. Si exit=3, esto se puede utilizar como una estrategia de juego; por ejemplo, para encerrar permanentemente una comida o un huevo de otra víbora.
Top


Avance Básico:
Ajustes
¿Y cómo se juega? Ganar habilidades Apareciendo foods Interfaces.
Expresiones.
¡Larga vida!