#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; 
}
