├── .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 | ![forca](docs/forca.gif) 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 | ![image](docs/clone-repo.png) 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 | ![estrutura de diretórios](./estrutura.jpeg) 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; --------------------------------------------------------------------------------