Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM vivorita;
- {
- * AUN NO TERMINADO, ALGUNOS ERRORES Y FALTA LA CAPTURA DE COMIDA
- * }
- USES crt;
- TYPE
- PCUERPO = ^CUERPO;
- CUERPO = RECORD
- X : Integer;
- Y : Integer;
- Sig : PCUERPO;
- END;
- VAR
- DEMORA : Integer;
- BORDE : Integer;
- VIBORA: PCUERPO;
- DIRECCION : Integer;
- PROCEDURE dibujarCuadrado;
- VAR
- ancho : Integer;
- alto : Integer;
- i : Integer;
- x : Integer;
- y : Integer;
- BEGIN
- { obtengo el ancho y el alto de la terminal }
- ancho := WindMaxX;
- alto := WindMaxY;
- x := BORDE;
- y := BORDE;
- FOR x := BORDE TO ancho-BORDE DO BEGIN
- GotoXY( x, y );
- Write('#');
- END;
- FOR y := BORDE TO alto-BORDE DO BEGIN
- GotoXY( x, y );
- Write('#');
- END;
- FOR x := x DOWNTO BORDE DO BEGIN
- GotoXY( x, y );
- Write('#');
- END;
- FOR y := y DOWNTO BORDE DO BEGIN
- GotoXY( x, y );
- Write('#');
- END;
- END;
- PROCEDURE mensajeFin;
- BEGIN;
- ClrScr;
- GotoXY(1,1);
- WriteLn('MURIO');
- Halt(1);
- END;
- PROCEDURE agregarCuerpo( c : PCUERPO );
- VAR
- n : PCUERPO; { nuevo elemento a asignar }
- a : PCUERPO;
- BEGIN;
- a := c;
- WHILE a^.Sig <> Nil DO a := a^.Sig;
- new ( n );
- n^.X := a^.X;
- n^.Y := a^.Y;
- n^.Sig := Nil;
- a^.Sig := n;
- END;
- PROCEDURE dibujarMoverVibora( c : PCUERPO );
- VAR
- a : PCUERPO;
- ant : PCUERPO;
- BEGIN;
- { cada vez que me llama esta funcion, tengo que mover
- la viborita, en vez de recalcular todo, tomo
- la cola y la pongo en la posicion de adelate }
- ant := c;
- a := c;
- WHILE a^.Sig <> Nil DO BEGIN
- GotoXY( a^.X, a^.Y );
- Write( '#' );
- ant := a;
- a := a^.Sig;
- END;
- ant^.Sig := Nil;
- a^.Sig := c;
- a^.X := c^.X;
- a^.Y := c^.Y;
- CASE DIRECCION OF
- 0 : a^.Y := a^.Y - 1;
- 1 : a^.X := a^.X + 1;
- 2 : a^.Y := a^.Y + 1;
- 3 : a^.X := a^.X - 1;
- END;
- VIBORA := a;
- { dibujo la nueva posicion de la cabeza}
- GotoXY( a^.X, a^.Y );
- Write('#');
- END;
- FUNCTION verificarMuerte( c: PCUERPO ): Boolean;
- VAR
- ant : PCUERPO;
- BEGIN;
- { verifico que no se haya chocado contra si misma }
- verificarMuerte := FALSE;
- ant := c^.Sig;
- WHILE ant <> Nil DO BEGIN
- IF (ant^.X = c^.X) AND (ant^.Y = c^.Y) THEN verificarMuerte := TRUE
- ELSE ant := ant^.Sig;
- END;
- END;
- PROCEDURE estadoVibora( c: PCUERPO );
- VAR
- a : PCUERPO;
- n : Integer;
- BEGIN;
- { muestra el estado de cada elemento de la vibora y lo imprime
- en la pantalla }
- a := c;
- n := 0;
- GotoXY( 1, 1 );
- WHILE a <> Nil DO BEGIN
- WriteLn('Nodo No ', n, ^I, 'X:', a^.X, ^I, ',y:', a^.Y);
- a := a^.Sig;
- n := n + 1;
- END;
- IF verificarMuerte( c ) THEN mensajeFin();
- END;
- PROCEDURE mientras;
- BEGIN;
- ClrScr;
- dibujarCuadrado();
- dibujarMoverVibora( VIBORA );
- estadoVibora( VIBORA );
- Delay( DEMORA );
- END;
- FUNCTION interpreteTeclado( c : char ): Boolean;
- BEGIN;
- GotoXY( 20, 20 );
- Write( c );
- interpreteTeclado := TRUE;
- { capturo la direccion }
- CASE c OF
- 'w' : DIRECCION := 0;
- 'd' : DIRECCION := 1;
- 's' : DIRECCION := 2;
- 'a' : DIRECCION := 3;
- 'q' : interpreteTeclado := FALSE;
- END;
- END;
- BEGIN;
- { defino variables }
- DEMORA := 500;
- BORDE := 3;
- { inicio la viborita }
- new( VIBORA );
- VIBORA^.X := 10;
- VIBORA^.Y := 10;
- VIBORA^.Sig := Nil;
- DIRECCION := 1;
- agregarCuerpo( VIBORA );
- agregarCuerpo( VIBORA );
- agregarCuerpo( VIBORA );
- agregarCuerpo( VIBORA );
- agregarCuerpo( VIBORA );
- WHILE TRUE DO BEGIN
- { esto espera a que se presione una tecla }
- REPEAT
- mientras();
- UNTIL KeyPressed;
- { si se presiono una tecla la capturo }
- IF NOT interpreteTeclado( ReadKey ) THEN BREAK;
- END;
- END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement