FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 754.089 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 23-02-2006, 22:31   #1 (permalink)
Hellsing
Novo Membro
 
Registrado em: Sep 2004
Localização: Juiz de Fora - MG
Mensagens: 145
Reputação: 16 Hellsing está indo no caminho certo
Enviar mensagem via ICQ para Hellsing
Padrão Jogo da forca em Pascal - duvida na logica

Olá amigos. A 'fessora pediu pra montar um programa em pascal que simule um jogo da forca. Tem uma lista já pré-montada de palavras pra pessoa escolher às cegas, só pra ela não ter que digitar uma palavra antes. Até aí tudo bem, mas acontece que na segunda estrutura de repetição, mesmo que eu digite a palavra e acerte, não me mostra a mensagem de vitória. Invariavelmente ele espera chegar até um número de tentativas igual a zero pra sair e me mostrar a mensagem de "You Lose !!!" ^_^

O programa é esse ae:

Código:
program Forca; uses crt; var bancoStrings: array [1..10] of String; palavraCerta, palavraParcial :String; tentativa :Char; qtdTentativas, X, opc :Integer; //------------------------------------------------------------------------------ begin bancoStrings[1] := 'macaco'; bancoStrings[2] := 'caminhao'; bancoStrings[3] := 'informatica'; bancoStrings[4] := 'banco'; bancoStrings[5] := 'onibus'; bancoStrings[6] := 'mico-leao'; bancoStrings[7] := 'computador'; bancoStrings[8] := 'criptografia'; bancoStrings[9] := 'psicologia'; bancoStrings[10] := 'juiz de fora'; qtdTentativas := 8; repeat writeln; writeln (' Jogo da Forca'); writeln; write (' Digite de 1 a 10 para escolher uma palavra: '); readln (opc); until (opc >= 1) or (opc <= 10); palavraCerta := bancoStrings[opc]; for X := 0 to Length(palavraCerta) do begin if (palavraCerta[X] = ' ') then palavraParcial[X] := ' ' else if (palavraCerta[X] = '-') then palavraParcial[X] := '-' else palavraParcial[X] := '@'; end; repeat ClrScr; writeln; writeln (palavraParcial); writeln; if (palavraParcial <> palavraCerta) and (qtdTentativas > 0) then begin Writeln (' Voce tem ', qtdTentativas, ' tentativas restantes.'); Write (' Digite uma letra (letra minuscula): '); tentativa := readkey; if Pos(tentativa, palavraParcial) = 0 then begin for X := 0 to Length(palavraCerta) do begin if (tentativa = palavraCerta[X]) then begin palavraParcial[X] := tentativa; end else if Pos(tentativa, palavraCerta) = 0 then begin qtdTentativas := qtdTentativas - 1; Break; end; end end else qtdTentativas := qtdTentativas - 1; end else if (palavraParcial <> palavraCerta) and (qtdTentativas = 0) then begin Writeln (' Voce perdeu, tente novamente.'); Readln; Exit; end else if (palavraParcial = palavraCerta) then begin Writeln (' Parabens, voce acertou a palavra.'); Readln; Exit; end; until (tentativa = Chr(27)) or (palavraParcial = palavraCerta); { Executa até o pressionamento do ESC ou as palavras serem iguais } end.
Tipo... eu mesmo que estou desenvolvendo, não é cópia de ninguém, mas chegou nessa parte da lógica do programa que eu mesmo não estou conseguindo ver onde errei, ou o que falta, sacaram ?! Alguém que conseguir ver o erro, por favor, me avise... isso já está me tirando o sono.
8O 8O
Estou desenvolvendo-o em Dev-Pas.


Falow...

Hellsing
__________________
"Conhecimento e força dão poder, mas só o caráter granjeia respeito"
Bruce Lee
Hellsing está offline   Responder com Quote
Antigo 24-02-2006, 12:56   #2 (permalink)
colinzeal
Membro Senior
 
Registrado em: Apr 2004
Mensagens: 166
Reputação: 16 colinzeal está indo no caminho certo
Padrão

na minha opinião essa parte do código tá meio estranha:

Código:
if Pos(tentativa, palavraParcial) = 0 then begin for X := 0 to Length(palavraCerta) do begin if (tentativa = palavraCerta[X]) then begin palavraParcial[X] := tentativa; end else if Pos(tentativa, palavraCerta) = 0 then begin qtdTentativas := qtdTentativas - 1; Break; end; end end else qtdTentativas := qtdTentativas - 1;
eu modifiquei um pouco (sem compilar nada, tirando da minha cabeça):

Código:
{ verificando se a tentativa já foi feita antes e acertada } if Pos(tentativa, palavraParcial) = 0 then begin { verificando se a tentativa está na palavra correta } if Pos(tentativa, palavraCerta) > 0 then begin { se estiver, substitui as letras } for X := 0 to Length(palavraCerta) do if (tentativa = palavraCerta[X]) then palavraParcial[X] := tentativa; end else begin { se não, tira uma tentativa } qtdTentativas := qtdTentativas - 1; end; end else begin writeln('Você já tentou essa letra!'); readln; exit; end;
repare que eu nem lembro como é o comentário de uma linha no pascal... eehhe não lembro se era // ... é, né?
colinzeal está offline   Responder com Quote
Antigo 25-02-2006, 14:29   #3 (permalink)
DCNunes
Veterano
 
Avatar de DCNunes
 
Registrado em: Jan 2003
Localização: Juiz de Fora-MG
Mensagens: 1.341
Reputação: 81 DCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputaçãoDCNunes tem uma fabulosa reputação
Padrão

Vou só dar uma dica: em Pascal, o primeiro elemento de uma variável do tipo "string" é usado para armazenar a quantidade de caracteres que a variável possui no momento (não confundir com a quantidade de memória ocupada pela variável). Sendo "s" uma variável do tipo string, s[0] contém a quantidade de caracteres dessa string. Atribuindo:
Código:
s := 'abc';
, s[1] contém 'a', s[2] contém 'b', s[3] contém 'c' e s[0] contém #3.

Para comprovar, testa esse código:
Código:
program tam_str; var s : string; t : byte absolute s; begin repeat write('digite uma string: '); readln(s); writeln('Numero de caracteres: ',t); writeln; until t = 0; end.
Eu declarei uma varável t no mesmo endereço de s[0]. Imprimindo s[0], se imprime um caracter. Imprimindo t, se imprime um inteiro.
DCNunes está offline   Responder com Quote
Antigo 25-02-2006, 18:12   #4 (permalink)
Hellsing
Novo Membro
 
Registrado em: Sep 2004
Localização: Juiz de Fora - MG
Mensagens: 145
Reputação: 16 Hellsing está indo no caminho certo
Enviar mensagem via ICQ para Hellsing
Padrão

Uhn... não sabia dessa não. Vou ter que analisar novamente o código.

E valew colinzeal, mas infelizmente o erro persiste !!


SE eu conseguir encontrar o erro, posto aqui. É interessante...

Valew amigos !!!


Falow...

Hellsing
__________________
"Conhecimento e força dão poder, mas só o caráter granjeia respeito"
Bruce Lee
Hellsing está offline   Responder com Quote
Antigo 25-02-2006, 20:15   #5 (permalink)
jackinabox
Veterano
 
Avatar de jackinabox
 
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16 jackinabox está indo no caminho certo
Padrão

Isso aqui, por exemplo, não é a causa do problema, mas está errado:
Código:
until (opc >= 1) or (opc <= 10);
Esse or deveria ser um and.
__________________
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox está offline   Responder com Quote
Antigo 26-02-2006, 20:24   #6 (permalink)
Hellsing
Novo Membro
 
Registrado em: Sep 2004
Localização: Juiz de Fora - MG
Mensagens: 145
Reputação: 16 Hellsing está indo no caminho certo
Enviar mensagem via ICQ para Hellsing
Padrão

Citação:
Postado Originalmente por jackinabox
Isso aqui, por exemplo, não é a causa do problema, mas está errado:
[code]
until (opc >= 1) or (opc ...
É... realmente...
O REPEAT é executado enquanto a expressão for falsa. Se por exemplo eu digitar 11, ele para de executar e dá resultado errado.
Valew...

Mas o programa ainda está dando erro. :-/
Tou tentando resolver essa parada...


Falow...

Hellsing
__________________
"Conhecimento e força dão poder, mas só o caráter granjeia respeito"
Bruce Lee
Hellsing está offline   Responder com Quote
Antigo 27-02-2006, 14:21   #7 (permalink)
jqueiroz
Highlander
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778 jqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputação
Padrão

sugestão: use o tipo primitivo do Pascal 'set'. Um set é um conjunto não ordenado de elementos de um tipo escalar.

Ex.:
Código:
var tentativas : set of char;
As operações que te interessam em um 'set' são 'pertinência' (elemento pertence ao set???) e 'inclusão' (set <- elemento).

Assim vc pode fazer

Código:
tentativas := tentativas + letra
e também

Código:
if letra in tentativas then begin println('Você já tentou essa letra!!!'); (...)
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Antigo 02-03-2006, 14:46   #8 (permalink)
Hellsing
Novo Membro
 
Registrado em: Sep 2004
Localização: Juiz de Fora - MG
Mensagens: 145
Reputação: 16 Hellsing está indo no caminho certo
Enviar mensagem via ICQ para Hellsing
Padrão

Olá amigos. Muito obrigado pela atenção dispendida com esse meu problema. Eu fiquei tentando conciliar as idéias indicadas com o que eu havia feito, e talvez por inépcia minha eu não tenha conseguido conciliar as idéias. Assim sendo, praticamente recomecei o projeto, mas segui por um pensamento ligeiramente diferente ao que eu havia iniciado anteriormente. Aí está o código completo e funcional.

Código:
program Forca; uses crt; var bancoStrings: array [1..10] of String; palavraCerta, palavraParcial:String; tentativa :Char; qtdTentativas, X, opc :Integer; acertouPalavra: Boolean; //------------------------------------------------------------------------------ begin bancoStrings[1] := 'macaco'; bancoStrings[2] := 'caminhao'; bancoStrings[3] := 'informatica'; bancoStrings[4] := 'banco'; bancoStrings[5] := 'onibus'; bancoStrings[6] := 'mico-leao'; bancoStrings[7] := 'computador'; bancoStrings[8] := 'criptografia'; bancoStrings[9] := 'psicologia'; bancoStrings[10] := 'juiz de fora'; qtdTentativas := 8; repeat writeln; writeln (' Jogo da Forca'); writeln; write (' Digite de 1 a 10 para escolher uma palavra: '); readln (opc); until (opc >= 1) and (opc <= 10); palavraCerta := bancoStrings[opc]; for X := 0 to Length(palavraCerta) do begin if (palavraCerta[X] = ' ') then palavraParcial[X] := ' ' else if (palavraCerta[X] = '-') then palavraParcial[X] := '-' else palavraParcial[X] := '@'; end; repeat ClrScr; writeln; writeln (' ',palavraParcial); writeln; acertouPalavra := true; //inicio dizendo que a pessoa acertou a palavra for X := 1 to Length (palavraCerta) do if palavraParcial[X] = '@' then acertouPalavra := false; if acertouPalavra = true then begin writeln (' Parabens, voce acertou a palavra.'); readln; break; end else if qtdTentativas > 0 then begin writeln (' Voce tem ', qtdTentativas, ' tentativas restantes.'); write (' Digite uma letra (letra minuscula): '); tentativa := readkey; if Pos(tentativa, palavraParcial) = 0 then for X := 1 to Length(palavraCerta) do begin if (palavraCerta[X] = tentativa) then begin palavraParcial[X] := tentativa; end else if Pos(tentativa, palavraCerta) = 0 then begin qtdTentativas := qtdTentativas - 1; break; end; end else qtdTentativas := qtdTentativas - 1; end else begin writeln (' Voce perdeu, tente novamente.'); readln; break; end; until tentativa = Chr(27); end.

Falow...

Hellsing
__________________
"Conhecimento e força dão poder, mas só o caráter granjeia respeito"
Bruce Lee
Hellsing está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 0:42.