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; } }
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; }