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 --

    Source: geocities.com/siliconvalley/bridge/1910

               ( geocities.com/siliconvalley/bridge)                   ( geocities.com/siliconvalley)