Pages - Menu

Pages - Menu

sábado, 19 de noviembre de 2016

Haciendo el juego del ahorcado en C++

El ahorcado, un juego en donde el participante o jugador cuenta con un límite de intentos para adivinar una palabra oculta letra por letra antes. Un juego sencillo el cual el hoy programaremos en lenguaje C++. En este caso, programaremos el juego tal de que cuente con varias categorías de palabras las cuales serán: Software, Hadware, OS (Operative Systems - Sistemas Operativos)

Para comenzar el programa, añadimos las librerías que usaremos, hacemos uso del "namespace std", declaramos las funciones que usaremos ( y que explicaré cada una mas adelante), declaramos un par de vectores globales en donde almacenaremos las palabras a usar y creamos el main:
#include <iostream>
#include <vector>
#include <ctime>
#include <windows.h>

string software[] = {"teamspeak","nikto","telegram","megasync","maltego","kate","armitage"};
string hardware[] = {"beeusb","yagui","jtagulator","mouse","usbkiller","harddrive","headset"};
string os[] = {"freebsd","linux","macos","winbugs","openbsd","unix","solaris"};

using namespace std;

int intro();
int juego(int opt);
string words(int opt);
void gotoxy(int x, int y);

int main(void){
 juego(intro());
 cout<<"\n\n\n\n\n";
}
En este main solamente implementamos la función juego(), a la cual se le pasa un parámetro que será definido por la función intro(). En el caso de la función intro() solamente implementaremos un menú en donde el jugador elegirá la categoría a jugar:
int intro(){
 char aux;
 int opt;

 do{
  system("cls");
  cout<<"\n\t******* Menu principal *******";
  cout<<"\n\t[1]   Software\n\t[2]   Hardware\n\t[3]   Sistemas Operativos\n\t[4]   Salir\n\t>>";
  cin>>aux;
 } while (aux < 49 || aux > 52);
 switch(aux){
  case 49: opt = 1; break;
  case 50: opt = 2; break;
  case 51: opt = 3; break;
  case 52: opt = 4; break;
 }
 cout<<opt;
 return opt;
}
El do - while() implementado no hace más que asegurarse de que la opción a elegida por el usuario no sea una distinta a las disponibles, y la variable opt lo que hace es retornar un valor entero teniendo en cuenta la opción elegida. [stextbox id="info" color="000000"]Nota: La variable aux evaluada es de tipo char, por lo cual hacemos uso del valor ASCII de los números al momento de la comprobación.[/stextbox] La función words() es la que se encargará de decidir cual palabra es la que usaremos para jugar, y contiene lo siguiente:
string words(int opt){
 int rword;
 srand(time(NULL));
 rword = 1+rand()%(8-1);
 switch (opt){
  case 1 : return software[rword-1];   
  case 2 : return hardware[rword-1];  
  case 3 : return os[rword-1];       
 }  
}
Crearemos una variable que almacenará un número aleatorio del 1 al 7 y luego teniendo en cuenta la opción elegida en la función intro(), usamos un switch-case para retornar una de las palabras almacenadas en los vectores de palabras que declaramos arriba. Ahora, la más grande y más importante: La función juego(). Esta función es la que se encargará de hacer todo el algoritmo requerido para que el juego sea funcional:
int juego(int opt){
  
  int turn = 6;//Cantidad de errores permitidos
  string used; //Almacena la palabra a usar
  char letra; //Aquí almacenamos la letra ingresada por el jugador
  string cat; //Almacenaremos el nombre de la categoría elegida
  int old=0; //Solo un pequeño auxiliar
  used = words(opt); //Rellenamos la variable con lo retornado por la función words()
  string count = ""; //Un auxiliar
  int total = used.size(); //Guardamos en esta variable el numero de caracteres que tiene la palabra a usar.
  int my_accurate = 0; //Es un auxiliar usado para llevar la cuenta de los aciertos hechos
  switch(opt){
   case 1: cat="Software";break; //En este switch lo que haremos será guardar el nombre de la
   case 2: cat="Hardware";break; //categoría elegida en la variable cat
   case 3: cat="   os   ";break;
  }
  //Se rellena el auxiliar count con espacios en blanco o "_ " teniendo en cuenta la cantidad de letras que hay
  for(int i=0; i != used.size(); i++){
   count+="_ ";
  }
  //Se hace un dibujito bonito (esto es sólo estética, no es necesario explicarlo)
  system("cls");
  cout<<"\n\n\t*******"<<cat<<"*******\n\tIntentos["<<turn<<"]";
  cout<<"\n\n\tPalabra: "<<count<<endl;
  gotoxy(11,5);cout<<"\n\n\t>> ";
  
  gotoxy(6,1);cout<<"**************************************************************";
  gotoxy(6,8);cout<<"**************************************************************";     
  for(int i=1;i<=8;i++){
   gotoxy(6,i);cout<<"*";
   gotoxy(39,i);cout<<"*";
   gotoxy(67,i);cout<<"*";
  }
  gotoxy(40,2);cout<<"           (__)  Have you";
  gotoxy(40,3);cout<<"           (OO)  ";
  gotoxy(40,4);cout<<"   /--------\\/    mooed";
  gotoxy(40,5);cout<<"  / |       ||   ";
  gotoxy(40,6);cout<<" * / \\------/\\    today?";
  gotoxy(40,7);cout<<"   ~~~      ~~~  ";
  
  do {
   //Aquí se comienza a jugar, se le pide al usuario ingresar una letra
   do{
    gotoxy(11,7);cout<<" ";
    gotoxy(11,7);cin>>letra;
    
   }while( letra<97 || letra>122); //Código ascii de las letras EN MINISCULAS desde la a hasta la z
   //Evalua si la letra usada hace parte de la palabra con que se está jugando, en caso de que si se aumenta el auxiliar my_accurate
   //dependiendo de la cantidad de coincidencias
   for(int i=0;i<used.size();i++){
    if(used[i]==letra){
     gotoxy(((i*2)+1)+16,5);cout<<letra;
     my_accurate++;
     used[i] = ' ';                
    }
   }
   //Aqui solamente se va tapando la vaquita simulando el "ahogado"
   if(old == my_accurate){//Si old es igual a my_accurate quiere decir que no hubieron coincidencias en la palabra, lo que significa una oportunidad menos
       gotoxy(40,turn+1);cout<<"\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126";      
    turn--;
    
   }
   old = my_accurate; //se actualiza old para saber cuantos intentos se llevan y poder saber si hubieron coincidencias nuevas
   gotoxy(17,3);cout<<turn;
   //Si la cantidad de aciertos es igual a la cantidad de letras que tiene, ganas.
   if(my_accurate == total){
      gotoxy(8,12);cout<<"Congrats! you win :)";
      break;
   }
   
  }while(turn>0);
  //Si es diferente, pierdes
  if (my_accurate != total){
   gotoxy(8,12);cout<<"You lose :(";
  }
  
 if(opt==4){
  return 0;
 }      
}
Por último creamos la función gotoxy(), esta es una función que se encarga de posicionar en cualquier lugar de la pantalla de ejecución un elemento teniendo en cuenta las cordenadas X y Y de la de donde se desea posicionar.
void gotoxy(int x, int y){
 HANDLE hcon;
 hcon = GetStdHandle(STD_OUTPUT_HANDLE);
 COORD dwPos;
 dwPos.X = x;
 dwPos.Y = y;
 SetConsoleCursorPosition(hcon,dwPos);
}
Y eso es todo, un juego del Ahorcado que cuenta con 3 categorías de juego diferente y haciendo uso de la función gotoxy() para darle un poco de animación. Código fuente: Descargar IDE usado: Dev C++

No hay comentarios.:

Publicar un comentario