RESUMEN En esta documentacion se muestra el desarrollo de un
videojuego de carros utilizando scripts de Shell bajo el
Sistema operativo LINUX.. Se muestra también el periodo
de desarrollo, los objetivos del mismo así como la razón de
ser del proyecto y las herramientas nuevas aprendidas en el
transcurso de elaboración del videojuego.
ABSTRACT This paper shows the development of a car video game
using Shell scripts under the LINUX [1] operating system.
Also shown the period of development, its objectives and the
justification of the project and the new tools learned in the
course of developing the game.
Índice de Términos— Atari, Bash, comandos, CLI
Juegos de consola, Linux, Scripts, Shell.
I. INTRODUCCIÓN
El Presente trabajo será presentado como proyecto
final de la cátedra FUNDAMENTOS DE LINUX
cuya propósito fue el utilizar los conocimientos
adquiridos en el transcurso del dictado de la
cátedra para desarrollar un script sea este
orientado a la prestación de servicios en un
ambiente LINUX o el desarrollo de un juego para
el ocio en la consola del SO (Sistema Operativo)
[2] antes mencionado. La propuesta del proyecto
fue presentada al iniciar la cátedra con el nombre
de “Desarrollo de un juego de carros” siendo
aceptada días después de la propuesta por el Ing.
Ignacio Marín (docente de la cátedra).
Se presenta el plan de trabajo utilizado para el
desarrollo del script así como la estrategia de
programación implementada en el mismo.
II. PLAN DE DESARROLLO
A. Fase de Propuesta
En esta fase del proyecto se comencé a analizar
las dos categorías del proyecto: servicios u ocio,
analizando el pro y los contras de elegir cada una
de las categorías, lo que por un análisis costo
beneficio se decidió por el desarrollo de un juego
para el ocio en la consola. Una vez elegida la
categoría comenzó la incógnita ¿qué juego? así se
comenzaron a barajar diversas propuestas de
juegos posibles en la consola de Linux [3], tales
como 21, Tetris, Arkadian, pero se llego
revisando en internet se concluyo que estos juegos
ya están implementados. Luego haciendo memoria
de esos juegos inmortales producidos por ATARI
[4] en su época dorada, llegaban recuerdos del
videojuego que mas me divertido en la infancia, el
famoso carito que evitaba chocar con otros carros,
no recordando el nombre del juego lo bautice con
GAMEKAR, y fue así como fue propuesto el
proyecto con las siguientes especificaciones:
1) Primera condición: El carro que avanza en
una carretera en la que en puntos determinados
hay obstáculos que este debe evitar.
2) Segunda condición: El carro se puede mover
solo en dos direcciones para evitar los obstáculos,
a la izquierda o a la derecha.
3) Tercera condición: El juego termina cuando
el carro choca con alguno de los obstáculos,
siendo el puntaje en función del tiempo que
permaneció sin chocarse.
4) Cuarta condición: El juego debe mostrar un
ranking de los 15 puntajes más altos almacenados
en cada juego con sus respectivos nombres.
GAMEKART UN JUEGO DE CARROS
UTILIZANDO SHELL SCRIPTS DE LINUX
Steven Caicedo Mejillones
Escuela Superior Politécnica de Litoral
Facultad de Ingeniería en Electricidad y Computación
Cátedra: Fundamentos de Linux
B. Fase de Planificación
En esta fase se comenzó a hacer el análisis de
las condiciones del proyecto así como las posibles
soluciones y técnicas de programación que
usaríamos en el desarrollo. Así como planteamos
en dividir el programa en las diversas interfaces
que mostraremos a los jugadores, de esta forma las
interfaces quedaron de la siguiente manera:
1) Introducción: Una interfaz animada que
muestre el nombre del programa y le dé un toque
de elegancia al juego.
2) Menú: interfaz que muestra las diferentes
opciones del juego, sea esta: juego nuevo, ranking,
información del desarrollador o salir del
programa.
3) Juego nuevo: Interfaz que muestra el juego
propiamente dicho, es en esta interfaz donde se
pondrá mas énfasis en el desarrollo.
4) Ranking: Interfaz que muestra un listado de
los 15 mejores puntajes, cada puntaje con sus
respectivos nombres.
5) Acerca: interfaz que muestra información
acerca del desarrollador del juego
Haciendo un diagrama de flujo del programa con
respecto a las interfaces antes mencionada queda
de la siguiente manera
FIG. I
DIAGRAMA DE FLUJO DEL PROGRAMA
Sel es la variable usada en el Menú para hacer las veces de
Seleccionador.
C. Fase de Desarrollo e Implementación
Esta es la fase donde se puso manos a la obra, en
nuestro caso diseñar cada una de las interfaces
codificando y dándoles funcionalidad a cada una
de ellas.
1) Introducción: Esta parte de la interfaz es solo
un grupo de secuencias de salidas de pantallas, no
tiene mayor funcionalidad, solo da una
presentación agradable del juego. El efecto se
logro con una combinación de: salidas de
pantallas, el comando para limpiar la pantalla que
en la consola de Linux es clear [5], además de una
espera de 1 segundo que da la apariencia de hilos
de ejecución usando el comando sleep [6].
FIG. II
PANTALLAZOS DE LA INTRODUCCIÓN DEL PROGRAMA
El tiempo entre un pantallazo y otro es de 1 segundo
2) Menú: Esta parte del programa está dominada
por un lazo infinito de ejecución que
constantemente pregunta por teclado la opción a
escoger sea esta: nuevo juego, ranking, acerca, o
salir del programa. El proceso de selección esta
programado por la instrucción case [7] de los
sistemas Linux. La opción salir está definida por
la instrucción exit 1 [8]. A continuación se
muestra un pantallazo del menú de la aplicación:
FIG. III
PANTALLAZO DEL MENÚ
3) Ranking: Esta parte del programa lee un
archivo que almacena los puntajes de los
jugadores así como el nombre de los mismos, este
archivo es previamente modificado cada vez que
un usuario juega, esto se explicara en un literal
posterior.
FIG. IV
PANTALLAZO DEL RANKING
Lo interesante de este bloque es que imprime
solo los 15 mejores puntajes en orden descendente
usando las instrucciones sort [9] y sed [10], es por
esto que me presto a mostrar este bello código:
for n in {1..15}
do
echo "${n})$(sort -r rank.txt | sed -n ${n},${n}p) "
done
5) Acerca: Esta parte del programa es la más
sencilla, solo muestra información del
desarrollador. A continuación un pantallazo de la
interfaz: FIG. V
PANTALLAZO DE ACERCA
4) Juego: Esta es la parte del proyecto más
compleja ya que es la que implementa el juego
propiamente dicho, es así que esta interfaz o
bloque la hemos subdividido en bloques: FIG. VI
DIAGRAMA DE FLUJO DE JUEGO
1) Detección del teclado: Esta es una parte
importante del script ya que hace la captura del
teclado, y fue quizá la parte más complicada del
proyecto ya que para capturar el teclado usamos el
comando read [11], el cual necesita siempre un enter
después de haber escrito lo que queremos enviarle al
programa. Esto sería molestoso, ya que por ejemplo
cada vez que quisiéramos movernos a la derecha luego
de presionar la tecla d tendríamos que presionar luego un enter. Debido a este problema se decidió darle un
tiempo determinado de lectura al teclado en cada
interacción, para esto podíamos utilizar la bandera –t del comando read que da un tiempo de lectura al
teclado, pero esta opción no funciona correctamente
en algunas versiones de intérpretes de comandos en
Linux [12]. En el caso de la versión de mi intérprete no funcionaba correctamente esta opción, así que decidí
buscar alternativas en internet, y pensé “alguien en
algún lugar alguna ocasión tuvo q haber necesitado algo parecido”. Es así como encontré una hermosa
función que realizaba exactamente como lo necesitaba,
aquí se los muestro: timedout_read() {
timeout=$1
varname=$2
old_tty_settings=`stty -g`
stty -icanon min 0 time ${timeout}0
eval read $varname # or just read $varname
stty "$old_tty_settings"
} [13]
2) Movimiento del carro: Esta parte de la
interfaz o bloque juego es la que efectúa el
movimiento del carro hacia la derecha si el
usuario presiono d y hacia la izquierda si el
usuario presiono a.
3) Generación de obstáculos aleatorio: Esta
parte del bloque juego es la que genera que los
obstáculos vayan apareciendo de forma aleatoria
usando la instrucción RANDOM [14].
4) Caída de obstáculos: Esta parte es una
función que hace que los obstáculos vayan
cayendo, haciendo una modificación en los
arreglos ya que cada línea de la interfaz está
definida como un arreglo de tamaño 17.
5) Muestra de Pantalla: Esta es la parte del
bloque juego que imprime en pantalla el juego
propiamente dicho.
6) Game Over: Es una interfaz que se muestra
cuando el jugador ha perdido la partida, mostrado
un mensaje que dice GAME OVER, además
muestra la puntuación obtenida basada en el
tiempo que se mantuvo sin chocar con ningún
obstáculo, además pide que escriba el nombre del
jugador y luego añade esta información a un
archivo de texto denominado rank.txt contendrá
todos los puntajes de todas las personas que han
jugado. A continuación se muestran unos
pantallazos de la interfaz Juego y Game Over
respectivamente: FIG. VI
PANTALLAZO DE JUEGO
FIG. VII
Pantallazo de Game Over
III. CONCLUSIONES
Es necesario antes de insertarse en la
programación de programas, sean estos scripts o
programas en cualquier tipo de lenguaje, analizar
las condiciones del programa objetivo y realizar
un diseño conceptual de la solución del mismo,
para facilitar la programación, además de hacerla
de una forma pulcra y ordenada.
Los script son archivos de texto que
pueden ser ejecutados por un intérprete de
comandos, que sirven para automatizar procesos
en los dispositivos electrónicos, además de poder
crear programas que emulen juegos para el ocio en
la consola de Linux.
Los scripts no son compilados, son
interpretados por el intérprete de comandos cada
vez que uno ejecute el mismo.
APÉNDICE
APÉNDICE A
LENGUAJE COMPILADO E INTERPRETADO
APÉNDICE B
DIAGRAMA DE BLOQUES DEL LENGUAJE INTERPRETADO
APÉNDICE C
PROCESO DE CARGA DE UN PROGRAMA
APÉNDICE D
KERNEL- SHELL- COMMANDS
RECONOCIMIENTOS
Agradecimientos Ing. Ignacio Marín García
docente de la cátedra de Fundamentos de Linux y
tutor de este proyecto, por ser el facilitador de
aprendizaje de este Sistema Operativo.
REFERENCIAS
[1] Anónimo (2012), “Linux”, [online] Wikipedia la
enciclopedia libre
Disponible en: http://es.wikipedia.org/wiki/Linux
.
[2] Anónimo (2012), “SO”, [online] Wikipedia la
enciclopedia libre
Disponible en:
http://es.wikipedia.org/wiki/Sistema_operativo
[3] Anónimo (2012), “La consola de Linux”,
[online] Wikipedia la enciclopedia libre
Disponible en:
http://www.linuxadictos.com/la-consola-de-linux-
%C2%BFla-pantalla-negra-de-la-muerte.html
[4] Anónimo (2012), “Atari”, [online] Wikipedia la
enciclopedia libre
Disponible en: http://es.wikipedia.org/wiki/Atari
[5] Anónimo (2012), “clear”, [online] Linux Documentation Disponible en: http://linux.die.net/man/1/clear
[6] Anónimo(2012), “sleep”, [online] Linux Documentation
Disponible en: http://linux.die.net/man/3/sleep
[7] Anónimo (2012), “clear”, [online] Linux Documentation
Disponible en: http://linux.die.net/man/1/case
[8] Anónimo (2012), “exit”, [online] Linux Documentation
Disponible en:http://linux.die.net/man/1/exit.
[9] Anónimo (2012), “sort”, [online] Linux Documentation Disponible en: http://linux.die.net/man/1/sort.
[10] Anónimo (2012), “set”, [online] Linux Documentation
Disponible en: http://linux.die.net/man/1/sed
[11] Anónimo (2012), “read”, [online] Linux Documentation
Disponible en: http://linux.die.net/man/2/read.
[12] Anónimo (2012), “Interprete de comandos”,
[online] Wikipedia la enciclopedia libre
Disponible en: http://es.wikipedia.org/wiki/Int%C3%A9rprete_de_com
andos.
[13] Anónimo (2012), “Advanced Bash-Scripting Guide”,
[online] Linux Documentation Proyect Guides
Disponible en:
http://www.tldp.org/LDP/abs/html/internalvariables.htm
l#TIMEOUT
[14] Anónimo (2012), “random”, [online] Linux
Documentation
Disponible en: http://linux.die.net/man/1/random
AUTOR
Steven Caicedo Mejillones Ingreso a la Facultad de
Ingeniera en Electricidad y Computación (FIEC) de la
Escuela Superior Politécnica del Litoral (ESPOL) en 2008
cursando una Ingeniería en Telemática, su principal interés
son los sistemas de comunicación digital, además del diseño
de circuitos digitales de control.