├── .gitignore
├── README.md
├── desafio
├── desafio.js
└── forca.js
├── docs
├── Regras.md
├── clone-repo.png
├── estrutura.jpeg
├── estrutura1.png
└── forca.gif
├── package-lock.json
├── package.json
└── validacao
├── caminho-feliz.js
├── caminho-triste.js
└── validar-etapa.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # O desafio da forca
2 |
3 | Olá! Você está prestes a iniciar o nosso desafio para a seleção do StartDB. Se você chegou aqui sem conhecer o StartDB, você pode encontrar mais informações [neste link](https://start.dbserver.com.br/). O desafio desse ano será desenvolver as regras de um jogo da forca.
4 | Você conhece o jogo da forca?
5 |
6 | 
7 |
8 | > **Observação:** *Dia das mães* no gif acima é a dica sobre a palavra secreta
9 |
10 | É um jogo que antigamente necessitava de duas pessoas, uma para selecionar a palavra secreta e outra para tentar acertar. A pessoa que escolhia a palavra desenhava/registrava tudo no papel, desde o desenho da forca, as letras acertadas e letras erradas. Algo muito próximo do gif acima.
11 |
12 | > **Observação:** Somente precisa ser implementado as regras do jogo, não é preciso desenvolver a interface do jogo, o GIF é para demonstração.
13 |
14 | # Como faço o desafio?
15 |
16 | ## Baixando o código do desafio
17 | 
18 | 1. Em Code clique em Download Zip
19 | 2. Acessar o arquivo [desafio.js](https://github.com/dbserver/startdb-2022/blob/main/desafio/desafio.js)
20 | 3. Resolver os desafios que estão comentados no [arquivo de regras](docs/Regras.md)
21 |
22 | ## Ou clonando o projeto no Github:
23 |
24 | 1. Clonar projeto (Se não sabe como, acesse [aqui](https://docs.github.com/pt/github/creating-cloning-and-archiving-repositories/cloning-a-repository-from-github/cloning-a-repository))
25 | 2. Acessar o arquivo [desafio.js](https://github.com/dbserver/startdb-2022/blob/main/desafio/desafio.js)
26 | 3. Resolver os desafios que estão comentados no [arquivo de regras](docs/Regras.md)
27 |
28 | ## Instalando o Node e rodando localmente
29 |
30 | 1. Instalar o [Node](https://nodejs.org/en/)
31 | 2. Instalar dependencias do projeto com o seguinte comando:
32 | ```bash
33 | npm install
34 | ```
35 | 3. Para interagir com o jogo durante o desenvolvimento, você pode executar `desafio.js`, que irá iniciar o jogo no terminal, com o seguinte comando:
36 | ```bash
37 | npm start
38 | ```
39 |
40 | ## Regras do jogo
41 |
42 | As regras estão descritas [nesse arquivo](docs/Regras.md).
43 |
44 | # Quero enviar meu desafio, como faço :D ?
45 |
46 | ## Enviar o código fonte por e-mail:
47 |
48 | Enviar o código fonte para o e-mail start@dbserver.com.br
49 |
50 | ## Ou subir código no GitHub:
51 |
52 | 1. Subir o código para um repositório público (Se não sabe como, acesse [aqui](https://docs.github.com/pt/github/managing-files-in-a-repository/managing-files-using-the-command-line/adding-a-file-to-a-repository-using-the-command-line))
53 | 2. Enviar o link do repositório para o e-mail start@dbserver.com.br
54 |
--------------------------------------------------------------------------------
/desafio/desafio.js:
--------------------------------------------------------------------------------
1 | const readline = require('readline-sync');
2 | const Forca = require('./forca');
3 |
4 | const jogo = new Forca('abacaxi');
5 |
6 | while (!["perdeu", "ganhou"].includes(jogo.buscarEstado())) {
7 | const chute = readline.question("Aguardando chute: \n");
8 | jogo.chutar(chute);
9 | console.log(jogo.buscarDadosDoJogo());
10 | }
11 |
12 | console.log("você " + jogo.buscarEstado());
13 |
--------------------------------------------------------------------------------
/desafio/forca.js:
--------------------------------------------------------------------------------
1 | class Forca {
2 |
3 | chutar(letra) { }
4 |
5 | buscarEstado() { return ""; } // Possiveis valores: "perdeu", "aguardando chute" ou "ganhou"
6 |
7 | buscarDadosDoJogo() {
8 | return {
9 | letrasChutadas: [], // Deve conter todas as letras chutadas
10 | vidas: 6, // Quantidade de vidas restantes
11 | palavra: [] // Deve ser um array com as letras que já foram acertadas ou o valor "_" para as letras não identificadas
12 | }
13 | }
14 | }
15 |
16 | module.exports = Forca;
17 |
--------------------------------------------------------------------------------
/docs/Regras.md:
--------------------------------------------------------------------------------
1 | # Como implementar o desafio?
2 |
3 | Para o desafio definimos uma estrutura a ser seguida de forma que lhe auxilie no que deve ser entregue e também nos ajude a corrigir e executar o código. A linguagem escolhida foi o Javascript (ou JS) e você pode encontrar mais detalhes sobre instalação no [README](../README.md).
4 |
5 | ## Estrutura de diretórios
6 |
7 | 
8 |
9 | ### O arquivo fonte `desafio/desafio.js`
10 |
11 | Esse arquivo contém uma lógica simples que simula o jogo no terminal. Dessa forma, você pode interagir com as regras que você implementou através do jogo. **Esse arquivo não precisa ser modificado**.
12 | Você pode rodar o jogo através do comando:
13 | ```bash
14 | node desafio.js
15 | ```
16 | > Obs: para rodar o comando você precisa estar na raiz do diretório.
17 |
18 | ### O arquivo fonte `desafio/forca.js`
19 | Esse arquivo contém uma estrutura base que define como iremos interagir com a sua implementação (métodos `chutar`, `buscarEstado` e `buscarDadosDoJogo`), logo, toda sua lógica deve ser implementada nesse arquivo. Você pode criar outros métodos/classes para organizar o seu código, porém **não deve alterar o nome dos métodos já criados**.
20 |
21 | ### O arquivo fonte `validacao/caminho-feliz.js`
22 | Esse arquivo contém a simulação de um jogo onde o jogador acerta todas as letras e a cada rodada vai coletando e validando os dados no estado do jogo. Ele pode lhe auxiliar na validação da implementação final. **Esse arquivo não precisa ser modificado**.
23 | Você pode rodar essa validação através do comando:
24 | ```bash
25 | node validacao/caminho-feliz.js
26 | ```
27 |
28 | ### O arquivo fonte `validacao/caminho-triste.js`
29 | Esse arquivo contém a simulação de um jogo onde o jogador erra todas as letras e a cada rodada vai coletando e validando os dados no estado do jogo. Ele pode lhe auxiliar na validação da implementação final. **Esse arquivo não precisa ser modificado**.
30 | Você pode rodar essa validação através do comando:
31 | ```bash
32 | node validacao/caminho-triste.js
33 | ```
34 | ### O arquivo fonte `validacao/validar-etapa.js`
35 | Esse arquivo é usado nos scripts acima para ajudar nas validações.
36 | **Esse arquivo não precisa ser modificado**.
37 |
38 | ## Regras do jogo
39 |
40 | As regras que devem ser implementadas são:
41 |
42 | 1. O jogo deve iniciar com 6 vidas
43 | 2. O jogo deve iniciar com o estado `aguardando chute`.
44 | 3. Todo chute deve conter apenas uma letra, caso tenha mais de uma a jogada deve ser ignorada, ou seja, não deve alterar nenhum estado.
45 | 4. Caso a letra chutada esteja errada mas já foi chutada anteriormente a jogada deve ser ignorada, ou seja, não deve alterar nenhum estado.
46 | 5. Toda chamada ao método chutar deve registrar a letra em letrasChutadas
47 | 6. Se a letra chutada não estiver contida na palavra, deve subtrair uma vida
48 | 7. Se a letra chutada estiver contida na palavra, deve ser substituida na "palavra" em sua respectiva posição.
49 | Ex.: A palavra secreta é "bala" e o jogador chutou a letra "b", então a palavra que é retornada no método buscarDadosDoJogo, deve ser ["b", "_", "_", "_" ].
50 | 8. Caso a quantidade de vidas chegue a 0 (zero), o estado do jogo deve mudar para `perdeu`.
51 | 9. Caso a quantidade de vidas seja maior que zero e o jogador acerte a última letra, o estado do jogo deve mudar para `ganhou`.
52 |
--------------------------------------------------------------------------------
/docs/clone-repo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dbserver/startdb-2022/afd066c3942f0bd7b54c8ba308b277dbd3c49542/docs/clone-repo.png
--------------------------------------------------------------------------------
/docs/estrutura.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dbserver/startdb-2022/afd066c3942f0bd7b54c8ba308b277dbd3c49542/docs/estrutura.jpeg
--------------------------------------------------------------------------------
/docs/estrutura1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dbserver/startdb-2022/afd066c3942f0bd7b54c8ba308b277dbd3c49542/docs/estrutura1.png
--------------------------------------------------------------------------------
/docs/forca.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dbserver/startdb-2022/afd066c3942f0bd7b54c8ba308b277dbd3c49542/docs/forca.gif
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "startdb-2022",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "startdb-2022",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "readline-sync": "^1.4.10"
13 | }
14 | },
15 | "node_modules/readline-sync": {
16 | "version": "1.4.10",
17 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
18 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
19 | "engines": {
20 | "node": ">= 0.8.0"
21 | }
22 | }
23 | },
24 | "dependencies": {
25 | "readline-sync": {
26 | "version": "1.4.10",
27 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
28 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "startdb-2022",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "desafio.js",
6 | "scripts": {
7 | "start": "node desafio/desafio.js"
8 | },
9 | "license": "ISC",
10 | "dependencies": {
11 | "readline-sync": "^1.4.10"
12 | }
13 | }
--------------------------------------------------------------------------------
/validacao/caminho-feliz.js:
--------------------------------------------------------------------------------
1 | const Forca = require('../desafio/forca');
2 | const validarEtapa = require('./validar-etapa');
3 |
4 | const palavraSecreta = 'abacaxi';
5 | const jogoForca = new Forca(palavraSecreta);
6 |
7 | let estadosEstaoCorretos = validarEtapa(6, '_______', '', 'aguardando chute', jogoForca);
8 |
9 | ['a', 'b', 'c', 'x', 'i'].forEach((letra) => jogoForca.chutar(letra));
10 |
11 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(6, 'abacaxi', 'abcxi', 'ganhou', jogoForca);
12 | const mensagemFinal = estadosEstaoCorretos == true ? "Regras validadas com sucesso" :
13 | "Parece que algo está errado, verique suas regras";
14 | console.log(mensagemFinal);
15 |
--------------------------------------------------------------------------------
/validacao/caminho-triste.js:
--------------------------------------------------------------------------------
1 | const Forca = require('../desafio/forca');
2 | const validarEtapa = require('./validar-etapa');
3 |
4 | const palavraSecreta = 'abacaxi';
5 | const jogoForca = new Forca(palavraSecreta);
6 |
7 | const palavraEsperada = '_______';
8 | const estadoEsperado = 'aguardando chute'
9 |
10 | let estadosEstaoCorretos = validarEtapa(6, palavraEsperada, '', estadoEsperado, jogoForca);
11 |
12 | jogoForca.chutar('e');
13 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(5, palavraEsperada, 'e', estadoEsperado, jogoForca);
14 |
15 | jogoForca.chutar('d');
16 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(4, palavraEsperada, 'ed', estadoEsperado, jogoForca);
17 |
18 | jogoForca.chutar('da');
19 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(4, palavraEsperada, 'ed', estadoEsperado, jogoForca);
20 |
21 | jogoForca.chutar('u');
22 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(3, palavraEsperada, 'edu', estadoEsperado, jogoForca);
23 |
24 | jogoForca.chutar('u');
25 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(3, palavraEsperada, 'edu', estadoEsperado, jogoForca);
26 |
27 | jogoForca.chutar('m');
28 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(2, palavraEsperada, 'edum', estadoEsperado, jogoForca);
29 |
30 | jogoForca.chutar('l');
31 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(1, palavraEsperada, 'eduml', estadoEsperado, jogoForca);
32 |
33 | jogoForca.chutar('p');
34 | estadosEstaoCorretos = estadosEstaoCorretos && validarEtapa(0, palavraEsperada, 'edumlp', 'perdeu', jogoForca);
35 |
36 | const mensagemFinal = estadosEstaoCorretos == true ? "Regras validadas com sucesso" :
37 | "Parece que algo está errado, verique suas regras";
38 | console.log(mensagemFinal);
39 |
--------------------------------------------------------------------------------
/validacao/validar-etapa.js:
--------------------------------------------------------------------------------
1 | const validarEtapa = (vidasEsperadas, palavraEsperada, letrasChutadasEsperadas, estadoEsperado, jogoForca) => {
2 | const { vidas, palavra: arrPalavra, letrasChutadas: arrLetrasChutadas } = jogoForca.buscarDadosDoJogo();
3 | const palavra = arrPalavra.join('');
4 | const letrasChutadas = arrLetrasChutadas.join('');
5 | const estado = jogoForca.buscarEstado();
6 |
7 | return vidas === vidasEsperadas
8 | && palavra === palavraEsperada
9 | && letrasChutadas === letrasChutadasEsperadas
10 | && estado === estadoEsperado;
11 | }
12 |
13 | module.exports = validarEtapa;
--------------------------------------------------------------------------------