miércoles, 13 de enero de 2016

Wordament

#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

#define MAX_PALABRAS 1
#define FILA 2
#define COLUMNA 2
#define MAX_CARACTER 31

ifstream lectura;
ofstream escritura;

typedef int matriz_numeros [FILA][COLUMNA];
typedef char matriz_letras [FILA][COLUMNA];
typedef char cadena[MAX_CARACTER];
typedef struct
{ int codigo_jugador;
  cadena nick;
}jugador;
typedef char vector[MAX_CARACTER];

void menu(void);
void introducir_jugador(cadena nombre_fichero,jugador&a);
void mostrar_jugador(const jugador a,int num_par_jugadas,int punt_max_obt);
void RellenarMatrizManual (matriz_numeros&num, matriz_letras&let);
void MostrarMatriz (const matriz_numeros num,const matriz_letras let);
void tipo_de_partida(void);
void JUGAR(cadena nombre_fich,cadena fichero1,cadena fichero2,matriz_numeros&num, matriz_letras&let,int&puntos);
void jugada_correcta (cadena nombre_fich,const matriz_numeros num, const matriz_letras let,int punto);
void MostrarMatrizFichero(cadena nombre_ficheroLET,cadena nombre_ficheroNUM,matriz_numeros num,matriz_letras let);
void actualizar_fichero_jugadores(cadena ficheroJ,jugador a);
bool comprobar_palabra(cadena palabra,cadena nombre_fichero);

int main() {

     jugador j;
     matriz_numeros valores;
     matriz_letras palabras;
     int opcion_menu;
     int NumeroPartidasJugadas=0,PuntuacionMaxima=0;
     bool booleana_menu=false;
     char desea_salir;

     cout<<"--- WORDAMENT ---"<<endl<<endl;
     menu();
     cout<<endl<<"Seleccione opción para recorrer el menú: ";
     cin>>opcion_menu;

     while(opcion_menu<1||opcion_menu>5)
     { cout<<"ERROR. Seleccione una opción válida: ";
       cin>>opcion_menu; }

     while(opcion_menu!=5&&booleana_menu==false)
     {
         switch(opcion_menu)
         {
            case 1: cout<<endl<<"- Introduzca datos del jugador -"<<endl;
                    introducir_jugador("jugadores.txt",j);
                    break;

            case 2: mostrar_jugador(j,NumeroPartidasJugadas,PuntuacionMaxima);
                    break;

            case 3: JUGAR("palabras.txt","matriz_letras.txt","matriz_numeros.txt",valores,palabras,PuntuacionMaxima);
                    NumeroPartidasJugadas++;
                    break;

            case 4: //Mostrar datos de los ficheros
                    break; }

      cout<<endl<<"¿Desea salir? (s/n): ";
      cin>>desea_salir;
      while(desea_salir!='s'&&desea_salir!='S'&&desea_salir!='n'&&desea_salir!='S')
      { cout<<"ERROR. Introduzca un caracter válido (s/n): ";
        cin>>desea_salir; }

      if(desea_salir=='S'||desea_salir=='s')
      { booleana_menu=true; }
      else
      { cout<<endl<<endl;
        menu();
        cout<<endl<<"Seleccione opción para recorrer el menú: ";
        cin>>opcion_menu;
        while(opcion_menu<1||opcion_menu>5)
        { cout<<"ERROR. Seleccione una opción válida: ";
          cin>>opcion_menu; }
      }
     }

return 0; }

//=====================================

void menu(void) {

     cout<<"1.- Introducir datos del jugador"<<endl;
     cout<<"2.- Visualizar datos del jugador"<<endl;
     cout<<"3.- Jugar"<<endl;
     cout<<"4.- Mostrar datos de los ficheros"<<endl;
     cout<<"5.- Salir"<<endl;

}

void introducir_jugador(cadena nombre_fichero,jugador&a) {

     cout<<"Código del jugador: ";
     cin>>a.codigo_jugador;
     while(a.codigo_jugador<0)
     { cout<<"ERROR. Introduzca valor válido (entero positivo): ";
       cin>>a.codigo_jugador; }
     cout<<"Nick: ";
     cin>>a.nick;
     actualizar_fichero_jugadores(nombre_fichero,a);

}

void mostrar_jugador(const jugador a,int num_par_jugadas,int punt_max_obt) {

     cout<<endl;
     cout<<"Codigo del jugador: "<<a.codigo_jugador<<endl;
     cout<<"Nick: "<<a.nick<<endl;
     cout<<"Número de partidas jugadas: "<<num_par_jugadas<<endl;
     cout<<"Puntuación máxima obtenida: "<<punt_max_obt<<endl;

}

void RellenarMatrizManual (matriz_numeros&num, matriz_letras&let) {

     cout<<endl;
     cout<<"Vamos a introducir las matrices de letras y valores (recuerda que debes hacerlo en concordancia con el modo de juego que has elegido). "<<endl;
     cout<<"Todas las letras deberán ir en mayúsculas (A-Z) y los valores serán enteros positivos del 1 al 15."<<endl<<endl;

     for(int i=0;i<FILA;i++)
     { for(int j=0;j<COLUMNA;j++)
       { cout<<"Introduzca el elemento letra de la fila "<<i<<" y columna "<<j<<" :"<<endl;
         cout<<"·Letra: ";
         cin>>let[i][j];
         while(let[i][j]<'A'||let[i][j]>'Z')
         { cout<<"ERROR. Introduzca caracter válido (A-Z): ";
           cin>>let[i][j]; }
         cout<<"·Valor: ";
         cin>>num[i][j];
         while(num[i][j]<1||num[i][j]>15)
         { cout<<"ERROR. Introduzca valor válido (1-15): ";
           cin>>num[i][j]; }
         cout<<endl; }
     }

}

void MostrarMatriz (const matriz_numeros num,const matriz_letras let) {

     cout<<endl;
     cout<<"Visualizamos la matriz"<<endl<<endl;

     for(int i=0;i<FILA;i++)
     { for(int j=0;j<COLUMNA;j++)
       { cout<<let[i][j]<<"("<<num[i][j]<<")"<<"  "; }
         cout<<endl; }
}

void tipo_de_partida(void) {

     int tipo_partida;
     cadena tema;

     cout<<endl;
     cout<<"Tipos de partidas disponibles: "<<endl;
     cout<<"1.- Partida de letra con valor especial."<<endl;
     cout<<"2.- Partida temática"<<endl;
     cout<<"3.- Partida de misma letra en las esquinas."<<endl;
     cout<<endl<<"Seleccione tipo de partida: ";
     cin>>tipo_partida;
     while(tipo_partida<1||tipo_partida>3)
     { cout<<"ERROR. Seleccione una opción válida: ";
       cin>>tipo_partida; }

     switch(tipo_partida)
     {
       case 1: cout<<"Partida de letra con valor especial. Introduce los datos normalmente en la matriz de letras/valores excepto en una letra, que su valor debe ser mayor al común, ";
               cout<<"y encuentra todo tipo de palabras."<<endl; break;
       case 2: cout<<"Partida temática. Introduce los datos normalmente en la matriz de letras/valores, pero encuentra únicamente las palabras de un tema escogido."<<endl;
               cout<<"Introduce el tema a tratar (ej: animales, música, cine, deportes, etc...): ";
               cin>>tema;
               cout<<endl<<endl<<"El tema elegido es "<<tema<<", centra tu atención en palabras sobre ello."<<endl; break;
       case 3: cout<<"Partida donde las cuatro esquinas tienen la misma letra. Introduce los datos en la matriz de letras/valores adjuntando la misma letra en las cuatro posiciones de las esquinas y encuentra ";
               cout<<"todo tipo de palabras."<<endl; break;
     }

}

void JUGAR(cadena nombre_fich,cadena fichero1,cadena fichero2,matriz_numeros&num, matriz_letras&let,int&puntos) {

     char manual_automatica;

     tipo_de_partida();
    cout<<"¿Desea partida manual (pulse M) o automatica (pulse A)?"<<endl;
     cin>>manual_automatica;
     while(manual_automatica!='m'&&manual_automatica!='M'&&manual_automatica!='a'&&manual_automatica!='A')
     { cout<<"ERROR. Introduce un caracter válido (a/m): ";
       cin>>manual_automatica; }

     if(manual_automatica=='m'||manual_automatica=='M')
     { RellenarMatrizManual (num,let);
       MostrarMatriz (num, let); }
     else
     { MostrarMatrizFichero(fichero1,fichero2,num,let); }

     for(int i=0;i<MAX_PALABRAS;i++)
     { jugada_correcta(nombre_fich,num,let,puntos); }
}

void jugada_correcta (cadena nombre_fich,const matriz_numeros num, const matriz_letras let,int punto) {

     char pedir_letra;
     int contador_vector=0,valor_palabra=0;
     int posi,posj;
     vector v;

     cout<<"¿Quiere seleccionar letra? (s/n): ";
     cin>>pedir_letra;
     while(pedir_letra!='S'&&pedir_letra!='n'&&pedir_letra!='N'&&pedir_letra!='s')
     { cout<<"ERROR. Introduce caracter válido(s/n): ";
       cin>>pedir_letra; }

     while((pedir_letra=='s'||pedir_letra=='S')&&contador_vector<MAX_CARACTER)
     {
         cout<<"Escoja posición a seleccionar [i][j]: ";
         cin>>posi;
         cin>>posj;
         v[contador_vector]=let[posi][posj];
         valor_palabra=valor_palabra+num[posi][posj];
         contador_vector++;

         cout<<"¿Quiere seleccionar otra letra? (s/n) (recuerda que deben estar contiguas): ";
         cin>>pedir_letra;
         while(pedir_letra!='S'&&pedir_letra!='n'&&pedir_letra!='N'&&pedir_letra!='s')
         { cout<<"ERROR. Introduce caracter válido(s/n): ";
           cin>>pedir_letra; }
     }

     cout<<"La palabra seleccionada es ";
     for(int i=0;i<contador_vector;i++)
     { cout<<v[i]; }
    cout<<" y tiene un valor de "<<valor_palabra<<" puntos"<<endl;
    if(comprobar_palabra(v,nombre_fich)==true)
    {
    cout<<"Palabra correcta, enhorabuena"<<endl;
     valor_palabra=punto;
    }
    else
    { cout<<"Palabra no válida, vuelve a intentarlo"<<endl; }
}


void MostrarMatrizFichero(cadena nombre_ficheroLET,cadena nombre_ficheroNUM,matriz_numeros num,matriz_letras let) {

     lectura.open(nombre_ficheroLET);
     lectura.open(nombre_ficheroNUM);
     if(lectura.fail())
     { cout<<"Error en el fichero de lectura"<<endl; }
     else
     {
         for(int i=0;i<FILA;i++)
         { for(int j=0;j<COLUMNA;j++)
           {
              lectura>>let[i][j];
              lectura>>num[i][j];
              while(!lectura.eof())
              { lectura>>let[i][j];
                lectura>>num[i][j];
                cout<<let[i][j]<<"("<<num[i][j]<<") "; }
           }
           cout<<endl; }
     }

     lectura.close();
}


void actualizar_fichero_jugadores(cadena ficheroJ,jugador a) {
     escritura.open(ficheroJ);
     if(escritura.fail())
     { cout<<"Error en el fichero de escritura"<<endl; }
     else
     { escritura<<a.codigo_jugador<<endl;
       escritura<<a.nick;
     }
     escritura.close();
}

bool comprobar_palabra(cadena palabra,cadena nombre_fichero) {

     bool correcto=false;
     cadena word;

     lectura.open(nombre_fichero);
     if(lectura.fail())
     { cout<<"Error en el fichero de lectura"<<endl; }
     else
     {
       lectura>>word;
       while(!lectura.eof()&&correcto==false)
       {
           lectura>>word;
           if(word==palabra)
           { correcto=true; }
       }
     }

return correcto;

}