PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV 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/