Guest User

Untitled

a guest
Jan 24th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.82 KB | None | 0 0
  1. program snake;
  2.  
  3. uses CRT;
  4.  
  5. Type
  6.    ptpos = ^posicao; { ponteiro para lista circular }
  7.    posicao = record
  8.       ant: ptpos;
  9.       x: integer;
  10.       y: integer;
  11.       prox: ptpos;
  12.    end;
  13.  
  14.    cab = record
  15.       apont: ptpos;
  16.       corpo: string;
  17.    end;
  18.  
  19. var
  20.    opc: char;
  21.    opaux: char;
  22.    h, v, cont, apagax, apagay: integer;
  23.    prim, p, pultimo: ptpos;
  24.    comidaX, comidaY, opx, opy, opz: integer;
  25.    tamanhoc: integer;
  26.    vidas: integer;
  27.    dificuldade: integer;
  28.    pontos: integer;
  29.    jogador: string;
  30.    cabeca: cab;
  31.    velocidade: integer; { tempo de dalay }
  32.  
  33. procedure ListaCircular;
  34. begin
  35. {Cria uma lista circular duplamente encadada com 15 elementos
  36. que o tamanho m'e1ximo da cobra cada elemento comtem uma
  37. cordenada (x,y) de onde a cobra esta passando}
  38.    new(prim);
  39.    prim^.x := 2;
  40.    prim^.y := 4;
  41.    p := prim;
  42.    for cont := 1 to 200 do
  43.    begin
  44.       new(pultimo);
  45.       pultimo^.x := 2;
  46.       pultimo^.y := 4;
  47.       p^.prox := pultimo;
  48.       pultimo^.ant := p;
  49.       p := pultimo;
  50.    end;
  51.    pultimo^.prox := prim;
  52.    prim^.ant := pultimo;
  53.    cabeca.apont := prim;
  54. end;
  55.  
  56. procedure PreencheCorpo;
  57. var i, a, b: integer;
  58.    aux: string;
  59. begin
  60.    aux := '';
  61.    a := length(jogador);
  62.    if (dificuldade = 1) and (a = 12) then
  63.       dificuldade := 2;
  64.    if (dificuldade = 2) and (a = 25) then
  65.       dificuldade := 3;
  66.    if a < 200 then
  67.       for i := a to 200 do
  68.       begin
  69.          aux := aux + 'O';
  70.       end;
  71.    cabeca.corpo := '@OO' + aux;
  72. end;
  73.  
  74. procedure Inicializa;
  75. begin
  76.    delay(1000);
  77.    clrscr;
  78.    pontos := 0;
  79.    dificuldade := 1;
  80.    vidas := 3;
  81.    { jogador := 'Orivaldo'; }
  82.    preenchecorpo;
  83.    tamanhoc := 3;
  84.    velocidade := 110;
  85.    opc := 'a';
  86.    opx := 0;
  87.    opy := 80;
  88. end;
  89.  
  90.  
  91. procedure AtualizaVariaveis;
  92. begin
  93.    textcolor(14);
  94.    gotoxy(18,2); write(pontos);
  95.    gotoxy(45,2); write(dificuldade);
  96.    gotoxy(67,2); write(vidas);
  97. end;
  98.  
  99. procedure linhaH(posicaox, posicaoy, tamanho: integer);
  100. var a: integer;
  101. begin
  102.    a := posicaox;
  103.    while a < (posicaox + tamanho) do
  104.    begin
  105.       gotoxy(a,posicaoy);
  106.       write('#');
  107.       a := a + 1;
  108.    end;
  109. end;
  110.  
  111. procedure linhaV(posicaox, posicaoy, tamanho: integer);
  112. var a: integer;
  113. begin
  114.    for a := posicaoy to (posicaoy + tamanho) do
  115.    begin
  116.       gotoxy(posicaox,a);
  117.       write('#');
  118.    end;
  119. end;
  120.  
  121. procedure GeraTela;
  122. begin
  123.    opx := 0;  {ope'e7'f5es x e y que fazem a cobra se movimentar para baixo}
  124.    opy := 80;
  125.    h := 2;
  126.    v := 4;
  127.    clrscr;
  128.  
  129.    AtualizaVariaveis;
  130.  
  131.    textcolor(15);
  132.    gotoxy(10,2); write('Pontos:');
  133.    gotoxy(32,2); write('Dificuldade:');
  134.    gotoxy(60,2); write('Vidas:');
  135.    gotoxy(1,4);
  136.  
  137.    textcolor(11);
  138.    linhaH(1,4,79);
  139.    linhaH(1,24,79);
  140.    linhaV(1,5,19);
  141.    linhaV(79,5,19);
  142. end;
  143.  
  144.  
  145. procedure Apaga;
  146. var papaga: ptpos;
  147. begin
  148.    textcolor(10);
  149.    papaga := pultimo;
  150.    gotoxy(papaga^.x,papaga^.y);
  151.    write('*');
  152.    textcolor(0);
  153.    papaga := pultimo;
  154.    papaga := pultimo^.ant;
  155.    apagax := papaga^.x;
  156.    apagay := papaga^.y;
  157.    gotoxy(apagax,apagay);
  158.    write('*');
  159.    textcolor(10);
  160. end;
  161.  
  162. procedure TamanhoCobra (tam : integer);
  163. begin
  164.    pultimo := cabeca.apont; {faz o final da cobra amumentar}
  165.    for cont := 1 to tam do
  166.      pultimo := pultimo^.ant;
  167. end;
  168.  
  169.  
  170. procedure Telainicial;
  171. var
  172.   posx, posy: integer;
  173. begin
  174.    posx := 20;
  175.    posy := 2;
  176.    clrscr;
  177.  
  178.    textcolor(12);
  179.    gotoxy(posx+13,posy);  writeln('JOGO DA COBRINHA');
  180.  
  181.    textcolor(15);
  182.    gotoxy(posx+7,posy+8); writeln('Pressione ENTER para comecar');
  183.  
  184.    textcolor(11);
  185.    linhaH(1,  posy+14, 80);
  186.    linhaH(1,  posy+22, 80);
  187.    linhaV(1,  posy+15, 6);
  188.    linhaV(80, posy+15, 6);
  189.  
  190.    textcolor(12);
  191.    gotoxy(3,posy+16); writeln('COMANDOS:');
  192.    textcolor(15);
  193.    gotoxy(5,posy+18); writeln('SETAS movimentam a cobra');
  194.    gotoxy(5,posy+19); writeln('ESC para Sair');
  195.    gotoxy(5,posy+20); writeln('P para Pausa');
  196.    textcolor(7);
  197.    gotoxy(posx+30,posy+11);
  198.    readkey;
  199. end;
  200.  
  201. procedure ComecarNovamente;
  202. var i: integer;
  203.  
  204.  procedure gameover;
  205.  var posx,posy: integer;
  206.  begin
  207.  posx := 22;
  208.  posy := 5;
  209.  gotoxy(posx+15,posy+10);
  210.  writeln('GAME OVER');
  211.  
  212. { gotoxy(posx-2,posy+16); writeln('Pressione qualquer tecla para CONTINUAR ',i);}
  213.  end;
  214.  
  215.  
  216. begin
  217. { reseta a posi'e7'e3o da cobra para o canto superior esquerdo}
  218.  p := pultimo;
  219.  for i := 1 to 15 do begin
  220.  p^.x := 2;
  221.  p^.y := 4;
  222.  p := p^.prox;
  223.  end;
  224.  
  225.  tamanhoC := 3;
  226.  
  227.  tamanhoCobra(tamanhoC); {coloca a cobra com o tamanho 3}
  228.  
  229.  
  230.  textcolor(7);
  231.  gotoxy(67,2); write(vidas);
  232.  if vidas = 0 then begin
  233.  
  234.  i := 9;   {quantidade de seguntos restante}
  235.  while (i >= 0)  do begin
  236.  textcolor(red);
  237.  gameover;
  238.  delay(400);
  239.  textcolor(7); {cinza claro}
  240.  gameover;
  241.  delay(600);
  242.  i := i -1;
  243.  if keypressed then
  244.  i := -1;
  245.  end;
  246.  inicializa;
  247.  end;
  248.  geratela;
  249. end;
  250.  
  251. procedure verificaPosicao; { verifca a posica'e3o de colisa'e3o }
  252. begin
  253.    if (cabeca.apont^.x > 77) or (cabeca.apont^.x < 2) or (cabeca.apont^.y > 23) or (cabeca.apont^.y < 5) then
  254.    begin
  255.       vidas := vidas -1;
  256.       comecarnovamente;
  257.    end;
  258. end;
  259.  
  260.  
  261. procedure criaComida;
  262. begin
  263.    comidaX := 2 +  random(77);
  264.    comidaY := 5 +  random(19);
  265.    textcolor(12);
  266.    {indica o caracter que representarar a comida}
  267.    gotoxy(comidaX,comidaY); write(cabeca.corpo[tamanhoc+1]);
  268. end;
  269.  
  270. procedure atualizaComida; {mostra a comida na tela}
  271. begin
  272.    textcolor(12);
  273.    {indica o caracter que representarar a comida}
  274.    gotoxy(comidaX,comidaY); write(cabeca.corpo[tamanhoC+1]);
  275. end;
  276.  
  277. procedure mudaDificuldade;
  278. begin
  279.    Dificuldade := Dificuldade +1;
  280.    velocidade := velocidade - 20 div dificuldade; { imprime na tela no intervalo que 'e9 10 milisegundo menor que o anterior;}
  281. end;
  282.  
  283. procedure verificacomida;
  284. begin
  285.    if (cabeca.apont^.x = comidax) and (cabeca.apont^.y = comiday) then
  286.    begin
  287.       CriaComida;
  288.       tamanhoc := tamanhoc +1;
  289.       TamanhoCobra(tamanhoc);
  290.       pontos := pontos + 10;
  291.       if tamanhoc = 15  then
  292.          MudaDificuldade;
  293.    end;
  294. end;
  295.  
  296. procedure mover(a,b: integer); {faz a cobra se mover para norte(0,1),}
  297. var i: integer;  {sul(0,-1), leste(-1,0) e oeste(1,0)}
  298.  q: ptpos;
  299. begin
  300.    cabeca.apont := cabeca.apont^.prox;
  301.    h := h + a;
  302.    v := v + b;
  303.    cabeca.apont^.x := h;
  304.    cabeca.apont^.y := v;
  305.    verificaposicao;
  306.    i := tamanhoc;
  307.    q := cabeca.apont;
  308.    atualizaComida;
  309.    textcolor(10); {cor azul claro da cobra}
  310.    for i := 1 to tamanhoc do
  311.    begin {cria a cobra na tela}
  312.       gotoxy(q^.x,q^.y);
  313.       q := q^.ant;
  314.       write(cabeca.corpo[i]);
  315.    end;
  316.    pultimo := pultimo^.prox;
  317.    verificacomida;
  318.    apaga;
  319.    atualizaVariaveis;
  320. end;
  321.  
  322. Begin
  323.    TelaInicial;
  324.    Inicializa;
  325.    Geratela;
  326.    CriaComida;
  327.    {esta lista circular comtem os caracteres e a posicao da cobra}
  328.    Listacircular;
  329.    TamanhoCobra(tamanhoc);
  330.  
  331.    {este e o laco principal do jogo usado para identificar quais sao as teclas usada pelo jogador}
  332.    opc := 'a';
  333.    while (opc <> 's') do
  334.    begin
  335.       if keypressed then
  336.       begin
  337.          opc := readkey;
  338.          {a funcao ord nos fornece qual o codigo ascii da tecla, mas tem um
  339.          problema quando o jogador usa teclas especias tipo as setas do teclado.
  340.          Tem que usar duas variaveis para guardar o codigo dessas teclas
  341.          especias, observando que a primeira variavel sempre fica com o valor 0}
  342.          opz := ord(opc);
  343.          if opz = 0 then
  344.          begin
  345.             opx := opz;
  346.             opc := readkey;
  347.             opz := ord(opc);
  348.             if (opz = 75) or (opz = 77) or (opz = 72) or (opz = 80) then
  349.                opy := opz;
  350.             end;
  351.             {para quando aperta 'p' ficar em pausa}
  352.             if opz = 112 then begin
  353.                opc := 'a';
  354.                opy := 111;
  355.                while (opz <> 112) do
  356.                   if keypressed then
  357.                   begin
  358.                      opc := readkey;
  359.                      opz := ord(opc);
  360.                      if opz = 0 then
  361.                         opz := ord(opc)
  362.                      end;
  363.                   end;
  364.                   if opz = 27 then {para usar ESC quando quiser sair do programa}
  365.                      opc := 's';
  366.                   end
  367.                   else begin
  368.                      if opx = 0 then
  369.                      begin
  370.                         case opy of
  371.                            75: mover(-1,0); { movimentra para esquerda }
  372.                            77: mover(1,0);  { movimenta para direita}
  373.                            72: mover(0,-1); { para cima }
  374.                            80: mover(0,1);  { para baixo }
  375.                             1: comecarnovamente;
  376.                             2: telainicial;
  377.                      end;
  378.                      delay(velocidade);
  379.                  end;
  380.               end;
  381.            end;
  382.            gotoxy(1,40);
  383.            clrscr;
  384. end.
Add Comment
Please, Sign In to add comment