void Spectator::visit(std::shared_ptr<Courthouse>& c) {
    courthouse = c;
    enter();
    spectate();
    leave();
}
/** Program entry point */
int main() 
{
	// Initialisation of the game and of the SDL module.
	printf("\n\n  Welcome to the 7 wonders of the world of the 7 colors\n"
	      "  *****************************************************\n\n"
	 "Current board state:\n");
	srand(time(NULL));
	SDL_Init(SDL_INIT_EVERYTHING);



	// Initialising everything necessary variables for the game
	int victory1 = 0; //number of victories of PLAYER1
	int victory2 = 0; //number of victories of PLAYER2
	char mode = '0'; //terminal's purpose for the durantion of the game (host player, )
	char previous_mode = '0'; // This is here to reset the score, in case we switch between AI player and a real player
	char rematch = '1';
	char difficulty = '0'; //to choose between several AIs
	void (*P2)(char) = NULL; // This will be either an AI or a real player

	while(rematch == '1'){

		// Selecting a game mode we know
	 	do{
	   		printf("Which mode do you want to play ?\n");
			printf("Please take note that switching mode will reset your score.\n");
	  		printf("1) Player VS. Player \n");
	  		printf("2) Player VS. AI\n");
			printf("3) Spectate an online game\n");
			printf("4) Host an online game\n");
			printf("5) Join an online game\n");
			printf("6) Quit\n");
			scanf("%c",&mode);
			printf("\n\n");
	   	}while(mode < '1' || mode > '6');
		
		// If the mode was changed, we reset the score
		if(previous_mode != mode){
			victory1 = 0;
			victory2 = 0;
		}  
		previous_mode = mode; //then reset the test
		
		// If the 2nd player is an AI, we select its level
		if(mode == '2'){
			do{
		   		printf("Which difficulty do you want to play with ?\n");
		  		printf("1) Hard\n");
		  		printf("2) Harder\n");
		  		printf("3) Hardest\n");
		  		printf("4) Hardestest\n");
		  		printf("5) Hardestestest\n");
				scanf("%c",&difficulty);
				printf("\n\n");
		  	}while(difficulty < '1' || difficulty > '5');
		
	
			switch(difficulty){ //chose the AI's stategy that is defined in stategy.c
				case '1': P2 = &improved_random_play; break;
				case '2': P2 = &spider; break;
				case '3': P2 = &greedy; break;
				case '4': P2 = &double_greedy; break;
				case '5': P2 = &mix; break;
			}
		}
		else{
			P2 = &real_play; //defined in strategy.c
		}
	
		// If we are running a game on this computer
		if(mode == '1' || mode == '2'){
			char sp = 0;
			// Verifying if we allow spectators
			printf("Allow spectators\n");
			printf("1) Yes\n");
			printf("2) No\n");
			do{
				scanf("%c",&sp);
			}while(sp < '1' || sp > '2');
			
			if(sp == '1'){allow_spectators();} //defined in server.c start creating a connection
			else{ban_spectators();} //defined in server.c don't create connections

			// Initialising everything in order to allow spectators to watch
			if(spectate() == 1){bind_listen_spectators(); /*accept_new_spectators();*/} //if spectator is connected

			// Initialising the game
			init_window();
			random_filling(); //defined in board.c
			update_board(); //defined in display.c
			if(spectate() == 1){send_board_spectators();} // sending your initail bord to spectator (recv in spectator.c)

			// Running the game and printing the scores
			run_game(PLAYER1,&real_play,P2); //defined in stategy.c (PLAYER is a char defined in board.c)
			update_board();
			printf("Player 1 : %d\n",score(PLAYER1)); //defined in auxilary.c
			printf("Player 2 : %d\n",score(PLAYER2));
				printf("\n");
			if(score(PLAYER1) > score(PLAYER2)){victory1++;}
			else{victory2++;}
			printf("\n**************************************\n\n");
			printf("Player 1 : %d victories\n",victory1);
			printf("Player 2 : %d victories\n",victory2);

			if(spectate() == 1){ //sending the spectator off
				spectators_quit(); //defined in server.c
			}


			printf("\n\nDo you want to play again ?\n");
			printf("1) Yes\n");
			printf("2) No\n");
		
			// Asking for a rematch
			do{
				scanf("%c",&rematch);
			}while(rematch < '1' || rematch > '2');
		}
		
		// Spectating an online game
		else if(mode == '3'){
			system("./spectate"); //switch to spectator.c executable
		}

		// Hosting an online game
		else if(mode == '4'){
			system("./host");
		}

		// Joining an online game as a player
		else if(mode == '5'){
			system("./client");
		}

		else if(mode == '6'){rematch = '0';}
	
	}
	
	
	
	SDL_Quit();
	return 0; // Everything went well
}
int main(){
	SDL_Init(SDL_INIT_EVERYTHING);
	char move = 0;
	char sp = '0';
	extern char current_color;

	printf("Waiting for a player to connect...\n");
	bind_listen_player();
	printf("Player connected.\n\n");
	
	// Verifying if we allow spectators
	printf("Allow spectators\n");
	printf("1) Yes\n");
	printf("2) No\n");
	do{
		scanf("%c",&sp);
	}while(sp < '1' || sp > '2');

	if(sp == '1'){allow_spectators();} //defined in server.c start creating a connection
	else{ban_spectators();} //defined in server.c don't create connections

	// Initialising everything in order to allow spectators to watch
	if(spectate() == 1){bind_listen_spectators(); /*accept_new_spectators();*/} //if spectator is connected
	
	// Initialising the game
	init_window();
	random_filling(); //defined in board.c
	update_board(); //defined in display.c
	send_board_player();
	if(spectate() == 1){send_board_spectators();} // sending your initail bord to spectator (recv in spectator.c)

	while(nextturn()){
		update_board(); //display bord
		printf("Player 1 : %d\n",score(PLAYER1));
		printf("Player 2 : %d\n",score(PLAYER2));
		printf("\n");
		move = your_turn();
		current_color = move;
		play(PLAYER1,TEMP,move); // The move is done here the game is reconstructed.
		update_board();
		send_move_spectators(PLAYER1);
		send_move_player();
		if(nextturn()){
			move = recv_move_player();
			play(PLAYER2,TEMP,move);
			send_move_spectators(PLAYER2);
			}
	}

	//end of game update and score
	update_board();
	online_player_quit();
	printf("Player 1 : %d\n",score(PLAYER1));
	printf("Player 2 : %d\n",score(PLAYER2));
	printf("\n");
	
	if(spectate() == 1){ //sending the spectator off
		spectators_quit(); //defined in server.c
	}
	
	printf("Press a key, then Enter to quit");
	getchar();
	
	SDL_Quit();
	return 0;
}