Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program snake;
- uses CRT;
- Type
- ptpos = ^posicao; { ponteiro para lista circular }
- posicao = record
- ant: ptpos;
- x: integer;
- y: integer;
- prox: ptpos;
- end;
- cab = record
- apont: ptpos;
- corpo: string;
- end;
- var
- opc: char;
- opaux: char;
- h, v, cont, apagax, apagay: integer;
- prim, p, pultimo: ptpos;
- comidaX, comidaY, opx, opy, opz: integer;
- tamanhoc: integer;
- vidas: integer;
- dificuldade: integer;
- pontos: integer;
- jogador: string;
- cabeca: cab;
- velocidade: integer; { tempo de dalay }
- procedure ListaCircular;
- begin
- {Cria uma lista circular duplamente encadada com 15 elementos
- que o tamanho m'e1ximo da cobra cada elemento comtem uma
- cordenada (x,y) de onde a cobra esta passando}
- new(prim);
- prim^.x := 2;
- prim^.y := 4;
- p := prim;
- for cont := 1 to 200 do
- begin
- new(pultimo);
- pultimo^.x := 2;
- pultimo^.y := 4;
- p^.prox := pultimo;
- pultimo^.ant := p;
- p := pultimo;
- end;
- pultimo^.prox := prim;
- prim^.ant := pultimo;
- cabeca.apont := prim;
- end;
- procedure PreencheCorpo;
- var i, a, b: integer;
- aux: string;
- begin
- aux := '';
- a := length(jogador);
- if (dificuldade = 1) and (a = 12) then
- dificuldade := 2;
- if (dificuldade = 2) and (a = 25) then
- dificuldade := 3;
- if a < 200 then
- for i := a to 200 do
- begin
- aux := aux + 'O';
- end;
- cabeca.corpo := '@OO' + aux;
- end;
- procedure Inicializa;
- begin
- delay(1000);
- clrscr;
- pontos := 0;
- dificuldade := 1;
- vidas := 3;
- { jogador := 'Orivaldo'; }
- preenchecorpo;
- tamanhoc := 3;
- velocidade := 110;
- opc := 'a';
- opx := 0;
- opy := 80;
- end;
- procedure AtualizaVariaveis;
- begin
- textcolor(14);
- gotoxy(18,2); write(pontos);
- gotoxy(45,2); write(dificuldade);
- gotoxy(67,2); write(vidas);
- end;
- procedure linhaH(posicaox, posicaoy, tamanho: integer);
- var a: integer;
- begin
- a := posicaox;
- while a < (posicaox + tamanho) do
- begin
- gotoxy(a,posicaoy);
- write('#');
- a := a + 1;
- end;
- end;
- procedure linhaV(posicaox, posicaoy, tamanho: integer);
- var a: integer;
- begin
- for a := posicaoy to (posicaoy + tamanho) do
- begin
- gotoxy(posicaox,a);
- write('#');
- end;
- end;
- procedure GeraTela;
- begin
- opx := 0; {ope'e7'f5es x e y que fazem a cobra se movimentar para baixo}
- opy := 80;
- h := 2;
- v := 4;
- clrscr;
- AtualizaVariaveis;
- textcolor(15);
- gotoxy(10,2); write('Pontos:');
- gotoxy(32,2); write('Dificuldade:');
- gotoxy(60,2); write('Vidas:');
- gotoxy(1,4);
- textcolor(11);
- linhaH(1,4,79);
- linhaH(1,24,79);
- linhaV(1,5,19);
- linhaV(79,5,19);
- end;
- procedure Apaga;
- var papaga: ptpos;
- begin
- textcolor(10);
- papaga := pultimo;
- gotoxy(papaga^.x,papaga^.y);
- write('*');
- textcolor(0);
- papaga := pultimo;
- papaga := pultimo^.ant;
- apagax := papaga^.x;
- apagay := papaga^.y;
- gotoxy(apagax,apagay);
- write('*');
- textcolor(10);
- end;
- procedure TamanhoCobra (tam : integer);
- begin
- pultimo := cabeca.apont; {faz o final da cobra amumentar}
- for cont := 1 to tam do
- pultimo := pultimo^.ant;
- end;
- procedure Telainicial;
- var
- posx, posy: integer;
- begin
- posx := 20;
- posy := 2;
- clrscr;
- textcolor(12);
- gotoxy(posx+13,posy); writeln('JOGO DA COBRINHA');
- textcolor(15);
- gotoxy(posx+7,posy+8); writeln('Pressione ENTER para comecar');
- textcolor(11);
- linhaH(1, posy+14, 80);
- linhaH(1, posy+22, 80);
- linhaV(1, posy+15, 6);
- linhaV(80, posy+15, 6);
- textcolor(12);
- gotoxy(3,posy+16); writeln('COMANDOS:');
- textcolor(15);
- gotoxy(5,posy+18); writeln('SETAS movimentam a cobra');
- gotoxy(5,posy+19); writeln('ESC para Sair');
- gotoxy(5,posy+20); writeln('P para Pausa');
- textcolor(7);
- gotoxy(posx+30,posy+11);
- readkey;
- end;
- procedure ComecarNovamente;
- var i: integer;
- procedure gameover;
- var posx,posy: integer;
- begin
- posx := 22;
- posy := 5;
- gotoxy(posx+15,posy+10);
- writeln('GAME OVER');
- { gotoxy(posx-2,posy+16); writeln('Pressione qualquer tecla para CONTINUAR ',i);}
- end;
- begin
- { reseta a posi'e7'e3o da cobra para o canto superior esquerdo}
- p := pultimo;
- for i := 1 to 15 do begin
- p^.x := 2;
- p^.y := 4;
- p := p^.prox;
- end;
- tamanhoC := 3;
- tamanhoCobra(tamanhoC); {coloca a cobra com o tamanho 3}
- textcolor(7);
- gotoxy(67,2); write(vidas);
- if vidas = 0 then begin
- i := 9; {quantidade de seguntos restante}
- while (i >= 0) do begin
- textcolor(red);
- gameover;
- delay(400);
- textcolor(7); {cinza claro}
- gameover;
- delay(600);
- i := i -1;
- if keypressed then
- i := -1;
- end;
- inicializa;
- end;
- geratela;
- end;
- procedure verificaPosicao; { verifca a posica'e3o de colisa'e3o }
- begin
- if (cabeca.apont^.x > 77) or (cabeca.apont^.x < 2) or (cabeca.apont^.y > 23) or (cabeca.apont^.y < 5) then
- begin
- vidas := vidas -1;
- comecarnovamente;
- end;
- end;
- procedure criaComida;
- begin
- comidaX := 2 + random(77);
- comidaY := 5 + random(19);
- textcolor(12);
- {indica o caracter que representarar a comida}
- gotoxy(comidaX,comidaY); write(cabeca.corpo[tamanhoc+1]);
- end;
- procedure atualizaComida; {mostra a comida na tela}
- begin
- textcolor(12);
- {indica o caracter que representarar a comida}
- gotoxy(comidaX,comidaY); write(cabeca.corpo[tamanhoC+1]);
- end;
- procedure mudaDificuldade;
- begin
- Dificuldade := Dificuldade +1;
- velocidade := velocidade - 20 div dificuldade; { imprime na tela no intervalo que 'e9 10 milisegundo menor que o anterior;}
- end;
- procedure verificacomida;
- begin
- if (cabeca.apont^.x = comidax) and (cabeca.apont^.y = comiday) then
- begin
- CriaComida;
- tamanhoc := tamanhoc +1;
- TamanhoCobra(tamanhoc);
- pontos := pontos + 10;
- if tamanhoc = 15 then
- MudaDificuldade;
- end;
- end;
- procedure mover(a,b: integer); {faz a cobra se mover para norte(0,1),}
- var i: integer; {sul(0,-1), leste(-1,0) e oeste(1,0)}
- q: ptpos;
- begin
- cabeca.apont := cabeca.apont^.prox;
- h := h + a;
- v := v + b;
- cabeca.apont^.x := h;
- cabeca.apont^.y := v;
- verificaposicao;
- i := tamanhoc;
- q := cabeca.apont;
- atualizaComida;
- textcolor(10); {cor azul claro da cobra}
- for i := 1 to tamanhoc do
- begin {cria a cobra na tela}
- gotoxy(q^.x,q^.y);
- q := q^.ant;
- write(cabeca.corpo[i]);
- end;
- pultimo := pultimo^.prox;
- verificacomida;
- apaga;
- atualizaVariaveis;
- end;
- Begin
- TelaInicial;
- Inicializa;
- Geratela;
- CriaComida;
- {esta lista circular comtem os caracteres e a posicao da cobra}
- Listacircular;
- TamanhoCobra(tamanhoc);
- {este e o laco principal do jogo usado para identificar quais sao as teclas usada pelo jogador}
- opc := 'a';
- while (opc <> 's') do
- begin
- if keypressed then
- begin
- opc := readkey;
- {a funcao ord nos fornece qual o codigo ascii da tecla, mas tem um
- problema quando o jogador usa teclas especias tipo as setas do teclado.
- Tem que usar duas variaveis para guardar o codigo dessas teclas
- especias, observando que a primeira variavel sempre fica com o valor 0}
- opz := ord(opc);
- if opz = 0 then
- begin
- opx := opz;
- opc := readkey;
- opz := ord(opc);
- if (opz = 75) or (opz = 77) or (opz = 72) or (opz = 80) then
- opy := opz;
- end;
- {para quando aperta 'p' ficar em pausa}
- if opz = 112 then begin
- opc := 'a';
- opy := 111;
- while (opz <> 112) do
- if keypressed then
- begin
- opc := readkey;
- opz := ord(opc);
- if opz = 0 then
- opz := ord(opc)
- end;
- end;
- if opz = 27 then {para usar ESC quando quiser sair do programa}
- opc := 's';
- end
- else begin
- if opx = 0 then
- begin
- case opy of
- 75: mover(-1,0); { movimentra para esquerda }
- 77: mover(1,0); { movimenta para direita}
- 72: mover(0,-1); { para cima }
- 80: mover(0,1); { para baixo }
- 1: comecarnovamente;
- 2: telainicial;
- end;
- delay(velocidade);
- end;
- end;
- end;
- gotoxy(1,40);
- clrscr;
- end.
Add Comment
Please, Sign In to add comment