CURSO DE PROGRAMACION DE VIDEO JUEGOS: TEXTO #4.
---------------------------------------------------
Hola, ¨como van con la programacion?, espero que hayan practicado
con lo que vimos en el capitulo anterior. Vamos a empezar viendo
algunas palabras reservadas y funciones importantes y despues se-
guimos con la pelota.
Espero que no les importe mi desicion de quitar los acentos de las
palabras que deberian llevarlo, es que se me ocurre que se pueden
ver como otros caracteres en otros computadores con diferente sis-
tema operativo. En fin, empecemos:
1.- Palabras reservadas importantes:
* BEGIN y END: Se usan para encerrar una serie de instrucciones que
tienen algo en comun. La palabra BEGIN no lleva nunca
punto y coma, mientras la palabra END lleva un punto
en caso de ser la ultima linea del programa o un punto
y coma si no lo es.
* VAR: Se usa para declarar variables que seran usadas en el programa.
* USES: Permite agregar unidades necesarias para ciertos procedimientos
y funciones. Se analizara con mas detalle en capitulos mas ade-
lante.
Sintaxis:
USES unidad1, unidad2 ... ;
Ejemplo:
USES crt;
* IF..THEN: Se usan para chequear si es que se cumple una condicion,
y si se cumple ejecutar una serie de instrucciones.
Sintaxis:
IF condicion THEN instruccion(es);
Ejemplo:
IF a>=6 THEN
begin
writeln( 'Es mayor que seis' );
readln;
end;
* FOR..TO..DO: Se usan para repetir un numero de veces una o mas
instrucciones, para esto se utiliza una variable de
tipo entero como contador.
Sintaxis:
FOR variable:=inicio TO fin DO instruccion(es);
o bien:
FOR variable:=inicio DOWNTO fin DO instruccion(es);
Ejemplo:
for x:=1 downto -8 do writeln;
* WHILE..DO: Permite ejecutar reiteradas veces una o mas instrucciones
siempre que una condicion dada se cumpla.
Sintaxis:
WHILE condicion DO instruccion(es);
Ejemplo:
WHILE a>=6 DO a:=a*2;
Bien, con estas palabras reservadas es suficiente por ahora. Ahora
veamos algunas funciones importantes.
-- o --
2.- Funciones importantes.
* RANDOM: Devuelte un valor al azar dentro de un rango. Recordemos que
se debe llamar al procedimiento RANDOMIZE al principio del
programa para poder ocupar esta funcion.
Sintaxis: RANDOM( rango );
Parametros: rango es el valor maximo para tomar.
Ejemplo:
Azar:=Random(17); { A la variable Azar le asigna
un valor al azar entre 0 y 17 }
* KEYPRESSED: Devuelve un valor de tipo booleano (verdadero o falso)
que indica si se esta o no presionando un tecla.
Sintaxis: KEYPRESSED;
Unidad: crt;
Ejemplos: if keypressed then writeln('Apreto una tecla');
while NOT(Keypressed) do
writeln( 'presione una tecla para salir' );
-- o --
3.- El juego de la bola.
Continuemos ahora con el juego que estabamos haciendo en el capitulo 3.
Lo que habiamos hecho era ubicar la bola en el centro de la pantalla,
luego la desplazabamos hasta el borde derecho y luego hasta el borde
izquierdo, todo valiendonos del uso de la instruccion FOR.
Ahora trataremos de hacer que la bola rebote por toda la pantalla hasta
que se presione una tecla. Para esto necesitamos ejecutar una serie de
instrucciones reiteradas veces (las instrucciones que nos permiten
hacer mover la pelota) hasta que se cumpla una condicion (que se presione
una tecla). Aqui es donde deben escuchar a un peque¤o diablito que les
susurra al oido "INSTRUCCION WHILE, INSTRUCCION WHILE, INSTRUCCION ...",
este diablito es producto de la inspiracion, la programacion es un 30%
de conocimientos y un 70% de inspiracion, por esto, lo que yo les ense¤e
es solo la parte mas peque¤a de saber programar, el resto se logra nada
mas que con la practica.
Aqui les va el programa:
------------------------------------------------------------------------------
{ Programa de la pelota: version 0.5 }
Uses crt; { Para poder usar clrscr y keypressed }
var x: integer;
begin
clrscr; { Borramos la pantalla }
x := 40;
WHILE NOT(KEYPRESSED) DO
begin
clrscr;
gotoxy( x, 12 );
write( 'o' );
delay( 50 );
end;
end.
------------------------------------------------------------------------------
Aqui tenemos ya la pelota situada en el centro de la pantalla, la
instruccion WHILE esta trabajando de la siguiente manera:
En el programa: WHILE NOT(KEYPRESSED) DO
Traduccion: Mientras No (tecla presionada) Hacer
¨Se entiende?, espero que si. Luego las instrucciones que estan entre
el begin y el end son ejecutadas reiteradas veces hasta que no se cumpla
la condicion del WHILE (que se presione una tecla).
Ahora movamos la pelota de lado a lado:
------------------------------------------------------------------------------
{ Programa de la pelota: version 0.6 }
Uses crt; { Para poder usar clrscr y keypressed. }
var x, AUX: integer;
begin
clrscr; { Borramos la pantalla }
x := 40;
AUX := 1;
while not(keypressed) do
begin
clrscr;
INC( x, AUX ); { Incrementa x en AUX }
IF (x>78) OR (x<2) THEN AUX:=-AUX; { Si la bola toca un borde AUX }
{ cambia de signo. }
gotoxy( x, 12 );
write( 'o' );
delay( 50 );
end;
end.
------------------------------------------------------------------------------
Lo primero que necesitamos es una nueva variable llamada AUX, esta nos
permite cambiar el valor de la variable x de manera de desplazar la bola,
inicialmente el valor de esta variable es 1 (AUX := 1;), asi, cuando
incrementamos la variable x por medio del procedimiento INC esta aumenta
en 1.
¨Complicado?. Veamos una traduccion de la parte principal del programa:
( Dese el WHILE ):
mientras no( tecla presionada) hacer
comienzo
borrar la pantalla;
aumenta la variable x AUX veces;
si (x menor que 2) o (x mayor que 78) entonces AUX cambia de signo;
colocarse en la posicion x, 12 de la pantalla;
dibujar la pelota;
esperar 50 milisegundos;
fin;
Cuando usamos la instruccion IF en el programa podemos observar un nuevo
formato, aqui no solo se chequea una condicion sino dos. La palabra
reservada OR la colocamos entre dos condiciones, de manera que cualquiera
de las dos que se cumpla la instruccion IF ejecuta lo que sigue del
THEN. Asi como existe la palabra OR (o) tambien existe la palabra AND (y)
, esta nos permite chequear que se cumplan dos condiciones al mismo
tiempo. Y aun hay mas, este formato no solo es valido para la instruccion
IF, sino tambien para la instruccion WHILE y para otras que tambien
chequean una condicion. Veamos ejemplos de todo esto.
Si queremos chequear que el valor de una variable llamada Mol este
entre 4 y 12 podemos poner:
IF (Mol>4) AND (Mol<12) THEN ....;
Tambien podemos ejecutar una serie de instrucciones mientras no se
presione un tecla o la variable Mol se igual al caracter @:
WHILE NOT(Keypressed) OR (Mol='@') DO ....;
Lo que si debemos tomar en cuenta es que las condiciones deben ir entre
parentesis.
Ahora hagamos que la bola no solo se desplace en el eje x sino tambien
en el eje y, veamos como se hace:
------------------------------------------------------------------------------
{ Programa de la pelota: version 0.7 }
Uses crt;
var x, Y, aux, AUY: integer;
begin
x := 40;
Y := 12; { La variable Y es para la posicion horizontal de la bola }
aux := 1;
AUY := 1; { Ocupamos AUY para cambiar el valor de Y }
while not(keypressed) do
begin
clrscr;
inc( x, aux );
if (x>78) or (x<2) THEN aux:=-aux;
INC( Y, AUY );
IF (Y>23) OR (Y<2) THEN AUY:=-AUY;
gotoxy( x, Y ); { Ahora ubicamos la bola en la posicion x, y }
write( 'o' );
delay( 50 );
end;
end.
------------------------------------------------------------------------------
Facil y bonito ¨no?. El comportamiento de la bola en el eje y es muy
similar a lo que hacemos en el eje x. Ocupamos dos nuevas variables:
Y para la posicion de la bola en el eje Y, y AUY para modificar la
variable Y probocando el desplazamiento.
Agregemos ahora algunos procedimientos para hacer mas llamativo
nuestro programa:
------------------------------------------------------------------------------
{ Programa de la pelota: version 0.8 }
Uses crt;
var x, y, aux, auy: integer;
begin
x := 40;
Y := 12;
aux := 1;
auy := 1;
TEXTCOLOR( 10 );
while not(keypressed) do
begin
clrscr;
inc( x, aux );
if (x>78) or (x<2) then
BEGIN
aux:=-aux;
SOUND( 100 );
DELAY( 30 );
NOSOUND;
END;
inc( Y, auy );
if (y>23) or (y<2) then
BEGIN
auy:=-auy;
SOUND( 100 );
DELAY( 30 );
NOSOUND;
END;
gotoxy( x, y );
write( 'o' );
delay( 50 );
end;
end.
------------------------------------------------------------------------------
Lo que hicimos es ocupar el procedimiento TEXTCOLOR para cambiar el
color de las letras y los procedimientos SOUND y NOSOUND para producir
un peque¤o sonido por el speaker cuando rebota la bola.
-- o --
Espero que haya quedado claro como se confecciona un programa: la
forma de utilizar las instrucciones y todo eso.
-- o --
4.- Palabra reservada CONST.
La palabra reservada const se usa en forma similar a VAR, solo que
en lugar de permitirnos declarar variables es para declara constantes.
Sintaxis: CONST nombre = valor;
Ejemplo: CONST Pi = 3.1415;
MaxX = 79; MaxY = 24;
Ahora nuestros programas se dividen en 4 partes: la declaracion de
unidades (Uses), la declaracion de constantes (Const), la declaracion
de variables (Var) y el programa principal.
Aqui hay un programa ejemplo en que usamos Const:
-------------------------------------------------------------------------------
Uses crt;
Const Pi = 3.1415;
Var Area, Perimetro, Radio: real;
begin
clrscr;
write( 'Ingrese el radio del circulo: ' );
readln( radio );
Perimetro := 2 * Pi * radio;
Area := Pi * radio * radio;
writeln( 'Su perimetro es ', Perimetro );
writeln( 'Su area es ', Area );
readln;
end.
------------------------------------------------------------------------------
Aqui podemos distinguir claramente las 4 partes del programa:
1) Uso de unidades: Uses crt;
2) Declaracion de constantes: Const Pi = 3.1415;
3) Declaracion de variable: Var Area, ....;
4) Programa principal.
-- o --
5.- Otro formato para la instruccion IF.
La instruccion IF es una de las mas importantes en la programacion
y va a aparecer una gran cantidad de veces en practicamente todos
nuestros programas por lo que es muy importante que aprendan a usarla
bien.
El formato que hemos visto para la instruccion IF es:
IF condicion THEN instruccion(es);
esta es la forma mas simple de usarla, pero tambien vimos que se podia
chequear mas de una condicion usando las palabras reservadas OR y AND.
IF (condicion1) [OR|AND] (condicion2) [OR|AND] ... THEN instruccion(es);
(Vamos a usar la notacion [OR|AND] para indicar que en esa parte puede
utilizarse cualquiera de las dos palabras.)
Por ejemplo: if (a=1) and (b<3) then ...;
if (a=3) or (b=9) and (c<>4) then ...;
Ademas para chequear que una condicion no se cupla podiamos utilizar
la palabra NOT.
Ejemplo: if not(a=3) then ...; {si a no es igual a 3 entonces...}
Ahora vamos a agregar una nueva forma para la instruccion IF: Supongamos
que queremos hacer que si se cumple una condicion el programa ejecute
una instruccion, y si no se cumple ejecutar otra instruccion distinta.
Tal vez suena un poco complicado, veamos mejor un ejemplo:
if a=5 then writeln( 'a vale 5' )
ELSE
writeln( 'a no vale 5' );
¨Que esta haciendo este trozo de codigo?. Lo que hace es verificar
si a=5 mediante la instruccion IF, en caso de que se cumpla el
programa escribe en la pantalla "a vale 5". Y aqui viene lo nuevo,
la palabra ELSE sirve para que se ejecute una o mas instrucciones
en caso de que no se cumpla la condicion del IF, en el ejemplo, si
no se cumple la condicion de que a=5 entonces imprime en la pantalla
"a no vale 5".
IMPORTANTE!!: Deben fijarse que para poder usar la palabra ELSE,
la instruccion IF no lleva punto y coma (;) al final.
Veamos un ejemplo que incluye el uso de este nuevo formato.
-- o --
6.- Juego de azar.
Este es uno de los primeros juegos que aprendi a hacer en el Atari
800XL. Consiste en que el computador te entrega cierta cantidad de
dinero, luego escoje dos numeros al azar y te dice el primero,
debes adivinar si el segundo que escojio es mayor que el primero
apostando plata.
Presten atencion a los distintos usos de la instruccion IF, tambien
se incluye por primera vez el uso de la funcion RANDOM.
------------------------------------------------------------------------------
{ Juego de azar 1 }
Uses crt;
var n1, n2: integer;
dinero: integer;
apostado: integer;
begin
RANDOMIZE; { Debemos llamar a este procedimiento para poder usar RANDOM }
dinero := 20;
while (dinero>0) do
begin
clrscr;
n1 := RANDOM(10);
n2 := RANDOM(10);
writeln( 'Tu tienes ', dinero, ' pesos.' );
writeln( 'Mi primer numero es ', n1, '.' );
writeln( 'Cuanto apuestas a que mi proximo numero' );
writeln( 'es mayor que ', n1, '.' );
writeln; { Esto es para saltarse una linea }
readln( apostado );
if (apostado<=0) or (apostado>dinero) then
writeln( 'Apuesta no es valida.' )
ELSE
begin
writeln( 'Ok.' );
writeln( 'Mi segundo numero era ', n2, '.' );
writeln;
if n2>n1 then
begin
writeln( 'Tu ganas.' );
inc( dinero, apostado );
end { No lleva ; para poder usar ELSE }
ELSE
begin
writeln( 'Tu pierdes.' );
dec( dinero, apostado );
end;
end;
writeln;
writeln( 'Presiona ENTER para continuar...' );
readln;
end;
writeln;
writeln( 'Gracias por jugar.' );
end.
------------------------------------------------------------------------------
En realidad no hay mucho que analizar, tal vez les cueste un poco
entender la forma del programa, solo analisenlo bien. Lo mejor es
respaldarlo y "meterle mano" ponganse a cambiarle cosas y asi
aprenden.
-- o --
Aqui quedamos con el curso 4. En el proximo vamos a terminar con la
primera parte, vamos a aprender los ultimos procedimientos y estaremos
listos para programar algunos juegos.
Recibi mails de algunas personas solicitando algunos programas pero
que no incluian su direccion de correo electronico en el mensaje para
poder ubicarlos a si que ojala que escriban denuevo. Por cierto, arregle
mi sitio para que no se abriera esta molesta ventana de Geocities asi
que visitenlo, luego voy a subir algunas herramientas.
Si hay algo que no haya quedado claro en este o alguno de los capitulos
anteriores no duden en escribirme y yo les respondo en lo que se demoran
en pesta¤ar.
Cualquier consulta o comentario me escriben. Nos vemos en el TEXTO 5.
CHAO.
JPLL
pc-jlopez@entelchile.net
www.geocities.com/SiliconValley/Bridge/1910
-- o --
               (
geocities.com/siliconvalley/bridge)                   (
geocities.com/siliconvalley)