void add_animation(Window* window, ca_animation* anim) { if (!mutex) mutex = lock_create(); lock(mutex); array_m_insert(window->animations, anim); anim->end_date = tick_count() + (anim->duration * 1000); unlock(mutex); }
int main(int argc,char*argv[]){ const int num_iters=200000,num_shortlist_iters=1000000; srand(tick_count()); Player me,opponent; if(argc==5){ sscanf(argv[1],"%d",&me.health); sscanf(argv[2],"%d",&opponent.health); sscanf(argv[3],"%d",&me.honour); sscanf(argv[4],"%d",&opponent.honour); me.lastMove=WAIT; opponent.lastMove=WAIT; }else{ sscanf(argv[3],"%d",&me.health); sscanf(argv[4],"%d",&opponent.health); sscanf(argv[5],"%d",&me.honour); sscanf(argv[6],"%d",&opponent.honour); me.lastMove=decode_move(argv[1][strlen(argv[1])-1]); opponent.lastMove=decode_move(argv[2][strlen(argv[2])-1]); } struct SimulationStat results[6]; results[0].first_me_move=WAIT; results[0].win=0; results[0].draw=0; results[0].lose=num_iters; results[0].compound=-num_iters*2-1000; //waiting is worse than any other action for(enum Move first_me_move=BOW;first_me_move<=OVERHEAD;++first_me_move){ results[first_me_move]=monte_carlo(num_iters,first_me_move,me,opponent); struct SimulationStat *cur=&results[first_me_move]; cur->compound=cur->win*4+cur->draw*1-cur->lose*2; } qsort(results,OVERHEAD-WAIT+1,sizeof(*results),stat_compare); for(int i=0;i<OVERHEAD-BOW+1;++i){ struct SimulationStat *cur=&results[i]; // fprintf(stderr,"%c: %f%% win, %f%% draw, %f%% lose => %d\n","WBGIPO"[cur->first_me_move],(double)cur->win/num_iters*100.,(double)cur->draw/num_iters*100.,(double)cur->lose/num_iters*100.,cur->compound); } for(int i=0;i<2;++i){ results[i]=monte_carlo(num_shortlist_iters,results[i].first_me_move,me,opponent); struct SimulationStat *cur=&results[i]; cur->compound=cur->win*2+cur->draw*1; } qsort(results,2,sizeof(*results),stat_compare); for(int i=0;i<2;++i){ struct SimulationStat *cur=&results[i]; // fprintf(stderr,"%c: %f%% win, %f%% draw, %f%% lose => %d\n","WBGIPO"[cur->first_me_move],(double)cur->win/num_shortlist_iters*100.,(double)cur->draw/num_shortlist_iters*100.,(double)cur->lose/num_shortlist_iters*100.,cur->compound); } putchar("WBGIPO"[results[0].first_me_move]); return 0; }