Ir ao conteúdo
  • Cadastre-se
Ana Maria Trzeci

Jogo da velha no pascal, dando erro.

Recommended Posts

Oi pessoal, sera que alguem poderia me ajudar. Fiz um jogo da velha no pascal, ele esta compilando e tudo, mas ele não mostra quem ganhou. E se mostra, mostra errado.

Meu codigo é esse:


uses crt;
type tabuleiro = record
pos:array[1..3,1..3] of char;
usado:array[1..3,1..3] of boolean;
end;
var t1:tabuleiro;
i,j,x,vez:integer;
op,j1,pc:char;
vitoria,acabou:boolean;
procedure iniciar;
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
t1.pos[i,j]:= ' ';
t1.usado[i,j]:= false;
end;
randomize;
vez:= random(30000) mod 2;
vitoria:=false;
acabou:= false;
end;
procedure escolher;
var nro:integer;
begin
repeat
clrscr;
writeln('Jogador 1');
writeln('Escolha X ou O');
writeln('1 = X');
writeln('2 = O');
writeln('Digite 1 para X ou 2 para O');
readln(nro);
if (nro = 1)
then begin
j1:='X';
pc:='O';
end
else begin
j1:='O';
pc:='X';
end;
until (nro = 1) or (nro = 2);
end;
procedure mostrar;
begin
clrscr;
writeln;
writeln('TABULEIRO');
writeln;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
write(' | ',t1.pos[i,j],' | ');
end;
writeln;
end;
writeln;
end;
procedure jogar_p1;
var l,c:integer;
ok:boolean;
begin
mostrar;
if (not vitoria) or (not acabou)
then
repeat
writeln('Vez do Jogador 1 = ',j1);
writeln('Onde você deseja jogar?');
writeln('Digite a linha (1, 2 ou 3):');
readln(l);
writeln('Onde você deseja jogar?');
writeln('Digite a coluna (1, 2 ou 3):');
readln(c);
if not t1.usado[l,c]
then begin
t1.usado[l,c]:= true;
ok:=true;
t1.pos[l,c]:= j1;
end
else begin
ok:=false;
end;
until (ok);
end;
procedure jogar_pc;
var ok:boolean;
a,b:integer;
begin
mostrar;
if (not vitoria) or (not acabou)
then
repeat
writeln('Vez do Computador = ',pc);
randomize;
a:= (random(32000) mod 3) + 1;
randomize;
b:= (random(32000) mod 3) + 1;
if not t1.usado[a,b]
then begin
t1.usado[a,b]:= true;
ok:= true;
t1.pos[a,b]:= pc;
end
else begin
ok:=false;
end;
until (ok);
end;
procedure testar;
begin
//linha
i:=1;
repeat //for i:=1 to 3 do
//begin
x:= 1;
if (t1.pos[i,1] = t1.pos[i,2] ) and (t1.pos[i,2] = t1.pos[i,3]) and (t1.pos[i,1] <> ' ')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[i,1]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
inc(i);
until (i = 4) or vitoria; //end;
//coluna
i:=1;
repeat //for i:=1 to 3 do
//begin
x:= 1;
if (t1.pos[1,i] = t1.pos[2,i] ) and (t1.pos[2,i] = t1.pos[3,i]) and (t1.pos[1,i] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[1,i]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
inc(i);
until (i = 4) or vitoria; //end;
//diagonal
if (t1.pos[1,1] = t1.pos[2,2]) and (t1.pos[2,2] = t1.pos[3,3]) and (t1.pos[2,2] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[2,2]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
if (t1.pos[1,3] = t1.pos[2,2]) and (t1.pos[2,2] = t1.pos[3,1]) and (t1.pos[2,2] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[2,2]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
end;
Begin
repeat
iniciar;
escolher;
mostrar;
if (vez = 0)
then begin
if (not acabou) or (not vitoria) then begin
jogar_p1;
x:=1;
repeat //for x:=1 to 4 do
//begin
mostrar;
jogar_pc;
mostrar;
jogar_p1;
mostrar;
testar;
inc(x);
acabou:= x = 5;
until (x = 5) or vitoria or acabou; //end;
end;
end
else begin
if (not acabou) or (not vitoria) then begin
jogar_pc;
x:=1;
repeat //for x:=1 to 4 do
//begin
mostrar;
jogar_p1;
mostrar;
jogar_pc;
mostrar;
testar;
inc(x);
acabou:= x = 5;
until (x = 5) or vitoria or acabou; //end;
end;
end;
writeln('Deseja jogar novamente?');
readln(op);
op:= upcase(op);
until (op = 'N');
End.
Program Pzim ;

Onde esta o erro ?

Obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Oi pessoal, sera que alguem poderia me ajudar. Fiz um jogo da velha no pascal, ele esta compilando e tudo, mas ele não mostra quem ganhou. E se mostra, mostra errado.

Meu codigo é esse:


uses crt;
type tabuleiro = record
pos:array[1..3,1..3] of char;
usado:array[1..3,1..3] of boolean;
end;
var t1:tabuleiro;
i,j,x,vez:integer;
op,j1,pc:char;
vitoria,acabou:boolean;
procedure iniciar;
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
t1.pos[i,j]:= ' ';
t1.usado[i,j]:= false;
end;
randomize;
vez:= random(30000) mod 2;
vitoria:=false;
acabou:= false;
end;
procedure escolher;
var nro:integer;
begin
repeat
clrscr;
writeln('Jogador 1');
writeln('Escolha X ou O');
writeln('1 = X');
writeln('2 = O');
writeln('Digite 1 para X ou 2 para O');
readln(nro);
if (nro = 1)
then begin
j1:='X';
pc:='O';
end
else begin
j1:='O';
pc:='X';
end;
until (nro = 1) or (nro = 2);
end;
procedure mostrar;
begin
clrscr;
writeln;
writeln('TABULEIRO');
writeln;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
write(' | ',t1.pos[i,j],' | ');
end;
writeln;
end;
writeln;
end;
procedure jogar_p1;
var l,c:integer;
ok:boolean;
begin
mostrar;
if (not vitoria) or (not acabou)
then
repeat
writeln('Vez do Jogador 1 = ',j1);
writeln('Onde você deseja jogar?');
writeln('Digite a linha (1, 2 ou 3):');
readln(l);
writeln('Onde você deseja jogar?');
writeln('Digite a coluna (1, 2 ou 3):');
readln(c);
if not t1.usado[l,c]
then begin
t1.usado[l,c]:= true;
ok:=true;
t1.pos[l,c]:= j1;
end
else begin
ok:=false;
end;
until (ok);
end;
procedure jogar_pc;
var ok:boolean;
a,b:integer;
begin
mostrar;
if (not vitoria) or (not acabou)
then
repeat
writeln('Vez do Computador = ',pc);
randomize;
a:= (random(32000) mod 3) + 1;
randomize;
b:= (random(32000) mod 3) + 1;
if not t1.usado[a,b]
then begin
t1.usado[a,b]:= true;
ok:= true;
t1.pos[a,b]:= pc;
end
else begin
ok:=false;
end;
until (ok);
end;
procedure testar;
begin
//linha
i:=1;
repeat //for i:=1 to 3 do
//begin
x:= 1;
if (t1.pos[i,1] = t1.pos[i,2] ) and (t1.pos[i,2] = t1.pos[i,3]) and (t1.pos[i,1] <> ' ')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[i,1]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
inc(i);
until (i = 4) or vitoria; //end;
//coluna
i:=1;
repeat //for i:=1 to 3 do
//begin
x:= 1;
if (t1.pos[1,i] = t1.pos[2,i] ) and (t1.pos[2,i] = t1.pos[3,i]) and (t1.pos[1,i] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[1,i]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
inc(i);
until (i = 4) or vitoria; //end;
//diagonal
if (t1.pos[1,1] = t1.pos[2,2]) and (t1.pos[2,2] = t1.pos[3,3]) and (t1.pos[2,2] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[2,2]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
if (t1.pos[1,3] = t1.pos[2,2]) and (t1.pos[2,2] = t1.pos[3,1]) and (t1.pos[2,2] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[2,2]);
writeln('Presione qualquer tecla para continuar...');
readkey;
end;
end;
Begin
repeat
iniciar;
escolher;
mostrar;
if (vez = 0)
then begin
if (not acabou) or (not vitoria) then begin
jogar_p1;
x:=1;
repeat //for x:=1 to 4 do
//begin
mostrar;
jogar_pc;
mostrar;
jogar_p1;
mostrar;
testar;
inc(x);
acabou:= x = 5;
until (x = 5) or vitoria or acabou; //end;
end;
end
else begin
if (not acabou) or (not vitoria) then begin
jogar_pc;
x:=1;
repeat //for x:=1 to 4 do
//begin
mostrar;
jogar_p1;
mostrar;
jogar_pc;
mostrar;
testar;
inc(x);
acabou:= x = 5;
until (x = 5) or vitoria or acabou; //end;
end;
end;
writeln('Deseja jogar novamente?');
readln(op);
op:= upcase(op);
until (op = 'N');
End.
Program Pzim ;

Onde esta o erro ?

Obrigada.

Olá.

Vamos lá:

1) Só precisa chamar o Radomize 1 vez. Sugiro colocar logo abaixo do begin principal;

2) Para calcular a jogada do computador, você está utilizando de 3 possibilidades (para cada coordenada), mas está colocando um número não múltiplo de 3 no Ramdon (32000), ou seja, apesar de ser praticamente insignificante, está ocorrendo um desequilíbrio (consideraria um erro de lógica).

3) Não está aparecendo o processo de escolha do computador. Uma forma interessante seria usar o Delay().

4) "Jogo da velha" é um jogo de "Estratégia", e não de "sorte", ou seja, a jogada do computador não deveria ser simplesmente aleatória. (mas não deixa de ser válido e interessante).

5) Vou tentar ajudar a você mesmo encontrar o erro:

Como o jogo está dando um vencedor errado ou antes da hora, logo a primeira coisa que você pode verificar é onde está esse erro... em que trecho do código está verificando se ganhou (qual procedimento)? em qual parte exatamente está ocorrendo um erro... (o verificador está com erros - ou tem erros na verificação em si, ou tem erro nos valores usados).

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

if (t1.pos[1,3] = t1.pos[2,2]) and (t1.pos[2,2] = t1.pos[3,1]) and (t1.pos[2,2] <> '0')
then begin
vitoria:=true;
writeln('GANHADOR = ',t1.pos[2,2]);
writeln('Presione qualquer tecla para continuar...');
readkey;

Pra q isso?

Outra coisa: Eu vi muitos "//" no seu código. Retire o máximo deles... Deixe apenas o que especificarem alguma coisa para compreensão futura do texto... Por exemplo: "//Isso faz aquilo" ; "// isso diz quem ganhou"

Segundo meus estudos isso não se escreve assim:

if (not acabou) or (not vitoria) then

Se escreve assim

if not(acabou) or not(vitoria) then

Ou, nunca trabalhei com booleanas, mas acredito que essa parte não é o problema, já que ele compilou certinho.

Qual teu compilador? Dev-pascal?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×