/*
 * Questo programma realizza una versione semplificata del gioco della battaglia navale
 * L'utente puo' scegliere dimensioni della griglia e numero di navi.
 * Le navi sono grandi una sola casella della griglia e sono posizionate in maniera random sia per utente che cpu
 * Una griglia e rappresentata come una matrice di caratteri
 * - il carattere o rappresenta una nave
 * - il carattere n rappresenta una casella vuota
 * - il carattere y rappresenta una nave colpita
 * - il carattere x rappresenta una casella vuota colpita
 * 
 * Se l'utente chiede di colpire una casella al di fuori della griglia il programma salva lo stato della partita e termina.
 * Se alla partenza il programma trova una partita salvata carica le matrici e continua la partita precedente, 
 * altrimenti chiede all'utente le dimensioni e il numero di navi per iniziare una nuova partita.
 */
 
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NMAX 50

void inzializza(char m[NMAX][NMAX], int r,int c, int navi );
void stampa(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c);
void salvapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c);
int caricapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int *r, int *c);

int playutente(char m[NMAX][NMAX], int r, int c);
void playcpu(char m[NMAX][NMAX], int r, int c);
//controlla il numero di navi non affondate
int check(char m[NMAX][NMAX], int r, int c);


int main(int argc, char **argv)
{
    int r,c, navi;
    char mu[NMAX][NMAX], cpu[NMAX][NMAX];

    srand(time(NULL));
   if(!caricapartita(mu,cpu,&r,&c))
     {

	printf("inserisci le dimenstione delle matrici:\n");
	scanf("%d %d",&r,&c);
	printf("inserisci il numero di navi:\n");
	scanf("%d",&navi);
	inzializza(mu,r,c,navi);
	inzializza(cpu,r,c,navi);
	}
	int continua =1;
	do{
            if(playutente(cpu,r,c)){ //fa giocare l'utente
				//se playutente ritorna 1 (ovvero l'utente ha inserito una posizione valida)
				// controlla se ci sono navi da affondare per l'utente
				if(check(cpu,r,c)>0)
				{
				   //se ci sono navi da affondare fa giocare la cpu
				   playcpu(mu,r,c);
				   stampa(mu,cpu,r,c);
				   printf("\n");
				   //controlla che ci sono navi da affondare per la cpu
				   if(check(mu,r,c)==0){
					   continua=0;
					   printf("ha vinto la cpu\n");
					   }
				}
				else //non ci sono navi da affondare per l'utente
				{
				   printf("hai vinto!!!\n");
				   continua=0;
				   }
			   }
			else{
				  //playutente ritorna 0 perchè l'utente non ha inserito una posiziona valida
				   salvapartita(mu,cpu,r,c);
				   continua=0;
				}
    }while(continua);






}

int check(char m[NMAX][NMAX], int r, int c)
{
  int navi=0;
   for(int i=0;i<r;i++)
     for(int j=0;j<c;j++)
        if(m[i][j]=='o') navi++;

  return navi;
}



int playutente(char m[NMAX][NMAX], int r, int c)
{
   int i,j;
   printf("inserisci coordinate(x<%d e y< %d):\n",r,c);
   scanf("%d %d",&i,&j);
   if((i<r) && (j<c)){
   
   
	   if(m[i][j]=='o') m[i][j]='y';
		else if(m[i][j]=='n'){
		   m[i][j]='x';
		  
	   }
	    return 1;
	   }

      return 0;
}

void playcpu(char m[NMAX][NMAX], int r, int c)
{
  int  i,j;
  do{
  i=rand()%r;
  j=rand()%c;
  }while(m[i][j]=='x' || m[i][j]=='y' );

  printf("cpu sceglie %d,%d\n",i,j);
  if(m[i][j]=='o') m[i][j]='y';
    else if(m[i][j]=='n')
       m[i][j]='x';


}



int caricapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int *r, int *c)
{
	FILE *fp=fopen("partita","r");
	if(fp!=NULL)
	  {
		  fread(r,sizeof(int),1,fp);
		  fread(c,sizeof(int),1,fp);
		  fread(mu,sizeof(char),NMAX*NMAX,fp);
		  fread(cpu,sizeof(char),NMAX*NMAX,fp);
		  fclose(fp);
		  remove("partita");
		  return 1;
	  }
	 else return 0;


	}


void salvapartita(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c)
{
	FILE *fp=fopen("partita","w");
	if(fp!=NULL)
	  {
		  fwrite(&r,sizeof(int),1,fp);
		  fwrite(&c,sizeof(int),1,fp);
		  fwrite(mu,sizeof(char),NMAX*NMAX,fp);
		  fwrite(cpu,sizeof(char),NMAX*NMAX,fp);
		  fclose(fp);
		  }



	}



void inzializza(char m[NMAX][NMAX], int r,int c, int navi )
{


   for(int i=0;i<r;i++)
     for(int j=0;j<c;j++)
        m[i][j]='n';

   for(int i=0; i<navi;i++)
   {
      //generazione navi utente
      int x,y;
      do{
        x=rand()%r;
        y=rand()%c;
        }while(m[x][y]=='o');

      m[x][y]='o';

   }
}


void stampa(char mu[NMAX][NMAX], char cpu[NMAX][NMAX], int r, int c)
{
printf("Griglia Utente:\n");
   for(int i=0;i<r;i++)
   { printf("\n");
     for(int j=0;j<c;j++)
        printf("%c\t",mu[i][j]);
   }

   printf("\n");
printf("Griglia CPU:\n")
    for(int i=0;i<r;i++)
   { printf("\n");
     for(int j=0;j<c;j++)
        if(cpu[i][j]!='o')
          printf("%c\t",cpu[i][j]);
        else
          printf("n\t");
   }

}