[VB6] AJUDA jogo da forca

filipemm

Power Member
Boas ppl...
Ainda sou muito noob no VB mas tenho um trabalho (jogo da forca) para fazer e estou com uma pequena dúvida.
O jogo começa com o pedido do tema e da palavra. Depois, aparece um form com underscores para dizer o número de letras da palavra e o utilizador, para adivinhar a palavra, tem que inserir uma letra numa caixa de texto desse mesmo form.
Ora bem, a minha dúvida é como é que eu testo se a letra que ele inseriu está na palavra e se estiver como é que eu substituo o underscore relativo a essa letra na palavra na devida posição.

P.S. peço que respondam com métodos simples, pois ainda não percebo muito disto.

Obrigado a todos...
 
Boas!

Não te vou dar código, pois nem tenho o VB instalado no pc nem me recordo decor da sua sintaxe.., portanto vai um pouco de algoritmia que só te faz bem :P

A forma de verificares se uma letra existe numa string é simples, das duas uma, ou usas funcionalidades (que existem em VB) de verificar se uma sub-cadeira (neste caso um caracter) está presente numa string ou então metes essa string num array de caracteres e percorres o mesmo com um simples ciclo com comparações lá dentro.

Sobre a parte visual, recomendaria-te labels, labels indexadas, com o mesmo nome mas com identificadores diferentes. Dessa forma controlas bem melhor o que estás a alterar, assim basta-te alterar a propriedade caption (salvo erro é caption) do indice correspondente à posição da letra.

Agora vê qual a melhor forma ;) Sinceramente, eu iria para o array de caracteres, visto que tens de fazer o ciclo alteravas logo o caption da label ao mesmo tempo ;)

abraços, HecKel
 
Boas!

Não te vou dar código, pois nem tenho o VB instalado no pc nem me recordo decor da sua sintaxe.., portanto vai um pouco de algoritmia que só te faz bem :P

A forma de verificares se uma letra existe numa string é simples, das duas uma, ou usas funcionalidades (que existem em VB) de verificar se uma sub-cadeira (neste caso um caracter) está presente numa string ou então metes essa string num array de caracteres e percorres o mesmo com um simples ciclo com comparações lá dentro.

Sobre a parte visual, recomendaria-te labels, labels indexadas, com o mesmo nome mas com identificadores diferentes. Dessa forma controlas bem melhor o que estás a alterar, assim basta-te alterar a propriedade caption (salvo erro é caption) do indice correspondente à posição da letra.

Agora vê qual a melhor forma ;) Sinceramente, eu iria para o array de caracteres, visto que tens de fazer o ciclo alteravas logo o caption da label ao mesmo tempo ;)

abraços, HecKel

Desde já obrigado pelas ideias.
Já tenho cada letra da palavra que o utilizador insere associada a uma posição de um array redimensionável
Mas o que eu queria mesmo era que o programa reconhecesse a letra que o user introduz e depois testasse se essa está na palavra anteriormente inserida e, se estivesse, substituísse os underscores na posição pela letra em questão. Isto tudo só numa label.
Achas possível?
 
Boas!

Não te vou dar código, pois nem tenho o VB instalado no pc nem me recordo decor da sua sintaxe.., portanto vai um pouco de algoritmia que só te faz bem :P

A forma de verificares se uma letra existe numa string é simples, das duas uma, ou usas funcionalidades (que existem em VB) de verificar se uma sub-cadeira (neste caso um caracter) está presente numa string ou então metes essa string num array de caracteres e percorres o mesmo com um simples ciclo com comparações lá dentro.

Sobre a parte visual, recomendaria-te labels, labels indexadas, com o mesmo nome mas com identificadores diferentes. Dessa forma controlas bem melhor o que estás a alterar, assim basta-te alterar a propriedade caption (salvo erro é caption) do indice correspondente à posição da letra.

Agora vê qual a melhor forma ;) Sinceramente, eu iria para o array de caracteres, visto que tens de fazer o ciclo alteravas logo o caption da label ao mesmo tempo ;)

abraços, HecKel
Exactamente :)

Já a parte "técnica" :P :
- InStr(1, "The quick brown fox jumps over the lazy dog", "o") retorna 13.
Dentro da string "The quick brown fox jumps over the lazy dog", iniciando na posição 1, onde é que encontramos a letra "o"? Na posição 13 :) confirma!
- InStr(14, "The quick brown fox jumps over the lazy dog", "o") retorna 18.
Agora queremos saber qual é o "o" seguinte àquele. Está na posição 18!
- InStr(19, "The quick brown fox jumps over the lazy dog", "o") retorna 27.
E agora procuramos um terceiro "o". Posição 27. Conta os caracteres e confirma ;)
- InStr(28, "The quick brown fox jumps over the lazy dog", "o") retorna 42.
Mais um "o" na posição 42.
- InStr(43, "The quick brown fox jumps over the lazy dog", "o") retorna 0.
Acabaram-se os "o"s.

Para encontrares a letra escolhida pelo utilizador, e se ainda não tiveres práctica com arrays, podes usar um ciclo que verifica onde se encontra esse caracter na string. Cada vez que retornar um valor >0, existe na posição retornada (e é nela que escreves o caracter). Se à primeira, não existir nenhum caracter (InStr = 0), então é uma letra que não consta da palavra.

Não sei se me fiz entender, mas se precisares de mais ajuda, diz-me onde para eu me tentar fazer perceber ;)

O meu conselho é semelhante ao do HecKel, uma array de labels, e uma array de caracteres. Ou, se não tiveres práctica com arrays, usa apenas um label e uma string ;)

edit - já vi que sabes trabalhar com arrays, e tens uma nova dúvida.
Quanto à tua questão, eu diria que (quase) tudo é possível na programação ;) e o que pedes não é excepção.

Quanto a reconhecer a letra introduzida, podes fazer um ciclo entre a primeira e a última variável da array, e em cada uma (que deve corresponder a um caractere), comparas com a letra (ou, para não haverem problemas upper/lowercase, comparas o UCase(array(índice)) com o UCase(letra_do_utilizador) ).
Para comparares na label, pensa da seguinte forma: na array, o índice corresponde a cada variável no interior da mesma, certo? Então, quando o índice é 5 (aconselho-te vivamente a usar Option Base 1, para evitares confusões), o caractere introduzido pelo utilizador está na posição 5. Nesse caso, "pegas" nos primeiros 4 caracteres do label, acrescentas o caractere escolhido pelo utilizador, e acrescentas os caracteres todos a partir da posição 6 (1-4, <encontrado>, 6-fim).

E agora acho que consegui ser igualmente confuso =\ onde tiveres alguma dúvida, aponta para eu me tentar fazer perceber melhor ;)

Cumps [[[[[[]]]]]]
angelofwisdom
 
Última edição:
Exactamente :)

Já a parte "técnica" :P :
- InStr(1, "The quick brown fox jumps over the lazy dog", "o") retorna 13.
Dentro da string "The quick brown fox jumps over the lazy dog", iniciando na posição 1, onde é que encontramos a letra "o"? Na posição 13 :) confirma!
- InStr(14, "The quick brown fox jumps over the lazy dog", "o") retorna 18.
Agora queremos saber qual é o "o" seguinte àquele. Está na posição 18!
- InStr(19, "The quick brown fox jumps over the lazy dog", "o") retorna 27.
E agora procuramos um terceiro "o". Posição 27. Conta os caracteres e confirma ;)
- InStr(28, "The quick brown fox jumps over the lazy dog", "o") retorna 42.
Mais um "o" na posição 42.
- InStr(43, "The quick brown fox jumps over the lazy dog", "o") retorna 0.
Acabaram-se os "o"s.

Para encontrares a letra escolhida pelo utilizador, e se ainda não tiveres práctica com arrays, podes usar um ciclo que verifica onde se encontra esse caracter na string. Cada vez que retornar um valor >0, existe na posição retornada (e é nela que escreves o caracter). Se à primeira, não existir nenhum caracter (InStr = 0), então é uma letra que não consta da palavra.

Não sei se me fiz entender, mas se precisares de mais ajuda, diz-me onde para eu me tentar fazer perceber ;)

O meu conselho é semelhante ao do HecKel, uma array de labels, e uma array de caracteres. Ou, se não tiveres práctica com arrays, usa apenas um label e uma string ;)

edit - já vi que sabes trabalhar com arrays, e tens uma nova dúvida.
Quanto à tua questão, eu diria que (quase) tudo é possível na programação ;) e o que pedes não é excepção.

Quanto a reconhecer a letra introduzida, podes fazer um ciclo entre a primeira e a última variável da array, e em cada uma (que deve corresponder a um caractere), comparas com a letra (ou, para não haverem problemas upper/lowercase, comparas o UCase(array(índice)) com o UCase(letra_do_utilizador) ).
Para comparares na label, pensa da seguinte forma: na array, o índice corresponde a cada variável no interior da mesma, certo? Então, quando o índice é 5 (aconselho-te vivamente a usar Option Base 1, para evitares confusões), o caractere introduzido pelo utilizador está na posição 5. Nesse caso, "pegas" nos primeiros 4 caracteres do label, acrescentas o caractere escolhido pelo utilizador, e acrescentas os caracteres todos a partir da posição 6 (1-4, <encontrado>, 6-fim).

E agora acho que consegui ser igualmente confuso =\ onde tiveres alguma dúvida, aponta para eu me tentar fazer perceber melhor ;)

Cumps [[[[[[]]]]]]
angelofwisdom

Bem... muito obrigado pelas dicas!
Vou ver o que posso fazer com tanta informação.
 
Ora bem, vou tentar ser mais explícito.
Tens uma array de caracteres, certo? Imagina que se chama "palavra".
Option Base 1 (isto faz com que a array comece em 1, e não em 0).

Palavra(1) = "T"
Palavra(2) = "e"
Palavra(3) = "c"
Palavra(4) = "h"
Palavra(5) = "z"
Palavra(6) = "o"
Palavra(7) = "n"
Palavra(8) = "e"

Até aqui tudo bem, certo?
lblForca.Caption = "________"

Agora, o utilizador pressionou numa tecla:
Código:
Flag = False
 
For i = 1 to Len(lblForca.Caption)
   If UCase(Tecla_Pressionada_Pelo_Utilizador) = UCase(Palavra(i)) Then
     lblForca.Caption = Left(lblForca.Caption, i-1) & Tecla_Pressionada_Pelo_Utilizador & Mid(lblForca.Caption, i+1)
    Flag = True
End If
Next i
 
If Flag Then <houve pelo menos uma letra que foi substituída> Else <não houve substituições>

Se essa tecla estiver na array, a Label é actualizada de modo a mostrá-la nas posições correctas, e Flag passa a ser True. Se Flag for True, a tecla estava na array (não, não me repeti). Se for False, não estava, e aí acrescentas código para a forca.

Mais código do que isto não te posso dar sem fazer o programa por ti :P espero ter sido suficientemente explícito ;)

O código acima pode conter erros porque foi totalmente escrito à mão aqui, e não foi nem testado, nem sequer tocou na IDE do VB. Se tiver erros, avisa ;)
 
Estou a fazer um trabalho de projecto em BP em que tenho que fazer o mesmo, o que eu faço é isto:

String = txtInserir.text
ContarCaracteres = LEN(string)
For i=1 to ContarCaracteres
Array(i)=Mid(string, i, 1)
Next


LEN vai contar os caracteres da string. A função Mid funciona assim: (nome da variável, posição do caracter, quantidade de caracteres)

Com o For eu encho o Array com os caracteres. Faço o mesmo à palavra escondida e depois comparo os caracteres de ambas as strings por meio de mais ciclos de repetição.
 
Estou a fazer um trabalho de projecto em BP em que tenho que fazer o mesmo, o que eu faço é isto:

String = txtInserir.text
ContarCaracteres = LEN(string)
For i=1 to ContarCaracteres
Array(i)=Mid(string, i, 1)
Next


LEN vai contar os caracteres da string. A função Mid funciona assim: (nome da variável, posição do caracter, quantidade de caracteres)

Com o For eu encho o Array com os caracteres. Faço o mesmo à palavra escondida e depois comparo os caracteres de ambas as strings por meio de mais ciclos de repetição.

Pois... isso já tenho feito.
A minha dúvida é como substituir na posição correcta a letra que o user inseriu se esta estiver correcta, tudo numa só label...
 
Ora bem, vou tentar ser mais explícito.
Tens uma array de caracteres, certo? Imagina que se chama "palavra".
Option Base 1 (isto faz com que a array comece em 1, e não em 0).

Palavra(1) = "T"
Palavra(2) = "e"
Palavra(3) = "c"
Palavra(4) = "h"
Palavra(5) = "z"
Palavra(6) = "o"
Palavra(7) = "n"
Palavra(8) = "e"

Até aqui tudo bem, certo?
lblForca.Caption = "________"

Agora, o utilizador pressionou numa tecla:
Código:
Flag = False
 
For i = 1 to Len(lblForca.Caption)
   If UCase(Tecla_Pressionada_Pelo_Utilizador) = UCase(Palavra(i)) Then
     lblForca.Caption = Left(lblForca.Caption, i-1) & Tecla_Pressionada_Pelo_Utilizador & Mid(lblForca.Caption, i+1)
    Flag = True
End If
Next i
 
If Flag Then <houve pelo menos uma letra que foi substituída> Else <não houve substituições>
Se essa tecla estiver na array, a Label é actualizada de modo a mostrá-la nas posições correctas, e Flag passa a ser True. Se Flag for True, a tecla estava na array (não, não me repeti). Se for False, não estava, e aí acrescentas código para a forca.

Mais código do que isto não te posso dar sem fazer o programa por ti :P espero ter sido suficientemente explícito ;)

O código acima pode conter erros porque foi totalmente escrito à mão aqui, e não foi nem testado, nem sequer tocou na IDE do VB. Se tiver erros, avisa ;)

Eu decidi fazer com a função instr() que não conhecia.
Porém quando meto --> procura = InStr(1, frmIndex.palavra, letra) <-- ele devolve 1 em qualquer letra que eu pressione.

frmIndex.palavra --> palavra que o user insere com a função UCase$()
letra --> letra que ele insere para tentar adivinhar
 
Boas ppl...
Ainda sou muito noob no VB mas tenho um trabalho (jogo da forca) para fazer e estou com uma pequena dúvida.
O jogo começa com o pedido do tema e da palavra. Depois, aparece um form com underscores para dizer o número de letras da palavra e o utilizador, para adivinhar a palavra, tem que inserir uma letra numa caixa de texto desse mesmo form.
Ora bem, a minha dúvida é como é que eu testo se a letra que ele inseriu está na palavra e se estiver como é que eu substituo o underscore relativo a essa letra na palavra na devida posição.

P.S. peço que respondam com métodos simples, pois ainda não percebo muito disto.

Obrigado a todos...
tou como o mesmo problema neste jogo! Cheguei a uma parte que ja nao consigo fazer mais! Sera que me podias mandar o teu pa ver como fizest?
 
tou como o mesmo problema neste jogo! Cheguei a uma parte que ja nao consigo fazer mais! Sera que me podias mandar o teu pa ver como fizest?
Sinceramente, é preferível dizeres onde é que "bloqueaste" e o que é que não consegues fazer para te ajudarmos. Dar códigos não é nosso costume ;)
Coloca dúvidas específicas :)
 
Back
Topo