#include "harjoitus.h"

void aloitus(int *leveys, int *korkeus)
{
  int muuttuja;
  char buffer[10];

  muuttuja = 1;
  
  while(muuttuja) {
    
    printf("Anna kentan koko: (leveys, korkeus)\n(max. 20,20) (min. 9,9)\n");
    fgets(buffer,10,stdin);
    
    if(sscanf(buffer,"%d, %d", leveys, korkeus)==2)
      if (*leveys<=20 && *leveys>=9 && *korkeus<=20 && *korkeus>=9)
	muuttuja = 0;
      else
	muuttuja = 1;
    else
      printf("Annoit virheelliset arvot.\n");
  }
}


int koordinaatistossa (int alkux, int alkuy, char suunta, int pituus, 
int leveys, int korkeus)
{
  if (((alkux>=1) && (alkux<=leveys) && (alkuy>=1) && (alkuy<=korkeus)) 
      && ((suunta == 'o' && (alkux+pituus<=leveys))
	  ||(suunta == 'v' && (alkux-pituus>=0))
	  ||(suunta == 'y' && (alkuy+pituus<=korkeus)) 
	  ||(suunta == 'a' && (alkuy-pituus>=0))))
    return 1;
  else
    return 0;
}


int sijoitataulukkoon (int alkux, int alkuy, char suunta, int pituus, 
int leveys, int korkeus, char array[])
{

  int i, j, k;
  
  alkux--;
  alkuy--;
  
  for(i=1; i<=pituus; i++) {
    for(j=-1; j<=1; j++) 
      for(k=-1; k<=1; k++) 
	
	if (alkux+j>=0 && alkux+j<leveys && alkuy+k>=0 && alkuy+k<=korkeus)
	  if(array[alkux+j+leveys*(alkuy+k)]=='L')
	    return 0;
  
    switch (suunta)
      {
      case 'o': 
	alkux = alkux+1;
	break;
      case 'v':
	alkux = alkux-1;
	break;
      case 'a':
	alkuy = alkuy-1;
	break;
      case 'y':
	alkuy = alkuy+1;
	break;
      }
  }
  for(i=1; i<=pituus; i++) {
      switch (suunta)
      {
      case 'v': 
	alkux = alkux+1;
	break;
      case 'o':
	alkux = alkux-1;
	break;
      case 'y':
	alkuy = alkuy-1;
	break;
      case 'a':
	alkuy = alkuy+1;
	break;
      }
      array[alkux+leveys*alkuy]='L';
  }
  return 1;
}



void asetalaiva (int pituus, char *nimi, int maara, int varinumero, 
		 char array[], int leveys, int korkeus)
{
  int i, muuttuja;
  int xalku, yalku;
  char suunta;
  char buffer[10];

  for (i=1; i<=maara; i++) {
    
    muuttuja = 1;  
    
    while(muuttuja)
      {
	printf("Anna %d. %s alkupisteen koordinaatit (x,y)\nja suunta (o,v,y tai a). Laiva on %d ruutua pitka.\n", i, nimi, pituus);
	fgets(buffer, 10, stdin);

	if(sscanf(buffer,"%d,%d,%c", &xalku, &yalku, &suunta)==3)
	  if(koordinaatistossa(xalku, yalku, suunta, pituus, leveys, korkeus)) 
	    if(sijoitataulukkoon(xalku, yalku, suunta, pituus, leveys, 
				 korkeus, array))
	      {
		muuttuja = 0;
		piirustus (varinumero, suunta, pituus, xalku, yalku);
	      } 
	    else
	      printf("Yritit asettaa laivan toisen laivan viereen.\n");
	  else
	    printf("Annoit koordinaatit, jotka eivat ole pelilaudalla.\n");
      }
  }
}



void tietokoneasetus(int pituus, int maara, char tarray[], int leveys, 
		     int korkeus)
{
  int i, muuttuja, randomx, randomy, randomsuunta;
  char rasuunta;
  
  for(i=1; i<=maara; i++) {
    
    muuttuja = 1;
    
    while(muuttuja) {
      
      randomx = rand()%(leveys+1);
      randomy = rand()%(korkeus+1);
      randomsuunta = rand()%(4);
      
      switch (randomsuunta)
	{
	case 0:
	  rasuunta = 'o';
	  break;
	case 1:
	  rasuunta = 'v';
	  break;
	case 2:
	  rasuunta = 'a';
	  break;
	case 3:
	  rasuunta = 'y';
	  break;
	}
    
      if(randomx<=leveys && randomx>0 && randomy<=korkeus && randomy>0)   
	if(koordinaatistossa(randomx,randomy,rasuunta,pituus,leveys,korkeus))
	  if(sijoitataulukkoon(randomx,randomy,rasuunta,pituus,leveys,
			       korkeus,tarray))
	    muuttuja = 0;
    }
  }
}


int tyhjataulukko (char array[], int leveys, int korkeus)
{ 
  int i;
  int laivoja;
  
  laivoja = 0;
  
  for(i=0; i<(leveys*korkeus); i++) {
    if(array[i] == 'L')
      laivoja++;
  }
  
  if(laivoja == 0)
    return 1;
  else {  
    return 0;
    laivoja = 0;
  }
}


void tietokonepommitus (int leveys, int korkeus, char array[], char tarray[])
{
  int muuttuja, xmuuttuja, ymuuttuja; 
  int randomx, randomy;
  int rx, ry, alkux, alkuy, loppux, loppuy, i;

  muuttuja = 1;

  while(muuttuja) {

  randomx = rand()%(leveys+1);
  randomy = rand()%(korkeus+1);
  
  if(randomx>=1 && randomx<=leveys && randomy>=1 && randomy<=korkeus)
    if(array[(randomx-1)+(leveys*(randomy-1))]!='V')
      muuttuja = 0;
  
  }
  rx = randomx - 1;
  ry = randomy - 1;
  
  if(array[rx+(leveys*ry)] == 'L') {
    
    piippaus ();
    printf("Laivaasi osui pommi!\n");
    array[rx+leveys*ry] = 'V';
    
    alaruutu (randomx, randomy, SRGP_BLACK);
       
    xmuuttuja = 1;
    ymuuttuja = 1;

    while(xmuuttuja) {
      
      while(ymuuttuja) {
	
	if(randomx>1) 
	  alkux = randomx-1;
	else
	  alkux=randomx+1;
	
	if(randomy>1) 
	  alkuy = randomy-1;
	else
	  alkuy = randomy+1;
	
	if(randomx<leveys) 
	  loppux = randomx+1;
	else
	  loppux = randomx-1;
	
	if(randomy<korkeus) 
	  loppuy = randomy+1;
	else
	  loppuy = randomy-1;
	
	
      for(i=alkux; i<=loppux; i=i+2){ 
	pommitus (leveys, korkeus, tarray);
	jatkopommitus (i, randomy, array, tarray, leveys, korkeus);
      }
      
      for(i=alkuy; i<=loppuy; i=i+2) {
	pommitus (leveys, korkeus, tarray);
	jatkopommitus (randomx, i, array, tarray, leveys, korkeus);
      } 
      
      if(array[(loppux-1)+(leveys*(randomy-1))] == 'L') {
	randomx = loppux;
	xmuuttuja = 1;
      }
      
      if(array[(alkux-1)+(leveys*(randomy-1))] == 'L') {
	randomx = alkux;
	xmuuttuja = 1;
      }

      if(array[(randomx-1)+(leveys*(loppuy-1))] == 'L') {
	  randomy = loppuy;
	  ymuuttuja = 1;
      }
      
      if(array[(randomx-1)+(leveys*(alkuy-1))] == 'L') {
	randomy = alkuy;
	ymuuttuja = 1;
      }
      
      else {
	  xmuuttuja = 0;
	  ymuuttuja = 0;
      }
      
      }
    }   
  }  
  else {  
    array[rx+(leveys*ry)]='V';
    alaruutu (randomx, randomy, 6);
  }
}


void pommitus (int leveys, int korkeus, char tarray[])
{ 
  int apux, apuy, muuttuja, ax, ay;
  char buffer[10];
  
  muuttuja = 1;

  while(muuttuja) {
    
    printf("Anna koordinaatti johon haluat pommittaa\n");
    fgets(buffer, 10, stdin);

    if(sscanf(buffer,"%d,%d", &apux, &apuy) == 2)
      if(apux<=leveys && apux>0 && apuy<=korkeus && apuy>0)
	if(tarray[(apux-1)+(leveys*(apuy-1))]!='V')
	  muuttuja = 0;
	else  
	  printf("Olet jo pommittanut sitä ruutua.\n");
      else
	printf("Antamasi ruutu ei ole pelilaudalla.\n");
    else
      printf("Annoit virheelliset koordinaatit ja suunnan.\n");
  }
  
  ax = apux - 1;
  ay = apuy - 1;
  
  if(tarray[ax+leveys*ay] == 'L') {
    
    printf("Pommi osui!\n");
    piippaus ();
    
    tarray[ax+leveys*ay] = 'V';
    
    ylaruutu (apux, apuy, SRGP_BLACK, korkeus);
  }
  
  else {
    
    ylaruutu (apux, apuy, 6, korkeus);
    tarray[ax+(leveys*ay)] = 'V';
  }
}


void jatkopommitus (int x, int y, char array[], char tarray[], 
		    int leveys, int korkeus)
{
  int ax, ay;
  
  ax = x - 1;
  ay = y - 1;
  
  
  if(array[ax+(leveys*ay)] == 'V') { 
    if((x-1)>=1)
      jatkopommitus ((x-1), y, array, tarray, leveys, korkeus);
    else if((y-1)>=1)
      jatkopommitus (x, (y-1), array, tarray, leveys, korkeus);
    else tietokonepommitus (leveys, korkeus, array, tarray);
  }
  
  else if(array[ax+(leveys*ay)] == 'L') {
    array[ax+(leveys*ay)] = 'V';
    printf("Laivaasi osui pommi!\n");
    alaruutu (x, y, SRGP_BLACK);
    piippaus ();
  }
  
  else {
    array[ax+(leveys*ay)] = 'V';
    alaruutu (x, y, 6);
  }
}

void lajittelu(char *unimi, int upisteet)
{
  int i;
  int luku;
  char nimi[20];

  FILE *stream;
  char *harray[11];
  char *lajiteltu[11];

  harray[10] = calloc(50,sizeof(char));
  sprintf(harray[10], "%s %d\n", unimi, upisteet);
  stream = fopen ("highscore", "r+");
  for(i=0; i<10; i++){
    harray[i] = calloc(50,sizeof(char));
    fgets (harray[i], 50, stream);
  }
  for(i=0; i < 10; i++){
     sscanf(harray[i], "%s %d\n", nimi, &luku);
     if(upisteet > luku){
       lajiteltu[i]=harray[10];
       upisteet=luku;
       harray[10]=harray[i];
     }       
     else
       lajiteltu[i] = harray[i];
  }
     
  rewind(stream);
  for(i=0; i<10; i++){
    fputs(lajiteltu[i], stdout);
    fputs(lajiteltu[i], stream);}
  for(i=0;i<11;i++)
    free(harray[i]);         
  fclose(stream); 
}

void vuorottelu (char array[], char tarray[], int leveys, int korkeus)
{
  int muuttuja = 1;
  char unimi[20];
  int upisteet=0;
  int i;
  int miinus=0;

  while (muuttuja) 
    {
      if(tyhjataulukko(array, leveys, korkeus))
	muuttuja = 0;
      
      if(tyhjataulukko(tarray, leveys, korkeus))
	muuttuja = 0;
      
      else 
	{
	  pommitus (leveys, korkeus, tarray);
	  tietokonepommitus (leveys, korkeus, array, tarray);
	  muuttuja =  1;
	}
    }
  
  if(tyhjataulukko(array,leveys,korkeus)) { 
    printf("Kaikki laivasi on upotettu.\nTietokone voitti taman pelin!\n");
    printf("Anna nimesi highscorelistaa varten\n");
    scanf("%s", unimi);
    printf("\n");
    printf("\n");  
    printf("Highscorelistan Top Ten:\n");
    printf("\n");

    for(i=0; i<leveys*korkeus; i++) {
      if(array[i] == 'L')
	miinus++;
    }
    
    upisteet = 20 - miinus;
    
  }

  
  if(tyhjataulukko(tarray,leveys,korkeus)) {
    printf("Onneksi olkoon, upotit kaikki tietokoneen laivat!\nSina voitit!\n");
    printf("Anna nimesi highscorelistaa varten\n");
    scanf("%s", unimi);
    printf("\n");
    printf("\n");
    printf("Highscorelistan Top Ten:\n");
    printf("\n");

    upisteet = 20;
    
  }
  lajittelu (unimi, upisteet);
  
}




int main(void)
{
  int leveys;
  int korkeus;
  char *array, *tarray;
  time_t t;

  srand((unsigned) time(&t)); 
 
  tekstialoitus (); 

  aloitus (&leveys, &korkeus);

  alusta (leveys, korkeus); 
  
  koordinaatisto (leveys, korkeus);
  
  numerointi (leveys, korkeus);
  
  array = calloc(leveys*korkeus, sizeof (char));
  tarray = calloc(leveys*korkeus, sizeof (char));

  tietokoneasetus (4,1,tarray,leveys,korkeus);

  tietokoneasetus (3,2,tarray,leveys,korkeus);

  tietokoneasetus (2,3,tarray,leveys,korkeus);
  
  tietokoneasetus (1,4,tarray,leveys,korkeus);
 
  asetalaiva (4,"risteilijan",1,3,array,leveys,korkeus); 
  
  asetalaiva (3,"havittajan",2,4,array,leveys,korkeus);
  
  asetalaiva (2,"pikkulaivan",3,2,array,leveys,korkeus);
  
  asetalaiva (1,"vartioveneen",4,5,array,leveys,korkeus);

  vuorottelu (array,tarray,leveys,korkeus);
 
  sleep (10);
  printf("Peli loppui!\n");
  free(array);
  free(tarray);
  lopeta();
  
  return 0;
}































