int main (void)
{
	char gameboard[BOARD_SIZE][BOARD_SIZE];
	
	initialize_array(gameboard);
	
	print_board(gameboard);
	while(!(is_board_full(gameboard) ) )
	{
		player1_turn(gameboard);	
		player2_turn(gameboard);
	}
	switch(decide_winner(gameboard) )
	{
	case 1:
		printf("Player One (X) Wins!!!\n\n");
		break;
	case 2:
		printf("Player Two (O) Wins!!!\n\n");
		break;
	case 3:
		printf("Tie Game!!!\n\n");
		break;		
	return 0;
	}
}
Exemple #2
0
int main(int argc, char *argv[])
{
	int i,j, winner, field1_winner, numtasks, rounds=1, field_number, game_set;
	int score[3] = {0} ;
	time_t start,end;
	long long before, after ;
	double dif;


	Player_Match match;
	Player_Stats stats;
	MPI_Comm field_comm;
	Player_Match match_info[NPROCS-2];	// -2 field process
	MPI_Datatype MPI_MATCH ;	
	MPI_Init(&argc,&argv);
	MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

	if (numtasks!=NPROCS) {
		printf("Must specify %d processors. Terminating.\n",NPROCS);
		MPI_Finalize();
		return 1;	
	}


	MPI_MATCH = createPlayerMatchStruct() ;
	MPI_Type_commit(&MPI_MATCH); 

	init_player_stats(&stats);

	init_team(&stats, &match);

	//Timing Code
	/* 
	time(&start);
	before = wall_clock_time() ;
	*/

	for (j=1; j<=2; j++) {
		init_player_match(&match) ;
		for (rounds=1, winner = -1, field1_winner=-1; rounds<=HALF_MATCH; rounds++, winner = -1, field1_winner=-1) {
			// inform players of ball coords
			if (stats.global_rank==FIELD) {
				for (i=1; i<NPROCS; i++)
					MPI_Send(match.ball_coords, 2, MPI_INT, i, T_inform_ball_coords, MPI_COMM_WORLD);
			}
			else {
				MPI_Recv(match.ball_coords, 2, MPI_INT, FIELD, T_inform_ball_coords, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			}

			if (stats.global_rank!=FIELD_0 && stats.global_rank!=FIELD_1) {
				player_run(&match, &stats) ;
			}



			setup_field_comm(&stats, &match, &field_comm); 

			// send coordinates together with other info
			if (stats.court_rank==FIELD) {
				for (i=1; i<stats.court_group_size; i++)
					MPI_Recv(&match_info[i-1], 1, MPI_MATCH, i, T_report_pos, field_comm, MPI_STATUS_IGNORE);
			}
			else {
				MPI_Send(&match, 1, MPI_MATCH, 0, T_report_pos, field_comm);
			}

			// decide winner and inform players. Players in other field will not know who is the winner
			if (stats.court_rank==FIELD) {

				winner = decide_winner(match_info, stats.court_group_size-1) ;
				for (i=1; i<stats.court_group_size; i++)
				{
					MPI_Send(&winner, 1, MPI_INT, i, T_inform_winner, field_comm);

				}
			}
			else
			{
				MPI_Recv(&winner, 1, MPI_INT, FIELD, T_inform_winner, field_comm, MPI_STATUS_IGNORE);

			}


			if (winner!=-1) {

				if (stats.court_rank==winner) {
					// winner receives information of all players in same field 
					MPI_Recv(match_info, stats.court_group_size-1, MPI_MATCH, FIELD, T_players_on_field, field_comm, MPI_STATUS_IGNORE);
					shoot(match_info, &match, stats);

					// winner sends shoot location (negative for unsucessful shoot)
					MPI_Send(match.ball_coords, 2, MPI_INT, 0, T_inform_shoot_pos, field_comm);
				}

				if (stats.court_rank==FIELD)
				{	
					MPI_Send(match_info, stats.court_group_size-1, MPI_MATCH, winner, T_players_on_field, field_comm);
					MPI_Recv(match.ball_coords, 2, MPI_INT, winner, T_inform_shoot_pos, field_comm, MPI_STATUS_IGNORE);

					match_info[winner-1].ball_coords[0] = match.ball_coords[0] ;
					match_info[winner-1].ball_coords[1] = match.ball_coords[1] ;

					// decides the final position of ball
					choose_ballpos(match.ball_coords) ;
				}


			}

			// field 1 send to field 0 if it has more than 1 player in its court (not including itself)
			if (stats.global_rank==FIELD_1 && stats.court_group_size > 1) {
				MPI_Send(match_info, stats.court_group_size - 1, MPI_MATCH, FIELD_0, T_update_field0_player, stats.team_comm);

			}
			//field 0 receive from field 1 if it does not have all the players in its court (total processes - process of field 1)
			if (stats.global_rank==FIELD_0 && stats.court_group_size != NPROCS-1) {
				// buffer has an offset of no. of players in its court so that its own players will not be overwritten
				MPI_Recv(&match_info[stats.court_group_size - 1], NPROCS - stats.court_group_size -1, MPI_MATCH, FIELD_1, T_update_field0_player, stats.team_comm, MPI_STATUS_IGNORE);
			}

			// send the winner of field 1 to field 0
			if (stats.global_rank==FIELD_1) {
				MPI_Send(&winner, 1, MPI_INT, FIELD_0, T_winner_field1, MPI_COMM_WORLD);
			}
			if (stats.global_rank==FIELD_0) { 
				MPI_Recv(&field1_winner, 1, MPI_INT, FIELD_1, T_winner_field1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			}

			// field 0 update ball coords there is a winner from field 1 
			if (winner!=-1 && stats.global_rank==FIELD_1) {
				MPI_Send(match.ball_coords, 2, MPI_INT, FIELD_0, T_update_field0_ball, MPI_COMM_WORLD);
			}
			if (winner==-1 && stats.global_rank==FIELD_0 && field1_winner!=-1)
				MPI_Recv(match.ball_coords, 2, MPI_INT, FIELD_1, T_update_field0_ball, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

			if (stats.global_rank==FIELD_0) {
				printf("%d\n", rounds*j) ; 
				print_round_info(match_info, score, match.ball_coords);

			}
			else {
				match.ball_coords[0] = INVALID_COORDS;
				match.ball_coords[1] = INVALID_COORDS;
				match.initial_coords[0] = match.final_coords[0] ;
				match.initial_coords[1] = match.final_coords[1] ;
			}

			MPI_Comm_free(&field_comm);
		}

		if (match.team == 1) {
			stats.post[0] = 128;
		}
		else if  (match.team == 2) {
			stats.post[0] = 0;
		}
	}

	//Timing Code
	/*
	if (stats.global_rank==FIELD_0) {
	time(&end);	
	/dif = difftime (end,start);
	after = wall_clock_time() ;
	printf ("It took %.5lf seconds to complete 5400 rounds (time.h).\n", dif );
	printf ("It took %.5lf seconds to complete 5400 rounds (linux time).\n", (float)(after-before)/1000000000.0);
	printf ("It took %.5lf milliseconds to complete 1 rounds (linux time).\n", (float)(after-before)/(5400*1000000.0));
	}
	*/
	MPI_Finalize();
	return 0;
}