/* Funcion principal del programa */ int main (int argc, char * argv[]) { player_t * player1; player_t * player2; int finishp; int p[2][2]; int opt; const char * progname1; const char * progname2; while ((opt = getopt(argc, argv, "bd:n:w:")) != -1) { switch (opt) { /* Establece el retraso entre movimiento y movimiento */ case 'd': delay = atoi (optarg); break; /* No usa SDL, solo recolecta estadisticsa. */ case 'b': graphicsp = 0; break; /* Numero de partidas para simular. */ case 'n': plays = atoi (optarg); break; /* Numero de particulas de muro */ case 'w': nwalls = atoi (optarg); break; default: /* '?' */ usage(); } } if (argc-optind < 2) usage(); progname1 = argv[optind++]; progname2 = argv[optind++]; if(graphicsp) { SDL_Init (SDL_INIT_VIDEO); SDL_WM_SetCaption ("AI Tron", NULL); screen = SDL_SetVideoMode(N * POINTSIZE, N * POINTSIZE, 32, SDL_HWSURFACE); if (screen == NULL) { fprintf (stderr, "El sistema no soporta esta resolucion.\n"); exit (-1); } } initialize_random(); player1 = create_player (progname1); player2 = create_player (progname2); for(current_play=0; current_play<plays; current_play++) { memset (map, 0, sizeof(map)); if (graphicsp) SDL_FillRect( screen, NULL, 0 ); random_position (&p[0][0], &p[0][1]); random_position (&p[1][0], &p[1][1]); prepare_player (player1, p[0][0], p[0][1]); prepare_player (player2, p[1][0], p[1][1]); write_cords (player1, p[1][0], p[1][1]); write_cords (player2, p[0][0], p[0][1]); walls(nwalls, player1, player2); /* Bucle principal */ finishp=0; while(!finishp) { SDL_Event event; draw_point (player1->i, player1->j, 255); draw_point (player2->i, player2->j, 65025); /* Lee los siguientes movimientos de cada bot */ read_cords (player1, &p[0][0], &p[0][1]); read_cords (player2, &p[1][0], &p[1][1]); /* Comprueba si alguien ha perdido */ finishp |= lossp (player1, p[0][0], p[0][1]); finishp |= lossp (player2, p[1][0], p[1][1]); if (!finishp && p[0][0]==p[1][0] && p[0][1]==p[1][1]) { player1->loses++; player2->loses++; finishp = 1; } /* Actualiza el mapa con los movimientos */ move (player1, p[0][0], p[0][1]); move (player2, p[1][0], p[1][1]); turns++; /* Informa del ultimo movimiento de cada bot al otro */ write_cords (player1, p[1][0], p[1][1]); write_cords (player2, p[0][0], p[0][1]); if (graphicsp) { /* Elimina procesos de la cola, y termina en caso de que el usuario lo haya solicitado. */ while( SDL_PollEvent( &event ) ){ if (event.type == SDL_QUIT) { plays = current_play; finishp = 1; } } SDL_Flip (screen); SDL_Delay (delay); } } finish_player (player1); finish_player (player2); } printf ("Resumen:\n"); printf (" %s: %d/%d\n", player1->name, plays - player1->loses, plays); printf (" %s: %d/%d\n", player2->name, plays - player2->loses, plays); printf ("\n"); printf ("Un total de %d turnos, %f turnos de media por partida.\n", turns, (float)turns/plays); close_player (player1); close_player (player2); finalize_random(); if (graphicsp) SDL_Quit (); return 0; }
TIMESTAMP player_read(OBJECT *obj) { char buffer[256]; char timebuf[64], valbuf[256], tbuf[64]; char tz[6]; int Y=0,m=0,d=0,H=0,M=0; double S=0; struct player *my = OBJECTDATA(obj,struct player); char unit[2]; TIMESTAMP t1; char *result=NULL; char256 value; int voff=0; /* TODO move this to tape.c and make the variable available to all classes in tape */ static enum {UNKNOWN,ISO,US,EURO} dateformat = UNKNOWN; if ( dateformat==UNKNOWN ) { static char global_dateformat[8]=""; gl_global_getvar("dateformat",global_dateformat,sizeof(global_dateformat)); if (strcmp(global_dateformat,"ISO")==0) dateformat = ISO; else if (strcmp(global_dateformat,"US")==0) dateformat = US; else if (strcmp(global_dateformat,"EURO")==0) dateformat = EURO; else dateformat = ISO; } Retry: result = my->ops->read(my, buffer, sizeof(buffer)); memset(timebuf, 0, 64); memset(valbuf, 0, 256); memset(tbuf, 0, 64); memset(value, 0, 256); memset(tz, 0, 6); if (result==NULL) { if (my->loopnum>0) { rewind_player(my); my->loopnum--; goto Retry; } else { close_player(my); my->status=TS_DONE; my->next.ts = TS_NEVER; my->next.ns = 0; goto Done; } } if (result[0]=='#' || result[0]=='\n') /* ignore comments and blank lines */ goto Retry; if(sscanf(result, "%32[^,],%256[^\n\r;]", tbuf, valbuf) == 2){ trim(tbuf, timebuf); trim(valbuf, value); if (sscanf(timebuf,"%d-%d-%d %d:%d:%lf %4s",&Y,&m,&d,&H,&M,&S, tz)==7){ //struct tm dt = {S,M,H,d,m-1,Y-1900,0,0,0}; DATETIME dt; switch ( dateformat ) { case ISO: dt.year = Y; dt.month = m; dt.day = d; break; case US: dt.year = d; dt.month = Y; dt.day = m; break; case EURO: dt.year = d; dt.month = m; dt.day = Y; break; } dt.hour = H; dt.minute = M; dt.second = (unsigned short)S; dt.nanosecond = (unsigned int)(1e9*(S-dt.second)); strcpy(dt.tz, tz); t1 = (TIMESTAMP)gl_mktime(&dt); if ((obj->flags & OF_DELTAMODE)==OF_DELTAMODE) /* Only request deltamode if we're explicitly enabled */ enable_deltamode(dt.nanosecond==0?TS_NEVER:t1); if (t1!=TS_INVALID && my->loop==my->loopnum){ my->next.ts = t1; my->next.ns = dt.nanosecond; while(value[voff] == ' '){ ++voff; } strcpy(my->next.value, value+voff); } } else if (sscanf(timebuf,"%d-%d-%d %d:%d:%lf",&Y,&m,&d,&H,&M,&S)>=4) { //struct tm dt = {S,M,H,d,m-1,Y-1900,0,0,0}; DATETIME dt; switch ( dateformat ) { case ISO: dt.year = Y; dt.month = m; dt.day = d; break; case US: dt.year = d; dt.month = Y; dt.day = m; break; case EURO: dt.year = d; dt.month = m; dt.day = Y; break; } dt.hour = H; dt.minute = M; dt.second = (unsigned short)S; dt.tz[0] = 0; dt.nanosecond = (unsigned int)(1e9*(S-dt.second)); t1 = (TIMESTAMP)gl_mktime(&dt); if ((obj->flags & OF_DELTAMODE)==OF_DELTAMODE) /* Only request deltamode if we're explicitly enabled */ enable_deltamode(dt.nanosecond==0?TS_NEVER:t1); if (t1!=TS_INVALID && my->loop==my->loopnum){ my->next.ts = t1; my->next.ns = dt.nanosecond; while(value[voff] == ' '){ ++voff; } strcpy(my->next.value, value+voff); } } else if (sscanf(timebuf,"%" FMT_INT64 "d%1s", &t1, unit)==2) { { int64 scale=1; switch(unit[0]) { case 's': scale=TS_SECOND; break; case 'm': scale=60*TS_SECOND; break; case 'h': scale=3600*TS_SECOND; break; case 'd': scale=86400*TS_SECOND; break; default: break; } t1 *= scale; if (result[0]=='+'){ /* timeshifts have leading + */ my->next.ts += t1; while(value[voff] == ' '){ ++voff; } strcpy(my->next.value, value+voff); } else if (my->loop==my->loopnum){ /* absolute times are ignored on all but first loops */ my->next.ts = t1; while(value[voff] == ' '){ ++voff; } strcpy(my->next.value, value+voff); } } } else if (sscanf(timebuf,"%lf", &S)==1) { if (my->loop==my->loopnum) { my->next.ts = (unsigned short)S; my->next.ns = (unsigned int)(1e9*(S-my->next.ts)); if ((obj->flags & OF_DELTAMODE)==OF_DELTAMODE) /* Only request deltamode if we're explicitly enabled */ enable_deltamode(my->next.ns==0?TS_NEVER:t1); while(value[voff] == ' '){ ++voff; } strcpy(my->next.value, value+voff); } } else { gl_warning("player was unable to parse timestamp \'%s\'", result); } } else { gl_warning("player was unable to split input string \'%s\'", result); } Done: return my->next.ns==0 ? my->next.ts : (my->next.ts+1); }