Advertisement
manhattanxl

viborita.pas

Jun 3rd, 2019
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.43 KB | None | 0 0
  1. PROGRAM vivorita;
  2. {
  3. * AUN NO TERMINADO, ALGUNOS ERRORES Y FALTA LA CAPTURA DE COMIDA
  4. * }
  5. USES crt;
  6. TYPE
  7.         PCUERPO = ^CUERPO;
  8.  
  9.         CUERPO = RECORD
  10.                 X : Integer;
  11.                 Y : Integer;
  12.                 Sig : PCUERPO;
  13.         END;
  14.  
  15. VAR
  16.         DEMORA : Integer;
  17.     BORDE : Integer;
  18.         VIBORA: PCUERPO;
  19.         DIRECCION : Integer;
  20.  
  21. PROCEDURE dibujarCuadrado;
  22. VAR
  23.     ancho : Integer;
  24.     alto : Integer;
  25.     i : Integer;
  26.     x : Integer;
  27.     y : Integer;
  28. BEGIN
  29.     { obtengo el ancho y el alto de la terminal }
  30.     ancho := WindMaxX;
  31.     alto  := WindMaxY;
  32.     x := BORDE;
  33.     y := BORDE;
  34.     FOR x := BORDE TO ancho-BORDE DO BEGIN
  35.         GotoXY( x, y );
  36.         Write('#');
  37.     END;
  38.     FOR y := BORDE TO alto-BORDE DO BEGIN
  39.         GotoXY( x, y );
  40.         Write('#');
  41.         END;
  42.     FOR x := x DOWNTO BORDE DO BEGIN
  43.         GotoXY( x, y );
  44.         Write('#');
  45.         END;
  46.     FOR y := y DOWNTO BORDE DO BEGIN
  47.         GotoXY( x, y );
  48.         Write('#');
  49.         END;
  50. END;
  51.  
  52. PROCEDURE mensajeFin;
  53. BEGIN;
  54.         ClrScr;
  55.         GotoXY(1,1);
  56.         WriteLn('MURIO');
  57.         Halt(1);
  58. END;
  59.  
  60. PROCEDURE agregarCuerpo( c : PCUERPO );
  61. VAR
  62.         n : PCUERPO; { nuevo elemento a asignar }
  63.         a : PCUERPO;
  64. BEGIN;
  65.         a := c;
  66.         WHILE a^.Sig <> Nil DO a := a^.Sig;
  67.         new ( n );
  68.         n^.X := a^.X;
  69.         n^.Y := a^.Y;
  70.         n^.Sig := Nil;
  71.         a^.Sig := n;
  72.  
  73. END;
  74.  
  75. PROCEDURE dibujarMoverVibora( c : PCUERPO );
  76. VAR
  77.         a : PCUERPO;
  78.         ant : PCUERPO;
  79. BEGIN;
  80.         { cada vez que me llama esta funcion, tengo que mover
  81.           la viborita, en vez de recalcular todo, tomo
  82.           la cola y la pongo en la posicion de adelate }
  83.         ant := c;
  84.         a := c;
  85.         WHILE a^.Sig <> Nil DO BEGIN
  86.                 GotoXY( a^.X, a^.Y );
  87.                 Write( '#' );
  88.                 ant := a;
  89.                 a := a^.Sig;
  90.         END;
  91.         ant^.Sig := Nil;
  92.         a^.Sig := c;
  93.         a^.X := c^.X;
  94.         a^.Y := c^.Y;
  95.         CASE DIRECCION OF
  96.                 0 : a^.Y := a^.Y - 1;
  97.                 1 : a^.X := a^.X + 1;
  98.                 2 : a^.Y := a^.Y + 1;
  99.                 3 : a^.X := a^.X - 1;
  100.         END;
  101.         VIBORA := a;
  102.         { dibujo la nueva posicion de la cabeza}
  103.         GotoXY( a^.X, a^.Y );
  104.         Write('#');
  105.  
  106. END;
  107.  
  108. FUNCTION verificarMuerte( c: PCUERPO ): Boolean;
  109. VAR
  110.         ant : PCUERPO;
  111. BEGIN;
  112.         { verifico que no se haya chocado contra si misma }
  113.         verificarMuerte := FALSE;
  114.         ant := c^.Sig;
  115.         WHILE ant <> Nil DO BEGIN
  116.                 IF (ant^.X = c^.X) AND (ant^.Y = c^.Y) THEN verificarMuerte := TRUE
  117.                 ELSE ant := ant^.Sig;
  118.         END;
  119.  
  120. END;
  121.  
  122. PROCEDURE estadoVibora( c: PCUERPO );
  123. VAR
  124.         a : PCUERPO;
  125.         n : Integer;
  126. BEGIN;
  127.         { muestra el estado de cada elemento de la vibora y lo imprime
  128.           en la pantalla }
  129.         a := c;
  130.         n := 0;
  131.         GotoXY( 1, 1 );
  132.         WHILE a <> Nil DO BEGIN
  133.                 WriteLn('Nodo No ', n, ^I, 'X:', a^.X, ^I, ',y:', a^.Y);
  134.                 a := a^.Sig;
  135.                 n := n + 1;
  136.         END;
  137.         IF verificarMuerte( c ) THEN mensajeFin();
  138. END;
  139.  
  140. PROCEDURE mientras;
  141. BEGIN;
  142.         ClrScr;
  143.         dibujarCuadrado();
  144.         dibujarMoverVibora( VIBORA );
  145.         estadoVibora( VIBORA );
  146.         Delay( DEMORA );
  147. END;
  148.  
  149.  
  150. FUNCTION interpreteTeclado( c : char ): Boolean;
  151. BEGIN;
  152.         GotoXY( 20, 20 );
  153.         Write( c );
  154.         interpreteTeclado := TRUE;
  155.         { capturo la direccion }
  156.         CASE c OF
  157.                 'w' : DIRECCION := 0;
  158.                 'd' : DIRECCION := 1;
  159.                 's' : DIRECCION := 2;
  160.                 'a' : DIRECCION := 3;
  161.                 'q' : interpreteTeclado := FALSE;
  162.         END;
  163. END;
  164.  
  165.  
  166. BEGIN;
  167.         { defino variables }
  168.         DEMORA := 500;
  169.         BORDE := 3;
  170.         { inicio la viborita }
  171.         new( VIBORA );
  172.         VIBORA^.X := 10;
  173.         VIBORA^.Y := 10;
  174.         VIBORA^.Sig := Nil;
  175.         DIRECCION := 1;
  176.         agregarCuerpo( VIBORA );
  177.         agregarCuerpo( VIBORA );
  178.         agregarCuerpo( VIBORA );
  179.         agregarCuerpo( VIBORA );
  180.         agregarCuerpo( VIBORA );
  181.         WHILE TRUE DO BEGIN
  182.                 { esto espera a que se presione una tecla }
  183.                 REPEAT
  184.                         mientras();
  185.                 UNTIL KeyPressed;
  186.                 { si se presiono una tecla la capturo }
  187.                 IF NOT interpreteTeclado( ReadKey ) THEN BREAK;
  188.         END;
  189. END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement