|
FOROS PROFESIONALES WINDEV, WEBDEV y WINDEV Mobile |
| | | | | |
Inicio → WINDEV 25 → Jogo da Forca (Hangman) em WLanguage, utilizando Orientação a Objetos (OOP) e aplicando as melhores práticas |
Jogo da Forca (Hangman) em WLanguage, utilizando Orientação a Objetos (OOP) e aplicando as melhores práticas |
Iniciado por Boller, 17,mar. 2025 17:03 - No hay respuesta |
| |
| | | |
|
| |
Miembro registrado 4.520 mensajes |
|
Publicado el 17,marzo 2025 - 17:03 |
Bom dia
Vou criar uma implementação do Jogo da Forca (Hangman) em WLanguage, utilizando Orientação a Objetos (OOP) e aplicando as melhores práticas, como encapsulamento, responsabilidade única (SOLID), modularidade e código limpo. O jogo consistirá em adivinhar uma palavra secreta, com um limite de tentativas (6 erros antes de perder). O jogador informa uma letra por vez, e o estado da palavra é atualizado conforme as tentativas.
---
### Estrutura do Projeto Dividiremos o código em classes com responsabilidades claras: - **`Palavra`**: Representa a palavra secreta e seu estado atual. - **`Boneco`**: Gerencia o estado do "boneco" da forca (visualização das tentativas). - **`Jogo`**: Controla a interação com o usuário e o fluxo do jogo.
---
### Passo 1: Código das Classes
1. **Classe `Palavra`** Representa a palavra secreta e o progresso do jogador.
```wlanguage CLASS Palavra PRIVATE sPalavraSecreta IS string // Palavra a ser adivinhada arrLetrasExibidas IS array of string // Estado atual (ex.: "_ _ _") PUBLIC PROCEDURE Construtor(sNovaPalavra IS string) sPalavraSecreta = Upper(sNovaPalavra) arrLetrasExibidas = StringToArray(StringBuild("_ ", Length(sPalavraSecreta)), " ") END FUNCTION AdivinharLetra(sLetra IS string) IS boolean LOCAL bAcertou IS boolean = False i IS int sLetra = Upper(sLetra) FOR i = 1 TO Length(sPalavraSecreta) IF ExtractString(sPalavraSecreta, i, 1) = sLetra THEN arrLetrasExibidas[i-1] = sLetra bAcertou = True END END RETURN bAcertou END FUNCTION EstaCompleta() IS boolean RETURN ArrayToString(arrLetrasExibidas, "") = sPalavraSecreta END FUNCTION ToString() IS string RETURN ArrayToString(arrLetrasExibidas, " ") END FUNCTION GetPalavraSecreta() IS string RETURN sPalavraSecreta END END ``` - **Encapsulamento**: A palavra secreta é privada, acessada apenas por métodos. - **Responsabilidade**: Gerencia a palavra e o progresso.
2. **Classe `Boneco`** Representa o boneco da forca e o número de erros.
```wlanguage CLASS Boneco PRIVATE nErros IS int = 0 arrEstagio IS array of string = ["", "O", "O|", "O/|", "O/|", "O/|\", "O/|\_"] PUBLIC PROCEDURE Construtor() nErros = 0 END PROCEDURE AdicionarErro() IF nErros < 6 THEN nErros += 1 END END FUNCTION EstaMorto() IS boolean RETURN nErros >= 6 END FUNCTION ToString() IS string IF nErros = 0 THEN RETURN "Nenhum erro ainda" RETURN arrEstagio[nErros] END FUNCTION GetErros() IS int RETURN nErros END END ``` - **Encapsulamento**: O estado do boneco é privado. - **Responsabilidade**: Gerencia o progresso visual dos erros.
3. **Classe `Jogo`** Controla o fluxo e a interação com o usuário.
```wlanguage CLASS Jogo PRIVATE oPalavra IS Palavra oBoneco IS Boneco sLetrasUsadas IS string PUBLIC PROCEDURE Construtor(sPalavraInicial IS string) oPalavra = NEW Palavra(sPalavraInicial) oBoneco = NEW Boneco() sLetrasUsadas = "" END PROCEDURE Iniciar() Info("Bem-vindo ao Jogo da Forca!") LOOP Info("Palavra: " + oPalavra.ToString() + Charact(13) + "Boneco: " + oBoneco.ToString() + Charact(13) + "Letras usadas: " + sLetrasUsadas + Charact(13) + "Erros: " + oBoneco.GetErros() + "/6") sLetra IS string = Input("Digite uma letra: ") IF Length(sLetra) <> 1 OR IsNumeric(sLetra) THEN Info("Digite apenas uma letra válida!") CONTINUE END IF InStr(sLetrasUsadas, Upper(sLetra)) > 0 THEN Info("Letra já usada! Tente outra.") CONTINUE END sLetrasUsadas += Upper(sLetra) + " " IF NOT oPalavra.AdivinharLetra(sLetra) THEN oBoneco.AdicionarErro() Info("Letra não está na palavra!") END IF oPalavra.EstaCompleta() THEN Info("Palavra: " + oPalavra.ToString() + Charact(13) + "Parabéns! Você venceu!") BREAK END IF oBoneco.EstaMorto() THEN Info("Palavra: " + oPalavra.GetPalavraSecreta() + Charact(13) + "Boneco: " + oBoneco.ToString() + Charact(13) + "Você perdeu!") BREAK END END END END ``` - **Separação de Camadas**: Interage com o usuário e coordena `Palavra` e `Boneco`. - **Controle**: Valida entradas e gerencia o estado do jogo.
---
### Passo 2: Implementação no WinDev 1. Crie um projeto no WinDev. 2. Adicione as classes em um arquivo `.wls`. 3. No evento principal (ex.: botão "Jogar"), chame: ```wlanguage oJogo IS Jogo oJogo = NEW Jogo("GATO") // Exemplo de palavra oJogo.Iniciar() ```
4. **Interface Gráfica (opcional)**: - Use campos de texto para exibir a palavra, o boneco e as letras usadas. - Adicione um campo de entrada para a letra e um botão para enviar. - Atualize a UI dinamicamente com os métodos `ToString`.
---
### Melhores Práticas Aplicadas - **SOLID**: - **S**: Cada classe tem uma única responsabilidade (`Palavra` para a palavra, `Boneco` para erros, `Jogo` para fluxo). - **O**: Fácil de estender (ex.: mudar o limite de erros ou adicionar dicas). - **L**: Não há herança, mas o design é consistente. - **I**: Métodos públicos são específicos. - **D**: Dependências são injetadas (`Jogo` usa `Palavra` e `Boneco`).
- **Código Limpo**: - Nomes descritivos (`AdivinharLetra`, `EstaMorto`). - Funções curtas e focadas. - Validações robustas (letra única, repetida).
- **Reutilização**: - Classes podem ser usadas em variações do jogo (ex.: palavras maiores).
---
### Passo 3: Melhorias Possíveis - **Lista de Palavras**: Crie um banco de palavras (ex.: array ou HFSQL) e escolha aleatoriamente no construtor. - **Dicas**: Adicione um método em `Palavra` para revelar uma letra como dica. - **UI Avançada**: Use imagens para o boneco no WinDev (ex.: estágios gráficos). - **Multiplayer**: Permita dois jogadores, um escolhendo a palavra.
Se quiser alguma dessas melhorias ou ajustes, é só pedir!
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|