Exemple #1
0
/* 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);
}