//
//
/*   elaine chan, hw5.c*/
//
#include "GP142.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void displaySolution(void);
void wait(int n); /* wait n milliseconds */
int won(int frog[8]);
int stuck(int frog[8]);
void wait2(void);
void drawFrog(int frog[8], int move[8],int click[3]);
/* the following program locks up my stinkpad */
void wait(int n)
{ /* wait n milliseconds */
 clock_t t1=clock();
clock_t t2;
do{
t2=clock();
} while(t2<t1+n);
}

void displaySolution( void){

	int solution[24][8] = { {1,1,1,0,0,-1,-1,-1},{1,1,0,1,0,-1,-1,-1},
{1,0,1,1,0,-1,-1,-1}, {0,1,1,1,0,-1,-1,-1},{0,1,1,0,1,-1,-1,-1},
{0,1,1,-1,1,0,-1,-1},{0,1,1,-1,1,-1,0,-1},{0,1,1,-1,0,-1,1,-1},
{0,1,0,-1,1,-1,1,-1},{0,1,-1,0,1,-1,1,-1},{-1,1,0,0,1,-1,1,-1},
{-1,1,0,-1,1,0,1,-1},{-1,1,0,-1,1,-1,1,0},{-1,1,0,-1,1,-1,0,1},
{-1,1,0,-1,0,-1,1,1},{-1,1,0,-1,1,-1,0,1},{-1,1,0,-1,0,-1,1,1},
{-1,1,-1,0,0,-1,1,1},{-1,0,-1,1,0,-1,1,1},{-1,0,-1,0,1,-1,1,1},
{-1,0,-1,-1,1,0,1,1},{-1,-1,0,-1,1,0,1,1},{-1,-1,-1,0,1,0,1,1},
	{-1,-1,-1,0,0,1,1,1} };
 

	int frog[8] = {1,1,1,0,0,-1,-1,-1};

		 int i,j,color, x ;
GP142_printfXY(BLACK,0,220,12,"elaine chan,HW5  ");

for (j=0;j<24;j++){


for(i=0;i<8;i++){
     frog[i]=solution[j][i];

	if (frog[i]==1)color=GOLD;
if (frog[i]==-1) color=MED_GRAY;
if (frog[i]==0) color=PURPLE; /* empty spot */

	x=-175 + i*50;
	GP142_rectangleXY(color,x-23,-10,x+23,50,0);

	 if(frog[i]==1)GP142_lineXY(GREEN,x-15,-5,x+15,20,12);
	if(frog[i]==1)GP142_lineXY(GREEN,x-15,-5,x+20,-5,6);
	
	if(frog[i]==-1)GP142_lineXY(GREEN,x+15,-5,x-15,20,12);
if(frog[i]==-1)GP142_lineXY(GREEN,x+15,-5,x-20,-5,6);
	
	GP142_printfXY(RED,x,25,17,"%d",solution[j][i]);
   /*	GP142_flush(); too frequent flushing ??*/
} /* end of for loop over i */
/* wait(400); this freezes the GP142 window try later after the GP142_flush()  */
GP142_printfXY(WHITE,-200,200,17,"Press any key to continue");
wait2();
    GP142_flush();
} /* end of for loop over j */
GP142_printfXY(PURPLE,0,220,12,"elaine chan,HW5  ");

GP142_printfXY(PURPLE,-200,200,17,"Press any key to continue");
/* against a purple background it erases */

return;

}

int main(void){

int quit=0;
int start[8]={1,1,1,0,0,-1,-1,-1}; 
int zero[8]={0,0,0,0,0,0,0,0};
int frog[8]={1,1,1,0,0,-1,-1,-1}; /* current frog positions */
int move[8]={0,0,0,0,0,0,0,0}; /* move of the frog */
int click[3]={9,9,0};/* click[0]previous #moves, click[1]selected frog, click[2]#moves */
int x,i,j;
int mouse_x, mouse_y; /* used by gp142_await_event */
char key_pressed;
int go_on=0;
GP142_open();/* open an intiialize GP142 graphics window */
GP142_logging(LOG_OFF);
/* background window */
GP142_rectangleXY(PURPLE,-GP142_XMAX,-GP142_YMAX,GP142_XMAX,GP142_YMAX,0);


/* draw solution,reset,quit,moves button */ 
GP142_rectangleXY(ICE_BLUE,-300,-140,-200,-90,0);
GP142_printfXY(BLUE,-275,-120,12," QUIT" );
GP142_rectangleXY(PEACH,-300,-195,-200,-145,0);
GP142_printfXY(BLUE,-275,-175,12,"  RESET ");
GP142_rectangleXY(ICE_BLUE,-300,-250,-200,-200,0);
GP142_printfXY(BLUE,-275,-225,12,"SOLUTION");
for (i=0;i<8;i++) { move[i]=zero[i]; frog[i]=start[i];}
drawFrog(frog,move,click); GP142_flush();
drawFrog(frog,move,click);GP142_flush();

while(!quit){
	switch(GP142_await_event(&mouse_x,&mouse_y,&key_pressed)){
	case GP142_QUIT:
			quit=1; /*set flag to terminate loop */
			break;
	case GP142_MOUSE: /*click of the mouse */





for (i=0;i<8;i++){
     x= -175 + i*50; /* frog[i] centered at x */

	  if(mouse_x>= (x-23) && mouse_y>= -10 && mouse_x<=(x+23)
		  && mouse_y<=50 ) {
			  if( frog[i]!=0)/*first click */
			  {drawFrog(frog,move,click);
			  
              GP142_rectangleXY(PURPLE,-200,200,100,225,0); //new

			  GP142_printfXY(WHITE,-200,200,17,"Move a frog"); //new
			  GP142_flush();
			  click[1]=i; //      move[i]= -frog[i];
			    drawFrog(frog,move,click);  GP142_flush();
			  click[0]=click[2];
			  }/* end click[1]==0 first click*/

		if(click[1]!=9 && frog[i]==0)/*second click */
		{  j=click[1]; 
		if(frog[j]==1 &&(i==(j+1)||frog[j+1]==-1 && i==j+2))
		{
			move[j]=-1; // move[j]=-frog[j];
			move[i]=frog[j]; click[2]=click[2]+1;
 GP142_rectangleXY(PURPLE,-200,200,100,225,0);//new

			  GP142_printfXY(WHITE,-200,200,17,"Select a frog");//new

		}/*end of if right moving frog */

		if(frog[j]==-1 &&(i==(j-1) ||frog[j-1]==1 && i==j-2))
		{
			move[j]=1; // move[j]= -frog[j];
			move[i]=frog[j];click[2]=click[2]+1;

 GP142_rectangleXY(PURPLE,-200,200,100,225,0); 

			  GP142_printfXY(WHITE,-200,200,17,"Select a frog");
		}/* end of if left moving frog */

	frog[i]=frog[i]+move[i];
	frog[j]=frog[j]+move[j];
	click[1]=9;
	
	drawFrog(frog,move,click);
  GP142_flush();
  move[j]=0; move[i]=0; 



  GP142_rectangleXY(PURPLE,-300,200,-200,225,0);
 
GP142_flush();
  
   GP142_printfXY(WHITE,-300,200,17,"Moves=%d",click[2]);
GP142_flush();
if ( click[0]>=click[2] && stuck(frog)==0){

	GP142_rectangleXY(PURPLE,-300,200,100,225,0); 	
	GP142_printfXY(WHITE,-200,200,17,"Your frogs have croaked! Reset & Try Again");
	 
		}
		}/*end click[1]==1 second click*/ 

	  
	  }/* end of if frog[i]!=0 */



  

 }/* end of for i */


/* did you win */

if(won(frog)==1)
{ GP142_rectangleXY(PURPLE,-300,200,100,225,0); 	
	

GP142_printfXY(ICE_BLUE,-200,200,17," You won ");



	
//	GP142_rectangleXY(PURPLE,-300,200,100,225,0); 	

}/* end of if won */

       /* mouse click on solution button */
	if(mouse_x>= -300 && mouse_x<=-200 &&
		mouse_y<= -200 && mouse_y >=-250) { 
		GP142_rectangleXY(PURPLE,-200,200,-100,225,0); 

GP142_rectangleXY(PURPLE,-300,200,-200,225,0);
		displaySolution();
	GP142_flush(); drawFrog(start,zero,click);}
	
	/* mouse click on reset button    */
	if(mouse_x >= -300 && mouse_x <= -200 &&
	   mouse_y <= -145 && mouse_y >= -195) { 

 GP142_rectangleXY(PURPLE,-200,200,-100,225,0); 

GP142_rectangleXY(PURPLE,-300,200,-200,225,0);
GP142_printfXY(PURPLE,-300,200,17,"Moves=%d",888);	GP142_flush();	
	GP142_printfXY(PURPLE,-200,200,17,"Your frogs have croaked! Reset & Try Again");
//click[1]=9; click[2]=0;
      click[1]=9; click[2]=0; 
	  for ( i=0;i<8;i++){
	  frog[i]=start[i];  move[i]=zero[i];
	  }
	drawFrog(frog, move, click);
	GP142_flush(); } 

   /* mouse click on quit button  */
	if(mouse_x >=-300&&mouse_x <=-200 &&
     mouse_y >=-140 && mouse_y <= -90 ) quit = 1;
		break;
	case GP142_KBD: /* keyboard input */

		break;
	}
	}
GP142_close(); /* clean up and close graphics window */
return 0;
     }





void wait2(void)
{  /* wait for user to press a key */
	int x,y;
	char key;
	int go_on=0;
	while(!go_on)
	{if(GP142_await_event(&x,&y,&key)==GP142_KBD)go_on=1;
	} /* end of while */
}

void drawFrog(int frog[8], int move[8], int click[3]) 
{

	int color, x ,i ;
	
for(i=0;i<8;i++){
    
	if (frog[i]==1)color=GOLD;
if (frog[i]==-1) color=MED_GRAY;
if (frog[i]==0) color=PURPLE;
    
	  if(i==click[1] ) color=WHITE; 
	x=-175 + i*50;
	GP142_rectangleXY(color,x-23,-10,x+23,50,0);
    if(frog[i]==1)GP142_lineXY(GREEN,x-15,-5,x+15,20,12);
	if(frog[i]==1)GP142_lineXY(GREEN,x-15,-5,x+20,-5,6);
	
	if(frog[i]==-1)GP142_lineXY(GREEN,x+15,-5,x-15,20,12);
if(frog[i]==-1)GP142_lineXY(GREEN,x+15,-5,x-20,-5,6);
	
	GP142_printfXY(RED,x,25,17,"%d",frog[i]);
	
	} /* end of for loop over i */
    GP142_flush();


}

int stuck(int frog[8]) {
	int i;
	for (i=0;i<8;i++){
		switch(frog[i]){
		case 0 : break;
        case -1 :
			if(frog[i-1]==0 && i>0) return 1;
			if(frog[i-2]==0 && i>1 && frog[i-1]==1) return 1;
			break;
		case 1 :
			if(frog[i+1]==0 && i<7 ) return 1;
            if(frog[i+2]==0 && i<6 && frog[i-1]==-1) return 1;
			break;
		}/* end of switch */
	}/* end of for i */
	return 0; /* no moves possible */
}

int won(int frog[8] ){
	int i;
	int start[8]={1,1,1,0,0,-1,-1,-1};
	for (i=0;i<8;i++)
	{if(frog[i]!=-start[i])return 0;
	}/*end of for i */
	return 1;/* you won */
}