Ir ao conteúdo
  • Cadastre-se

Erro lógico nesse algoritmo [Ajuda]


-MarX-

Posts recomendados

Boa Tarde!!!

Estou fazendo jogo da forca como trabalho pra facul, estou com um problema nessa parte do algoritmo da forca, pois ele está entrando no ELSE (e ainda escrevendo a palavra varias vezes e desenhando o boneco quase por completo de uma unica vez) mesmo quando apenas uma tecla é chutada e esta sendo correta. :confused:

O que poderia estar errado? Estou horas aqui, mas ainda nao consegui ver o que pode estar errado.

Segue o código abaixo:

Randomize;

Sorteio:=1 + Random(max); {sorteia um numero no tamanho do vetor}

PalavraSorteada:=palavras[sorteio];

GotoXY(25,6);textcolor(yellow);

write('A palavra sorteada foi:');

GotoXY(25,10);textcolor(white);

For i:= 1 to length(PalavraSorteada) Do

Write(' _ ');

Cont:=6; {chances}

Cont2:=Length(Palavrasorteada);

Repeat

palpite:=Upcase(readkey);

For i:= 1 To length(PalavraSorteada) Do

Begin

If palpite = PalavraSorteada Then {essa parte funciona normal}

Begin

GotoXY(25+3*i-3,10);

write(' ');textcolor(white);

write(palpite, ' ');

cont2:=cont2 - 1;

End

Else {se errar a letra}{ele entra aqui, mesmo palpite estando correto}

Begin

Cont:=Cont - 1;

GotoXY(60,5+i);Textcolor(lightred);Write(' ',palpite,' ');

End;

{Desenha Boneco}

Case Cont Of

5: Begin

GotoXY(13,4);Textcolor(lightred);Write(#1);

End;

4: Begin

GotoXY(13,5);Textcolor(lightred);Write(#179);

GotoXY(13,6);Write(#179);

End;

3: Begin

GotoXY(12,5);Textcolor(lightred);Write(#47);

End;

2: Begin

GotoXY(14,5);Textcolor(lightred);Write(#92);

End;

1: Begin

GotoXY(12,7);Textcolor(lightred);Write(#47);

End;

0: Begin

GotoXY(14,7);Textcolor(lightred);Write(#92);

End;

End; {fim do case}

End; {fim do For}

Until (Cont = 0) or (Cont2 = 0);

Agradeço desde já! :)

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Boa Tarde!!!

Estou fazendo jogo da forca como trabalho pra facul, estou com um problema nessa parte do algoritmo da forca, pois ele está entrando no ELSE (e ainda escrevendo a palavra varias vezes e desenhando o boneco quase por completo de uma unica vez) mesmo quando apenas uma tecla é chutada e esta sendo correta. :confused:

O que poderia estar errado? Estou horas aqui, mas ainda nao consegui ver o que pode estar errado.

Segue o código abaixo:

Randomize;

Sorteio:=1 + Random(max); {sorteia um numero no tamanho do vetor}

PalavraSorteada:=palavras[sorteio];

GotoXY(25,6);textcolor(yellow);

write('A palavra sorteada foi:');

GotoXY(25,10);textcolor(white);

For i:= 1 to length(PalavraSorteada) Do

Write(' _ ');

Cont:=6; {chances}

Cont2:=Length(Palavrasorteada);

Repeat

palpite:=Upcase(readkey);

For i:= 1 To length(PalavraSorteada) Do

Begin

If palpite = PalavraSorteada Then {essa parte funciona normal}

Begin

GotoXY(25+3*i-3,10);

write(' ');textcolor(white);

write(palpite, ' ');

cont2:=cont2 - 1;

End

Else {se errar a letra}{ele entra aqui, mesmo palpite estando correto}

Begin

Cont:=Cont - 1;

GotoXY(60,5+i);Textcolor(lightred);Write(' ',palpite,' ');

End;

{Desenha Boneco}

Case Cont Of

5: Begin

GotoXY(13,4);Textcolor(lightred);Write(#1);

End;

4: Begin

GotoXY(13,5);Textcolor(lightred);Write(#179);

GotoXY(13,6);Write(#179);

End;

3: Begin

GotoXY(12,5);Textcolor(lightred);Write(#47);

End;

2: Begin

GotoXY(14,5);Textcolor(lightred);Write(#92);

End;

1: Begin

GotoXY(12,7);Textcolor(lightred);Write(#47);

End;

0: Begin

GotoXY(14,7);Textcolor(lightred);Write(#92);

End;

End; {fim do case}

End; {fim do For}

Until (Cont = 0) or (Cont2 = 0);

Agradeço desde já! :)

Olá,

1) Bla bla bla bla bla... por favor colequem os códigos entre as tag CODE (botão #) !!!!

Eu não sei para o meus colegas, mas para mim é de suma importância que o código esteja identado (não importa o padrão, mas que pelo menos esteja coerente com a linguagem).

2) Abaixo seu código comentando...


CRT;
BEGIN
Randomize;
Sorteio:=1 + Random(max); {sorteia um numero no tamanho do vetor}
PalavraSorteada:=palavras[sorteio];
GotoXY(25,6); textcolor(yellow);
write('A palavra sorteada foi:');
GotoXY(25,10);textcolor(white);
For i:= 1 to length(PalavraSorteada) Do
Write(' _ ');
Cont:=6; {chances}
Cont2:=Length(Palavrasorteada);
Repeat
palpite:=Upcase(readkey);
For i:= 1 To length(PalavraSorteada) Do
Begin
[COLOR="blue"]textcolor(white);[/COLOR] [COLOR="Blue"]{// precisa atribuir uma vez}[/COLOR]
If palpite = PalavraSorteada[i] Then {essa parte funciona normal}
Begin
GotoXY(25+3*i-3,10);
[COLOR="Red"] {write(' ');textcolor(white);
write(palpite, ' ');}[/COLOR]
[COLOR="Blue"]write(' ',palpite,' ');[/COLOR]
cont2:=cont2 - 1;
End
Else {se errar a letra}{ele entra aqui, mesmo palpite estando correto}
Begin [COLOR="red"]{//O ERRO ESTA AQUI... TEM Q TER UM IF FORA DO FOR!!!!!}[/COLOR]
Cont:=Cont - 1;
GotoXY(60,5+i);Textcolor(lightred);Write(' ',palpite,' ');
End;
{Desenha Boneco}
Case Cont Of [COLOR="red"]{//AQUI OUTRO ERRO... TEM QUE FICAR FORA DO FOR E SER
EXECUTADO SE O CARA NAO ACERTAR}[/COLOR] 5 :Begin
GotoXY(13,4);Textcolor(lightred);Write(#1);
End;
4 :Begin
GotoXY(13,5);Textcolor(lightred);Write(#179);
GotoXY(13,6);Write(#179);
End;
3 :Begin
GotoXY(12,5);Textcolor(lightred);Write(#47);
End;
2 :Begin
GotoXY(14,5);Textcolor(lightred);Write(#92);
End;
1 :Begin
GotoXY(12,7);Textcolor(lightred);Write(#47);
End;
0 :Begin
GotoXY(14,7);Textcolor(lightred);Write(#92);
End;
End; {fim do case}
End; {fim do For}
Until (Cont = 0) or (Cont2 = 0);

uses

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...
Visitante: Maju
 

Aproveitando o tópico,eu tb to tendo problema com a forca, quando existe um letra repetida na palavra, eu nao consigo fazer ele escrever a letra duas vezes...

já tentei varias coisas, e atualmente meu programa tá assim:

*eu imagino que tenha algum erro dentro do repeat, mas isso da pra corrigir depois, se alguem puder me falar como faz pra ele escrever a letra duas vezes já serve ^^

Program forca;
Uses Graph,CRT;
Var gd,gm,i,j,x,a,onde: Integer;
palavra: String[15];
letra: Char;
erro: Byte;
tem: Boolean;
Procedure desenhaforca;
Begin
Bar(20,100,115,110);
Line(60,10,60,110);
Line(60,10,130,10);
Line(130,10,130,30);
End;
Function palavras(n: Byte):String; {sorteia uma palavra}
Var tenta: String[15];
Begin
Case n Of
0: tenta:='VARIAVEL';
1: tenta:='PASCAL';
2: tenta:='PROCEDIMENTO';
3: tenta:='ROTINAS';
4: tenta:='BIBLIOTECA';
5: tenta:='FUNCAO';
6: tenta:='ALGORITMO';
7: tenta:='CONSTANTE';
8: tenta:='TIPOS';
9: tenta:='VETOR';
10: tenta:='MATRIZ';
End;
palavras:=tenta;
End;
Procedure bonequinho(erro:Byte); {desenha o bonequinho conforme o numero de erros}
Begin
Case erro Of
1: Circle(130,35,5);
2: Line(130,40,130,60);
3: Line(130,45,140,55);
4: Line(130,45,120,55);
5: Line(130,60,140,70);
6: Begin
Line(130,60,120,70);
OuttextXY(120,150,'voce perdeu...');
End;
End;
End;

Begin
Detectgraph(gd,gm);
Initgraph(gd,gm,'bgi\');
desenhaforca;
Randomize;
palavra:=palavras(Random(10));
a:=150;
erro:=0;
OuttextXY(200,200,palavra);
For i:=1 To Length(palavra) Do
Begin
OuttextXY(a,105,'_ ');
a:=a+20;
End;
Repeat
letra:=readkey;
tem:=False;
naotem:=False;
palavra2:=palavra;
Repeat {repeat problematico}
For j:=1 To Length(palavra2) Do
If Upcase(letra)=palavra2[j] Then
Begin
tem:=True;
onde:=j;
j:=Length(palavra2);
Delete(1,onde,palavra2);
End
Else
naotem:=True;
If tem=True Then
Begin
x:=150+((onde-1)*20);
OuttextXY(x,105,letra);
End;
Until naotem;
If tem=False Then {eu imagino que ele acabe contando mais erros do que deveria}
Begin {dava pra da uma olhada nisso tb?}
erro:=erro+1;
bonequinho(erro);
End;
Until letra=#27;
End.

Se a ajuda puder ser rapida, facilita minha vida ^^

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Aproveitando o tópico,eu tb to tendo problema com a forca, quando existe um letra repetida na palavra, eu nao consigo fazer ele escrever a letra duas vezes...

já tentei varias coisas, e atualmente meu programa tá assim:

*eu imagino que tenha algum erro dentro do repeat, mas isso da pra corrigir depois, se alguem puder me falar como faz pra ele escrever a letra duas vezes já serve ^^


Uses Graph,CRT;
Var gd,gm,i,j,x,a,onde: Integer;
palavra: String[15];
letra: Char;
erro: Byte;
tem: Boolean;
Procedure desenhaforca;
Begin
Bar(20,100,115,110);
Line(60,10,60,110);
Line(60,10,130,10);
Line(130,10,130,30);
End;
Function palavras(n: Byte):String; {sorteia uma palavra}
Var tenta: String[15];
Begin
Case n Of
0: tenta:='VARIAVEL';
1: tenta:='PASCAL';
2: tenta:='PROCEDIMENTO';
3: tenta:='ROTINAS';
4: tenta:='BIBLIOTECA';
5: tenta:='FUNCAO';
6: tenta:='ALGORITMO';
7: tenta:='CONSTANTE';
8: tenta:='TIPOS';
9: tenta:='VETOR';
10: tenta:='MATRIZ';
End;
palavras:=tenta;
End;
Procedure bonequinho(erro:Byte); {desenha o bonequinho conforme o numero de erros}
Begin
Case erro Of
1: Circle(130,35,5);
2: Line(130,40,130,60);
3: Line(130,45,140,55);
4: Line(130,45,120,55);
5: Line(130,60,140,70);
6: Begin
Line(130,60,120,70);
OuttextXY(120,150,'voce perdeu...');
End;
End;
End;

Begin
Detectgraph(gd,gm);
Initgraph(gd,gm,'bgi\');
desenhaforca;
Randomize;
palavra:=palavras(Random(10));
a:=150;
erro:=0;
OuttextXY(200,200,palavra);
For i:=1 To Length(palavra) Do
Begin
OuttextXY(a,105,'_ ');
a:=a+20;
End;
Repeat
letra:=readkey;
tem:=False;
naotem:=False;
palavra2:=palavra;
Repeat {repeat problematico}
For j:=1 To Length(palavra2) Do
If Upcase(letra)=palavra2[j] Then
Begin
tem:=True;
onde:=j;
j:=Length(palavra2);
Delete(1,onde,palavra2);
End
Else
naotem:=True;
If tem=True Then
Begin
x:=150+((onde-1)*20);
OuttextXY(x,105,letra);
End;
Until naotem;
If tem=False Then {eu imagino que ele acabe contando mais erros do que deveria}
Begin {dava pra da uma olhada nisso tb?}
erro:=erro+1;
bonequinho(erro);
End;
Until letra=#27;
End.
Program forca;

Se a ajuda puder ser rapida, facilita minha vida ^^

Olá

Fiz algumas alterações no código... só não deu pra testar, já que não sei usar a unit Graph.tpu!!! :mad:

PROGRAM
forca;
Uses
Graph, CRT;
Var
gd,gm,i,j,x,a,onde: Integer;
palavra,
palavra2 : String[15];
letra : Char;
erro : Byte;
tem : Boolean;

[B]{naoTem :boolean;} {//só precisa do tem!!}[/B]

Procedure desenhaforca;
Begin
Bar(20,100,115,110);
Line(60,10,60,110);
Line(60,10,130,10);
Line(130,10,130,30);
End;

Function palavras(n: Byte):String; {sorteia uma palavra}
Var
tenta : String[15];
Begin
Case n Of
0 :tenta:='VARIAVEL';
1 :tenta:='PASCAL';
2 :tenta:='PROCEDIMENTO';
3 :tenta:='ROTINAS';
4 :tenta:='BIBLIOTECA';
5 :tenta:='FUNCAO';
6 :tenta:='ALGORITMO';
7 :tenta:='CONSTANTE';
8 :tenta:='TIPOS';
9 :tenta:='VETOR';
10 :tenta:='MATRIZ';
End;
palavras:=tenta;
End;

Procedure bonequinho(erro:Byte); {desenha o bonequinho conforme o numero de erros}
Begin
Case erro Of
1 :Circle(130,35,5);
2 :Line(130,40,130,60);
3 :Line(130,45,140,55);
4 :Line(130,45,120,55);
5 :Line(130,60,140,70);
6 :Begin
Line(130,60,120,70);
OuttextXY(120,150,'voce perdeu...');
End;
End;
End;

BEGIN
Detectgraph(gd,gm);
Initgraph(gd,gm,'bgi\');
desenhaforca;

Randomize;
palavra:=palavras(Random(10));
a:=150;
erro:=0;
OuttextXY(200,200,palavra);
For i:=1 To Length(palavra) Do
Begin
OuttextXY(a,105,'_ ');
a:=a+20;
End;
Repeat
letra:=readkey;
tem:=False;
[B]{naotem:=False;} {//nao precisa}[/B]
palavra2:=palavra;
[B]{Repeat} {//nao precisa}[/B] {repeat problematico}
For j:=1 To Length(palavra2) Do
If Upcase(letra)=palavra2[j] Then
Begin
tem:=True;
onde:=j;
j:=Length(palavra2);
Delete(palavra2,onde,1);
[B]{//trecho que estava em baixo}[/B]
{If tem=True Then
Begin}
x:=150+((onde-1)*20);
OuttextXY(x,105,letra);
{End;}
[B]{//}[/B]
End;
[COLOR="Red"] (*
Else
naotem:=True;
[B]//aqui tem um erro de ligica, já inevitavelmente vai cair, já q ta[/B]
olhando letra por letra.
*)[/COLOR]
[COLOR="Red"] (*
If tem=True Then
Begin
x:=150+((onde-1)*20);
OuttextXY(x,105,letra);
End;
[B]//Experimente deixando dentro do for[/B]
*)[/COLOR]
[B]{Until naotem;} {//nao precisa}[/B]

If tem=False Then {eu imagino que ele acabe contando mais erros do que}
Begin {deveria. dava pra da uma olhada nisso tb?}
erro:=erro+1;
bonequinho(erro); [B]{//acho que a logica do erro esta certa... [Simon]}[/B]
End;
Until letra=#27; {sai com ESC}
End.

No aguardo.

Link para o comentário
Compartilhar em outros sites

Visitante: Maju
 

aeww! funciono!

valeu mesmo!

só mais uma duvida, nd a ver com a logica, mas como se faz pra abri uma janela no jogo?

tipo, queria abrir uma janela quando a pessoa digitasse a ajuda(no meu caso F1)

^^

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
aeww! funciono!

valeu mesmo!

só mais uma duvida, nd a ver com a logica, mas como se faz pra abri uma janela no jogo?

tipo, queria abrir uma janela quando a pessoa digitasse a ajuda(no meu caso F1)

^^

Olá,

Em relação a abrir uma janela eu não sei, já que nunca mexi em nada da parte gráfica no Pascal.

Mas o código para a tecla F1 é "#59".

Ex. de uso:

tecla:=ReadKey;
if tecla = '#59' then
abreAjuda();

Abaixo uma relação com outras teclas...

const {Codigo ASCII de Teclas}
F1=#59; F2=#60; F3=#61; F4=#62; F5=#63; F6=#64;
F7=#65; F8=#66; F9=#67; F10=#68; F11=#69; F12=#70;
ENTER=#13; ESC=#27; BACKSPACE=#8; TABE =#9; ESPACO=' ';
SetaCima=#72; SetaBaixo=#80; SeteEsqueda=#75; SetaDireita=#77;

Usando esse conceito de constante, o ex. anterior poderia ficar assim.

uses 
CRT;
const
F1=#59;
var
tecla :char;
BEGIN
.
.
tecla:=ReadKey;
if tecla = F1 then
abreAjuda();
.
.
END.

Abraços

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!