Desenvolvimento do Jogo da Forca em C++ (atente-se que foram feitos 4 arquivos: Main.cpp, Jogo.cpp, Palavras.cpp e Forca.h)
Main.cpp #include <iostream>
#include "Forca.h" //Permite usar o arquivo Forca.h using namespace std;
int main() {
gerenciamento_jogo GJ;
GJ.menu_jogo(); //Inicializa programa com a função menu_jogo() return 0; } Jogo.cpp #include <iostream> #include <iomanip> #include<vector> #include <string>
#include <fstream> //Para manipular arquivos #include <cstdlib> //Usar comando rand() #include<ctime> //Usar time
#include "Forca.h" //Permite usar o arquivo Forca.h #define MAX_LINE 500
using namespace std;
void gerenciamento_jogo::menu_jogo() {
cout << "####JOGO DA FORCA####\n\n" << "[1]Inserir palavra;\n" << "[2]Remover palavra;\n" << "[3]Jogar;\n" << "[4]Sair.\n\n"; cin >> opcao;
if ((opcao != "1")&&(opcao != "2")&&(opcao != "3")&&(opcao != "4")) //Verifica se o usuário digitou algo diferente das opções listadas
{
cout<< "Opcao invalida! Digite novamente.\n"; system("pause");system("cls"); menu_jogo(); } else if(opcao == "1") insere_palavra(); else if (opcao == "2") remove_palavra(); else if (opcao == "3") jogar(); else {
cout << "Finalizando Forca...\n\n"; system("pause"); system("cls"); } } void gerenciamento_jogo::verificacao() {
cin >> opcao;
if ((opcao == "s")||(opcao == "S")) jogar();
else if ((opcao == "n")||(opcao == "N")) menu_jogo();
else {
cout << "A opcao digitada nao corresponde a nenhuma das opcoes acima.\n" << "Por favor, tente novamente!\n\n";
system ("pause"); verificacao(); }
}
void gerenciamento_jogo::exibir(string palavra , vector<bool> exibe) {
for (int i = 0 ; i < palavra.size() ; i++ ) if (exibe[i] || palavra[i] == ' ' ) cout << palavra[i]; else cout << "_" << " "; } void gerenciamento_jogo::jogar() { system("cls"); if (dicionario.empty())
preenche_dicionario(dicionario);//Preenche vector dicionario somente se este ainda não foi inicializado
if (dicionario.empty()) //Verifica se vector dicionario está vazio antes de iniciar o jogo {
cout << "Antes de jogar cadastre uma palavra! \n"; system("pause");
menu_jogo(); }
palavra=sorteio();
vector<bool> aparece(palavra.size(),false);
cout << "A palavra sorteada tem " << palavra.size() << " letras.\n\n"; cout << "Digite uma letra: \n";
int cont_acerto=0; int cont_erro=0; bool aux;
while (cont_acerto!= palavra.size()) {
cin >> letra; aux = false;
for (int i=0; i<palavra.size(); i++) { if (palavra[i] == letra) { aparece[i]=true; aux= true; cont_acerto=cont_acerto+1; } }
exibir(palavra,aparece); cout << endl;
if (aux==false)
cont_erro=cont_erro+1;
if (cont_erro==5) //Quando o jogador atinge o numero maximo de erros, ele perde {
system("cls");
cout << "GAME OVER \n\n"
<< "A palavra eh: " << palavra << "\n" << "Erros: " << cont_erro << "\n" << "Que pena, vc perdeu!\n\n"
<< "Deseja jogar novamente (S/N)? \n\n"; verificacao();
} }
//Mostra mensagem abaixo se o usuario acerta todas as letras system("cls");
cout << "YOU WON!!! \n\n"
<< "A palavra eh: " << palavra << "\n" << "Erros: " << cont_erro << "\n" << "Parabens, vc acertou!\n\n"
<<" Deseja jogar novamente (S/N)?\n\n " << endl; verificacao();
}
Palavras.cpp #include <iostream>
#include <iomanip> #include<vector> #include <string>
#include <fstream> //Para manipular arquivos #include <cstdlib> //Usar comando rand() #include<ctime> //Usar time
#include "Forca.h" //Permite usar o arquivo Forca.h #define MAX_LINE 500
using namespace std;
gerenciamento_jogo GJ;
void gerenciamento_palavras::preenche_dicionario(vector<string> &dicionario) {
char linha[MAX_LINE];
ifstream arquivo("./dicionario_palavras.txt", ios::in); while (arquivo.good())
{
arquivo.getline(linha,MAX_LINE-1); if (linha[0]!='\0')
dicionario.push_back(linha); //Coloca palavras lidas no arquivo no vector dicionario }
arquivo.close(); }
void gerenciamento_palavras::insere_palavra() {
system("cls");
cout<< "Digite a palavra que deseja inserir:\n\n"; cin >> palavra;
ofstream arquivo("./dicionario_palavras.txt" ,ios::app | ios::out); if (!arquivo.is_open())
{
cout << "Erro: Não foi possível abrir o arquivo." << endl; }
arquivo << palavra << endl; arquivo.close();
dicionario.clear(); //Apaga tudo o que está no vector dicionario
preenche_dicionario(dicionario); //Preenche vector dicionario com as novas e antigas palavras system("pause"); GJ.menu_jogo(); } void gerenciamento_palavras::remove_palavra() { system("cls");
if (dicionario.empty()) //Inicializa vector dicionario, caso isso já não tenha sido feito na função insere_palavra
preenche_dicionario(dicionario);
if (dicionario.empty()) //Se depois de inicializar o vector dicionario for constado que não há palavras no arquivo, não permite remoção
{
cout<< "Nao ha palavras para serem removidas!\n\n"; system("pause");
} int op;
cout << "Escolha a palavra que deseja remover ou digite -1 para voltar ao menu do jogo:\n\n";
int i=0;
for (vector<string>::iterator it = dicionario.begin(); it!=dicionario.end(); it++) {
if ((*it) != "")
cout << "[" << i << "] " << (*it) << endl; i++;
}
cin >> op; if(op == -1)
GJ.menu_jogo(); //Volta ao menu do jogo
else //Verifica se o usuário digitou uma opção diferente das listadas {
bool aux = false;
for(int i=0; i<dicionario.size(); i++) { if (op == i) aux = true; } if (aux == false) {
cout<< "A opcao digitada nao corresponde a nenhuma das listadas acima! Tente novamente.\n";
system("pause"); remove_palavra();
} }
dicionario.erase(dicionario.begin()+ op);
remove("./dicionario_palavras.txt"); //Apaga arquivo dicionario_palavras.txt
ofstream arquivo("./dicionario_palavras.txt" ,ios::app | ios::out); if (!arquivo.is_open())
{
cout << "Erro: Não foi possível abrir o arquivo.\n\n" << endl; }
for (int i=0; i<dicionario.size(); i++)
arquivo << dicionario[i] << endl; //Insere o conteúdo do vector dicionário, depois que o mesmo foi alrerado
arquivo.close(); system("pause"); GJ.menu_jogo(); } string gerenciamento_palavras::sorteio() { string Palavra;
srand(time(0)); //Gera uma sequência de números aleatórios diferentes toda vez que o programa é executado
int id = rand() % (dicionario.size()-1); //Sorteia o índice de uma palavra aleatoriamente, de zero até o tamanho do vector dicionario
if (dicionario[id]=="") sorteio();
else {
Palavra=dicionario[id]; return Palavra; } } Forca.h #ifndef FORCA_H_INCLUDED #define FORCA_H_INCLUDED #include<vector> #include <string> using namespace std; class gerenciamento_palavras { public: gerenciamento_palavras() {}; //Construtor ~gerenciamento_palavras() {}; //Destrutor string palavra; //Recebe palavra sorteada
char letra; //Recebe letra escolhida pelo usuário para adivinhar palavra
vector<string> dicionario; //Armazena as palavras que estão no arquivo para serem posteriormente sorteadas.
void insere_palavra(); //Função para inserir nova palavra void remove_palavra(); //Função para remover palavra
string sorteio(); //Função que sorteia um número, sendo que este representa a localização de uma palavra no vector dicionário
void preenche_dicionario(vector<string> &dicionario); //Preenche vector dicionario com as plavras armazenadas em Dicionário_palavras.txt