Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {Criado por alunos da Unifacs - Pedro Moraes , Felipe Barreto , Cosme Henrique e Fernando Carvalho}
- program tutosnake;
- uses crt,Dos;
- Type
- CoOrd = Record
- X, Y : Byte;
- End;
- Snake = Record
- Partes : Array[1..100] of CoOrd; { A posição de cada parte da minhoca}
- Tamanho : Byte; { O tamanho da minhoca}
- Direcao : Byte; { Direção da minhoca}
- Velocidade:real; { Velocidade da minhoca}
- Vidas:byte; { Vidas da minhoca}
- End;
- Food = Record
- Posicao : CoOrd;
- Quantidade : byte;
- Comida:Char;
- End;
- VAR
- TUTO : Snake; { Instanciando a minhoca}
- TUTOS_FOOD: Food; { Instanciando a comida}
- quit:boolean; { Variavel de saida do jogo}
- key:char; { Variavel de leitura do teclado}
- mapaX: byte; { Variavel da largura da tela}
- mapaY: byte; { Variavel da altura da tela}
- {-----HELPERS-----}
- function timer:real; { }
- var hour,minute,second,sec100:word;
- begin
- GetTime(hour,minute,second,sec100);
- timer:=(hour*3600.0+minute*60.0+second)*100.0+1.0*sec100;
- end;
- procedure wait_seconds(t:real);
- var t1:real;
- begin
- t1:=timer;
- repeat until timer>t1+100*t;
- end;
- {-----PROCEDURES-----}
- Procedure Desenha_Info;
- Begin
- textcolor(7);
- GoToXY(20,2);
- write('Vidas : ',TUTO.Vidas);
- GoToXY(35,2);
- Write('Pontuacao : ',TUTOS_FOOD.Quantidade*10-10);
- GoToXY(50,2);
- write('comidaX : ',TUTOS_FOOD.Posicao.X,' comidaY : ',TUTOS_FOOD.Posicao.Y);
- End;
- Procedure Desenha_Limites;
- Var i:integer;
- Begin
- for i:=1 to mapaX do { Desenhando os limites do scoreboard}
- begin
- if i=1 then begin
- GoToXY(i,1);
- write(char(201));
- GoToXY(i,2);
- write(char(186));
- GoToXY(i,3);
- write(char(186))
- end else begin
- if i=100 then begin
- GoToXY(i,1);
- write(char(187));
- GoToXY(i,2);
- write(char(186));
- GoToXY(i,3);
- write(char(186))
- end else begin
- GoToXY(i,1);
- write(char(205));
- end;
- end;
- GoToXY(i,4);
- write(char(177));
- GoToXY(i,mapaY+5);
- write(char(177));
- end;
- for i:=5 to mapaY+5 do { Desenhando os limites do scoreboard}
- begin
- GoToXY(1,i);
- write(char(186));
- GoToXY(100,i);
- write(char(186));
- end;
- End;
- Procedure Desenhar_Comida;
- Begin
- if TUTOS_FOOD.Posicao.X < 3 then
- TUTOS_FOOD.Posicao.X :=3;
- if TUTOS_FOOD.Posicao.X > mapaX-1 then
- TUTOS_FOOD.Posicao.X :=mapaX-2;
- if TUTOS_FOOD.Posicao.Y < 6 then
- TUTOS_FOOD.Posicao.Y :=6;
- GoToXY(TUTOS_FOOD.Posicao.X,TUTOS_FOOD.Posicao.Y);
- randomize;
- textcolor(random(10)+1);
- write(TUTOS_FOOD.Comida);
- End;
- Procedure comeca(tamanho,vidas,quantidade:byte); { Valores iniciais para a minhoca}
- Var i : Byte;
- Begin
- randomize;
- TUTOS_FOOD.Quantidade := quantidade;
- TUTOS_FOOD.Posicao.X := Random(mapaX-1)+1;
- TUTOS_FOOD.Posicao.Y := Random(mapaY-2)+6;
- TUTOS_FOOD.Comida := char(248);
- TUTO.Tamanho := tamanho; {Part 4 is the clean up part}
- TUTO.Direcao := 2; {Left}
- TUTO.Velocidade := (0.3/TUTOS_FOOD.Quantidade);
- TUTO.Vidas := vidas;
- For i := 1 to tamanho do
- Begin
- TUTO.Partes[i].X := i + 25; {começar em X = 26}
- TUTO.Partes[i].Y := 10; {começar em Y = 10}
- End;
- textcolor(9);
- Desenha_Limites;
- Desenhar_Comida;
- End;
- Procedure Fim_de_Jogo;
- Begin
- clrscr;
- writeln(' _______ _______ _______ _____ _______ _____ _______ _______ _______ __ __ ');
- writeln('| ___|_ _| | | | \| ___| _| | | __| | | |');
- writeln('| ___|_| |_| | | -- | ___| | | - | | | - |__|__|');
- writeln('|___| |_______|__|_|__| |_____/|_______| |_______|_______|_______|_______|__|__|');
- quit:=true;
- End;
- Procedure Perde_Vida;
- Var i:byte;
- Begin
- randomize;
- for i:=1 to 5 do begin
- sound(i*10);
- wait_seconds((random(3)+1)/10);
- end;
- if TUTO.Vidas > 0 then begin
- TUTO.Vidas := TUTO.Vidas -1;
- clrscr;
- comeca(TUTO.Tamanho,TUTO.Vidas,TUTOS_FOOD.Quantidade);
- end else
- Fim_de_Jogo;
- End;
- Procedure Comida_Comida;
- Begin
- randomize;
- if TUTO.Tamanho < 100 then
- TUTO.Tamanho := TUTO.Tamanho + 1;
- TUTO.Velocidade := (0.3/TUTOS_FOOD.Quantidade);
- TUTOS_FOOD.Posicao.X := Random(mapaX)+1;
- TUTOS_FOOD.Posicao.Y := Random(mapaY)+1;
- TUTOS_FOOD.Quantidade := TUTOS_FOOD.Quantidade + 1;
- Desenhar_Comida;
- End;
- Procedure Desenhar_Minhoca;
- Var i : Byte;
- Begin
- textcolor(7);
- GotoXY(TUTO.Partes[1].X, TUTO.Partes[1].Y); {Partes[1] = Cabeça}
- Write('@');
- For i := 2 to TUTO.Tamanho - 2 Do {Encher o corpo}
- Begin
- GotoXY(TUTO.Partes[i].X, TUTO.Partes[i].Y);
- Write('0');
- End;
- GotoXY(TUTO.Partes[TUTO.Tamanho-1].X, TUTO.Partes[TUTO.Tamanho-1].Y); {Desenhar rabo}
- Write('*');
- GotoXY(TUTO.Partes[TUTO.Tamanho].X, TUTO.Partes[TUTO.Tamanho].Y);
- Write(' '); { Limpar "rastros"}
- GotoXY(1,1); { Evitar que o cursor siga o "rabo" da minhoca}
- End;
- Procedure Mover_Minhoca;
- Var i : Byte;
- Begin
- if (TUTOS_FOOD.Posicao.X = TUTO.Partes[1].X) and (TUTOS_FOOD.Posicao.Y = TUTO.Partes[1].Y) then
- Comida_Comida;
- if (TUTO.Partes[1].X = mapaX-1) or (TUTO.Partes[1].X = 2) or (TUTO.Partes[1].Y = mapaY+4) or (TUTO.Partes[1].Y = 5) then
- Perde_Vida
- else begin
- For i := TUTO.Tamanho downto 2 do { Mover o ultimo "pedaco" da minhoca para a }
- Begin { posição do penultimo e assim por diante }
- TUTO.Partes[i].X := TUTO.Partes[i-1].X;
- TUTO.Partes[i].Y := TUTO.Partes[i-1].Y;
- End;
- {GotoXY(1, 10); Partes[1] = Cabeça}
- {Write(TUTO.Partes[1].X);
- GotoXY(1, 11);
- Write(TUTO.Partes[1].Y);}
- Case TUTO.Direcao of {incrementar a posição de acordo com a direção}
- 1 : if TUTO.Partes[1].X < mapaX-1 then Inc(TUTO.Partes[1].X); {Direita}
- 2 : if TUTO.Partes[1].X > 2 then Dec(TUTO.Partes[1].X); {Esquerda}
- 3 : if TUTO.Partes[1].Y < mapaY+4 then Inc(TUTO.Partes[1].Y); {Baixo}
- 4 : if TUTO.Partes[1].Y > 5 then Dec(TUTO.Partes[1].Y); {Cima}
- End;
- For i := TUTO.Tamanho downto 2 do
- if (TUTO.Partes[i].X = TUTO.Partes[1].X) and (TUTO.Partes[i].Y = TUTO.Partes[1].Y) then { cabeca tocou corpo}
- Perde_Vida;
- Desenhar_Minhoca; {redesenhar a minhoca}
- End;
- End;
- Procedure Desenha_Telainicial;
- Begin
- writeln('');
- writeln(' 88888888888888888888888888 ');
- writeln(' 888888888888888888888888888888888 ');
- writeln(' 888888888887IIIIIII?IIIIIII78888888888 ');
- writeln(' 8888888IIIII???????????????????III$88888888 ');
- writeln(' 88888IIIII?????????????????????????III$888888 ');
- writeln(' 88888IIII???????????????????????????????III888888 ');
- writeln(' 8888IIII?????????????????????????????????IIII88888 ');
- writeln(' 8888III????????????????????????????????????IIII88888 ');
- writeln(' 8888III?????????????????????????????????????IIII8888 ');
- writeln(' 8888III?????????????????????????????????????IIIII8888 ');
- writeln(' 88887III?????????????????????????????????????IIIII8888 ');
- writeln(' 8888IIII???????????????:,,,,,,,=????????????IIIIIII8888');
- writeln(' 8888IIIII????????????,,,,,,,,,,,,??????,,,,,IIIIIII8888');
- writeln(' 8888IIIIIII?????????,,,,,,,,,,,,,:????,,,,,,,?IIIII8888');
- writeln(' 8888IIIIIIII???????:,,,,,,,,,,,,,,???,,,,,,,,,IIII78888');
- writeln(' 8888IIIIIIIIIII????,,,,,.....,,,,,~?,,,,,,,,,,,III8888 ');
- writeln(' 88887IIIIIIIIIIIII:,,,,.......,,,,,I,,,,,...,,,III8888 ');
- writeln(' 8888IIIIIIIIIIIII,,,,.....ZMMMM,,,,,,,,.....,,+I8888 ');
- writeln(' 8888IIIIIIIIIIIII,,,,.....MMMMMM,,,,MMMM....,,+88888 ');
- writeln(' 8888IIIIIIIIIIIII,,,.....?MMMMMM,,,MMMMMI...,,78888 ');
- writeln(' 888ZIIIIIIIIIIII,,,.....MMMMMMM,,,MMMMMM..,,,8888 ');
- writeln(' 8888IIIIIIIIIIII=,,.....MMMMMMM,,8MMMMMM..,,?888 ');
- writeln(' 8888$IIIIIIIIIII7,,.....MMMMMMM,,8MMMMMN.,,,888 ');
- writeln(' 8888IIIIIIIIIIII,,,.....MMMMM,,,,MMMMM..,,888 ');
- writeln(' 8888OIIIIIIIIIII+,,.....MMMM,,+,,MMMM..,,,88 ');
- writeln(' 8888IIIIIIIIIII7,,,......,,,,7,,.....,,,88 ');
- writeln(' 8888IIIIIIIIIIII7,,,,...,,,,,$,,,...,,,88 ');
- writeln(' 8888IIIIIIIIIIII,,,,,,,,,,,I$,,,,,,,,888 ');
- writeln(' 88887IIIIIIIIIII$,,,,,,,,,7I$,,,,,,,888 ');
- writeln(' 8888IIIIIIIIIIII7I,,,,,,7II$:,,,,7888 ');
- writeln(' 8888OIIIIIIIIIIIII$$=?$IIIII$,,~$888 ');
- writeln(' 8888IIIIIIIIIIIIIIIIIIIIIIII$II8888 ');
- writeln(' 8888IIIIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888IIIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888ZIIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 888888 8888IIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888888888 88887IIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 88888Z888888 8888IIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888I????Z8888 8888II88888IIIIIIIIIIIIIII88888 ');
- writeln(' 8888ZIIIII?Z88888 888OI88888888888Z$$$Z8888888 ');
- writeln(' 8888ZIIIIIIIII88888888888II$$8888888888888888888 ');
- writeln(' 8888IIIIIIIIIIII88888888IIII$$$$$$O88888888888 ');
- writeln(' 8888IIIIIIIIIIIIIIII7Z8$IIIIIII$$$$$$$$$$II8888 ');
- writeln(' 88888IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888OIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8888 ');
- writeln(' 8888IIIIII$88IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7888 ');
- writeln(' 8888IIIIIII8888IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII888 ');
- writeln(' 888888888IIIIIIO8888IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII888 ');
- writeln(' 8888888888$IIIIIII888888$IIIIIIIIIIIIIIIIIIIIIIIIIIIIII888 ');
- writeln(' 88888888887IIIIIIIII888888Z$$$IIIIIIIIIIIIIIIIIIIIIIII$$$888 ');
- writeln('88888ZIIIIIIIIIIII$$$88888888$$$$$$IIIIIIIIIIIIIIIII$$$$$8888 ');
- writeln('888Z$$$$$$$$$$$$$$$$8888 88888$$$$$$$$$$$$$$$$$$$$$$$$$$88888 ');
- writeln('8888$$$$$$$$$$$$$$$88888 888888$$$$$$$$$$$$$$$$$$$$$$888888 ');
- writeln('88888888O$$$$$$$O888888 8888888O$$$$$$$$$$$$$$88888888 ');
- writeln(' 888888888888888888888 888888888888888888888888888 ');
- writeln(' 8888888888888888 888888888888888888888 ');
- writeln(' 888888888 ');
- writeln('');
- writeln('');
- writeln(' _______ _______ _______ _______ _______ _______ _______ ________ _______ ______ _______ __ __ ');
- writeln('|_ _| | |_ _| | |_ _| | | ___| | | | | | __ \| | | | |');
- writeln(' | | | | | | | | - | | | | | ___| | | | | - | <| |__|__|');
- writeln(' |___| |_______| |___| |_______| |___| |___|___|_______| |________|_______|___|__||__|_|__|__|__|');
- End;
- {-----Inicializacao-----}
- BEGIN
- Desenha_Telainicial;
- readln;
- clrscr;
- mapaX :=100;
- mapaY := 30;
- quit := false;
- comeca(6,3,1);
- textcolor(7);
- textcolor(8);
- repeat
- Desenha_Info;
- wait_seconds(TUTO.Velocidade);
- if KeyPressed then
- key:=Readkey;
- case key of
- #72: if TUTO.Direcao <> 3 then TUTO.Direcao := 4 ;
- #75: if TUTO.Direcao <> 1 then TUTO.Direcao := 2 ;
- #77: if TUTO.Direcao <> 2 then TUTO.Direcao := 1 ;
- #80: if TUTO.Direcao <> 4 then TUTO.Direcao := 3 ;
- end;
- Mover_Minhoca;
- until quit;
- readln;
- END.
Add Comment
Please, Sign In to add comment