Você está na página 1de 11

program Velha;

uses dos,crt;
var Posicao : array[1..9,1..2] of byte;
Conteudo : array[1..9] of char;
Simbolo : char;
procedure Escrever(x,y : integer; s : string);
begin
gotoxy(x,y);
write(s);
end;
procedure DesenharGrade;
var i : integer;
begin
Escrever(30, 3,'1 |2 |3 ');
Escrever(30, 4,' | | ');
Escrever(30, 5,' | | ');
Escrever(30, 6,'===|===|===');
Escrever(30, 7,'4 |5 |6 ');
Escrever(30, 8,' | | ');
Escrever(30, 9,' | | ');
Escrever(30,10,'===|===|===');
Escrever(30,11,'7 |8 |9 ');
Escrever(30,12,' | | ');
Escrever(30,13,' | | ');
for i := 1 to 9 do
Escrever(Posicao[i,1],Posicao[i,2],Conteudo[i]);
end;
procedure Inicializar;
var i,j,p : integer;
begin
for i := 1 to 3 do
for j := 1 to 3 do begin
p := (i-1)*3+j;
Posicao[p,1] := 27+(j*4);
Posicao[p,2] := 4*i;
Conteudo[p] := ' ';
end;
Simbolo := 'X';
end;
function PegarTecla : char;
begin
while (not(keypressed)) do begin end;
PegarTecla := readkey;
end;
function PegarNumero (x,y:integer;Frase:string):integer;
var valor : integer;
begin
valor := 0;
repeat
Escrever(x,y,Frase);
valor := byte(PegarTecla)-byte('0');
until ((valor>0) and (valor<10));
PegarNumero := valor;
end;
function Empatou : boolean;
var i : integer;
begin empatou := false;
for i:= 1 to 9 do

if Conteudo[i]=' ' then exit;


empatou := true;
end;
function Acabou : boolean;
begin
Acabou := true;
if (Conteudo[ 1]=Conteudo[
') then exit;
if (Conteudo[ 4]=Conteudo[
') then exit;
if (Conteudo[ 7]=Conteudo[
') then exit;
if (Conteudo[ 1]=Conteudo[
') then exit;
if (Conteudo[ 2]=Conteudo[
') then exit;
if (Conteudo[ 3]=Conteudo[
') then exit;
if (Conteudo[ 1]=Conteudo[
') then exit;
if (Conteudo[ 3]=Conteudo[
') then exit;
if Empatou then exit;
Acabou := false;
end;

2]) and (Conteudo[ 2]=Conteudo[ 3]) and (Conteudo[ 1]<>'


5]) and (Conteudo[ 5]=Conteudo[ 6]) and (Conteudo[ 4]<>'
8]) and (Conteudo[ 8]=Conteudo[ 9]) and (Conteudo[ 7]<>'
4]) and (Conteudo[ 4]=Conteudo[ 7]) and (Conteudo[ 1]<>'
5]) and (Conteudo[ 5]=Conteudo[ 8]) and (Conteudo[ 2]<>'
6]) and (Conteudo[ 6]=Conteudo[ 9]) and (Conteudo[ 3]<>'
5]) and (Conteudo[ 5]=Conteudo[ 9]) and (Conteudo[ 1]<>'
5]) and (Conteudo[ 5]=Conteudo[ 7]) and (Conteudo[ 3]<>'

function FazerJogada(n : integer):boolean;


begin
FazerJogada := false;
if (Conteudo[n]<>' ') then exit;
FazerJogada := true;
Conteudo[n] := Simbolo;
if Acabou then exit;
if Simbolo='X' then Simbolo := 'O' else Simbolo:='X';
end;
begin
Inicializar;
Clrscr;
while not(Acabou) do begin
DesenharGrade;
FazerJogada(PegarNumero(15,17,'Vez do jogador ('+Simbolo+'): '));
end;
DesenharGrade;
if Empatou then
Escrever(20,21,'Empatou!')
else
Escrever(20,21,'Jogador ('+Simbolo+') ganhou!');
repeat until keypressed;
readkey;
end.
========================================
Retornar ao topo

programmain;
usesCRT;
Type
ptpos=^posicao;
posicao=record

{ponteiroparalistacircular}
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;{tempodedalay}

procedurelistacircular;
begin
{Criaumalistacircularduplamenteencadadacom15elementos
queotamanhomximodacobracadaelementocomtemuma
cordenada(x,y)deondeacobraestapassando}
new(prim);
prim^.x:=2;
prim^.y:=4;
p:=prim;
forcont:=1to15dobegin
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;
procedurepreencheCorpo;
vari,a:integer;
aux:string;
begin
aux:='';
a:=length(jogador);
ifa<12then
fori:=ato15dobegin
aux:=aux+'#';
end;
cabeca.corpo:='@##'+jogador+aux;
end;
procedureinicializa;
begin
delay(1000);
clrscr;
pontos:=0;
dificuldade:=1;
vidas:=5;
{
jogador:='Orivaldo';}
preenchecorpo;
tamanhoc:=3;
velocidade:=110;
opc:='a';
opx:=0;
opy:=80;
end;

procedureatualizaVariaveis;
begin
textcolor(10);{marrom}
gotoxy(18,2);write(pontos);
gotoxy(45,2);write(dificuldade);
gotoxy(67,2);write(vidas);
end;
procedurelinhaH(posicaox,posicaoy,tamanho:integer);
vara:integer;
begin
{
fora:=posicaoxto(posicaox+tamanho)dobegin
gotoxy(a*2,posicaoy);
write('*');
end;}

a:=posicaox;
whilea<(posicaox+tamanho)dobegin
gotoxy(a,posicaoy);
write('*');
a:=a+2;
end;
end;
procedurelinhaV(posicaox,posicaoy,tamanho:integer);
vara:integer;
begin
fora:=posicaoyto(posicaoy+tamanho)dobegin
gotoxy(posicaox,a);
write('*');
end;
end;
proceduregeraTela;
begin
opx:=0;{opeesxeyquefazemacobrasemovimentar
parabaixo}
opy:=80;
h:=2;
v:=4;
clrscr;
atualizaVariaveis;
textcolor(6);{marrom}
gotoxy(10,2);write('Pontos:');
gotoxy(32,2);write('Dificuldade:');
gotoxy(60,2);write('Vidas:');
gotoxy(1,4);
linhaH(1,4,79);
linhaH(1,24,79);
linhaV(1,5,19);
linhaV(79,5,19);
end;

procedureapaga;
varpapaga:ptpos;
begin
textcolor(3);
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(7);
end;
proceduretamanhoCobra(tam:integer);
begin
pultimo:=cabeca.apont;{fazofinaldacobraamumentar}
forcont:=1totamdo
pultimo:=pultimo^.ant;
end;

proceduretelainicial;
var
posx,posy:integer;
begin
posx:=20;
posy:=2;
clrscr;
textcolor(6);
gotoxy(posx,posy);writeln('***
***

***');
gotoxy(posx,posy+1);writeln('*
******
****');
gotoxy(posx,posy+2);writeln('*
******
*****');
gotoxy(posx,posy+3);writeln('*
*****
****');
gotoxy(posx,posy+4);writeln('*********
***');
gotoxy(posx,posy+5);writeln('
***
*
*
');
gotoxy(posx+15,posy+6);writeln('OrivaldoVieira');
gotoxy(posx+8,posy+7);writeln('<CienciadaComputacao
UFBA>');
gotoxy(posx,posy+9); writeln('
Versao0.9
');
gotoxy(posx,posy+11);
writeln('Entrecomseuprimeironome:');
linhaH(1,posy+14,80);
linhaH(1,posy+22,80);
linhaV(1,posy+14,8);
linhaV(79,posy+14,8);

textcolor(14);
gotoxy(2,posy+15);writeln('HELP:');

gotoxy(3,posy+17);writeln('Useassetasdotecladopara
movimentaracobra');
gotoxy(3,posy+18);writeln('SouESCparaSair');
gotoxy(3,posy+19);writeln('PparaPausa');
gotoxy(3,posy+20);writeln('Obs.:Coloqueoterminal
maximizadoecomfundopreto');
textcolor(7);
gotoxy(posx+30,posy+11);
readln(jogador);

end;
procedurecomecarNovamente;
vari:integer;
proceduregameover;
varposx,posy:integer;
begin
posx:=22;
posy:=5;
clrscr;
gotoxy(posx,posy);writeln('***
**
');
gotoxy(posx,posy+1);writeln('*
*******
***');
gotoxy(posx,posy+2);writeln('********
*
');
gotoxy(posx,posy+3);writeln('********
**');
gotoxy(posx,posy+4);writeln('*******
*
');
gotoxy(posx,posy+5);writeln('
**
*
**');
gotoxy(posx,posy+8);writeln('
*
*
*
**');
gotoxy(posx,posy+9);writeln('*********
**');
gotoxy(posx,posy+10);writeln('*****

***');
gotoxy(posx,posy+11);writeln('*******
**');
gotoxy(posx,posy+12);writeln('**
*
*

**');
gotoxy(posx,posy+13);writeln('***
****
');
{
gotoxy(posx2,posy+16);writeln('Pressionequalquertecla
paraCONTINUAR',i);}
end;

begin

{resetaaposiodacobraparaocantosuperioresquerdo}
p:=pultimo;
fori:=1to15dobegin
p^.x:=2;
p^.y:=4;
p:=p^.prox;
end;
tamanhoC:=3;
tamanhoCobra(tamanhoC);{colocaacobracomotamanho3}

textcolor(7);
gotoxy(67,2);write(vidas);
ifvidas=0thenbegin
i:=9;{quantidadedeseguntosrestante}
while(i>=0)dobegin
textcolor(red);
gameover;
delay(400);
textcolor(7);{cinzaclaro}
gameover;
delay(600);
i:=i1;
ifkeypressedthen
i:=1;
end;
inicializa;
end;
geratela;
end;
procedureverificaPosicao;{verifcaaposicaodecolisao}
begin
{
write(prim^.x);write('',prim^.y);}
if(cabeca.apont^.x>77)or(cabeca.apont^.x<2)or
(cabeca.apont^.y>23)or(cabeca.apont^.y<5)thenbegin
vidas:=vidas1;
comecarnovamente;
end;
end;

procedurecriaComida;
begin
comidaX:=2+random(77);
comidaY:=5+random(19);
textcolor(12);

{indicaocaracterquerepresentararacomida}
gotoxy(comidaX,comidaY);write(cabeca.corpo[tamanhoc+1]);
end;
procedureatualizaComida;{mostraacomidanatela}
begin
textcolor(12);
{indicaocaracterquerepresentararacomida}
gotoxy(comidaX,comidaY);write(cabeca.corpo[tamanhoC+1]);
end;
proceduremudaDificuldade;
begin
Dificuldade:=Dificuldade+1;
velocidade:=velocidade20divdificuldade;{imprimena
telanointervaloque10milisegundomenorqueoanterior;}
comecarnovamente;
end;

procedureverificacomida;
begin
if(cabeca.apont^.x=comidax)and(cabeca.apont^.y=
comiday)thenbegin
criaComida;
tamanhoc:=tamanhoc+1;
tamanhoCobra(tamanhoc);
pontos:=pontos+10;
iftamanhoc=15then
mudaDificuldade;
end;
end;
proceduremover(a,b:integer);{fazacobrasemoverpara
norte(0,1),}
vari:integer;
{sul(0,1),
leste(1,0)eoeste(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(3);{corazulclarodacobra}
fori:=1totamanhocdobegin{criaacobranatela}
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;
{estalistacircularcomtemoscaractereseaposicaoda
cobra}
listacircular;
tamanhoCobra(tamanhoc);
{esteeolacoprincipaldojogousadoparaidentificar
quais
saoasteclasusadapelojogador}
opc:='a';
while(opc<>'s')dobegin
ifkeypressedthenbegin
opc:=readkey;
{afuncaoordnosfornecequalocodigoascii
datecla,mastemum
problemaquandoojogadorusateclasespecias
tipoassetasdoteclado.
Temqueusarduasvariaveisparaguardaro
codigodessasteclas
especias,observandoqueaprimeiravariavel
sempreficacomovalor0}
opz:=ord(opc);
ifopz=0thenbegin
opx:=opz;
opc:=readkey;
opz:=ord(opc);
if(opz=75)or(opz=77)or(opz=
72)or(opz=80)then
opy:=opz;
end;

{paraquandoaperta'p'ficarempausa}
ifopz=112thenbegin
opc:='a';
opy:=111;
while(opz<>112)do
ifkeypressedthenbegin
opc:=readkey;
opz:=ord(opc);
ifopz=0then
opz:=ord(opc)
end;
end;
ifopz=27then{parausarESCquandoquiser
sairdoprograma}
opc:='s';
end
elsebegin
ifopx=0thenbegin
caseopyof
75:mover(1,0);{movimentra
paraesquerda}
77:mover(1,0);{movimenta
paradireita}

72:mover(0,1);{paracima}
80:mover(0,1);{parabaixo}
1:comecarnovamente;
2:telainicial;}
end;
delay(velocidade);

end;
end;
end;
gotoxy(1,40);
clrscr;
end.

Você também pode gostar