Ir ao conteúdo
  • Cadastre-se

Jogo da velha no pascal, dando erro.


Ana Maria Trzeci

Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
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.

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

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?

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!