⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.c

📁 足球机器人仿真组CMU97的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* parse.c * CMUnited-97 (soccer client for Robocup-97) * Peter Stone <pstone@cs.cmu.edu> * Computer Science Department * Carnegie Mellon University * Copyright (C) 1997 Peter Stone * * CMUnited-97 was created by Peter Stone and Manuela Veloso * * You may copy and distribute this program freely as long as you retain this notice. * If you make any changes or have any comments we would appreciate a message. */#include "global.h"#define SELF      0#define REFEREE  (SELF+1)#define COACH    (REFEREE+1)#define TEAMMATE (COACH+1)#define OPPONENT (TEAMMATE+1)int ParseSights(int, char*);int ParseSound(int, char*);void ParseRefereeMessage(char*, int);void ParseSensoryData(char *SensoryInfo){  //printf("%s\n",SensoryInfo);  char *message;  int time;  if ( SensoryInfo[1]=='s' ){            /* see */    SensoryInfo += 5;                    /* "(see " */    time = get_int(SensoryInfo);         /* %d */    while ( isdigit(*SensoryInfo) ) SensoryInfo++; /* advance past int */    int closestMarker = ParseSights(time, SensoryInfo);    Mem->NewSight = TRUE;    if (Mem->PlayMode == BEFORE_KICK_OFF)      Mem->StoppedClockTime += Mem->TimePerSight();    Mem->Tick(closestMarker,time);  /* Tick relies on closestMarker < 0 if none visible */  }  else if ( SensoryInfo[1]=='h' ){       /* hear */    SensoryInfo += 6;                    /* "(hear " */    time = get_int(SensoryInfo);         /* %d */    while ( isdigit(*SensoryInfo) ) SensoryInfo++; /* advance past int */    int type = ParseSound(time, SensoryInfo);    if ( type == TEAMMATE)      Mem->UpdateMobileObjectPositions(FALSE); /* might have ball or player info */  }}/*********************************************************************************//*********************************************************************************//*********************************************************************************/int ParseSights(int time, char *buffer){  float dist, ang;  float dirChng = NODIR;   float distChng;  char object;     /* just the first letter */  char player_side, player_number;  int marker, line;  int view_qual = LOW_QUALITY;  /* Tick relies on closestMarker < 0 if none visible */  int closestMarker = -1, processThisMarker;  float closestMarkerDist, motionInfoDist = 1000;  while (*buffer != ')'){    line = marker = NUM_MARKERS;    dirChng = NODIR;    player_number = player_side = 0;    processThisMarker = FALSE;    buffer+=3;            /* " ((" */    object = *buffer;     /* object's first letter */    if ( object=='g' ){      buffer+=5;          /* "goal " */      if ( *buffer=='r' )         marker = GOAL_R; else      if ( *buffer=='l' )         marker = GOAL_L; else      my_error("goal ?");    } else    if ( object=='G' )            marker = Mem->ClosestGoal(); else    if ( object=='f' ){      buffer+=5;          /* "flag " */      if ( *buffer=='r' ){	buffer+=2;	if ( *buffer=='b' )       marker = FLAG_RB; else	if ( *buffer=='t' )       marker = FLAG_RT; else	my_error("flag r ?");      } else      if ( *buffer=='l' ){	buffer+=2;	if ( *buffer=='b' )       marker = FLAG_LB; else	if ( *buffer=='t' )       marker = FLAG_LT; else	my_error("flag l ?");      } else      if ( *buffer=='c' ){	buffer+=2;	if ( *buffer=='b' )       marker = FLAG_B; else	if ( *buffer=='t' )       marker = FLAG_T; else	my_error("flag c ?");      } else      if ( *buffer=='p' ){	buffer+=2;	if ( *buffer=='r' ){	  buffer+=2;	  if ( *buffer=='t')      marker = FLAG_PRT; else	  if ( *buffer=='c')      marker = FLAG_PRC; else	  if ( *buffer=='b')      marker = FLAG_PRB; else	    	  my_error("flag p r ?");	} else	if ( *buffer=='l' ){	  buffer+=2;	  if ( *buffer=='t')      marker = FLAG_PLT; else	  if ( *buffer=='c')      marker = FLAG_PLC; else	  if ( *buffer=='b')      marker = FLAG_PLB; else	    	  my_error("flag p l ?");	} else	my_error("flag p ?");      } else      my_error("flag ?");    } else    if ( object=='F' ){      if ( Mem->ClosestFlag() )   marker = Mem->ClosestFlag();      else ; /* it's a flag I don't handle yet */    } else    if ( object=='l' ){      buffer+=5;          /* "line " */      if ( *buffer=='r' )         line   = LINE_R; else      if ( *buffer=='l' )         line   = LINE_L; else      if ( *buffer=='t' )         line   = LINE_T; else      if ( *buffer=='b' )         line   = LINE_B; else      my_error("line ?");    } else    if ( object=='p' ){      buffer+=6;          /* "player" */      if ( *buffer == ' ' ){              /* there's a team */ 	buffer++;	if ( !strncmp(buffer,Mem->MyTeamName,Mem->MyTeamNameLen) )	  player_side = Mem->MySide;	else	  player_side = Mem->TheirSide;	while ( isalnum(*buffer) ) buffer++;   /* advance past team name */	if ( *buffer== ' ' ){             /* there's a number */	  buffer++;	  player_number = get_int(buffer);	}      }    }    while (*(buffer++) != ')'); /* advance to end of object */    buffer++;                   /* " " */            ang = get_float(buffer);    while ( *buffer != ' ' && *buffer != ')' ) buffer++;    if ( *buffer != ')' ) {                  /* 'high' quality     */      buffer++;                              /* " " */      view_qual = HIGH_QUALITY;      Mem->view_quality = HIGH_QUALITY;      /* should be 'high'   */      dist = ang;      ang = get_float(buffer);      while ( *buffer != ' ' && *buffer != ')' ) buffer++;    }    else       Mem->view_quality = LOW_QUALITY;       /* should be 'low'    */    if ( *buffer != ')' ){      buffer++;                              /* " " */      distChng = get_float(buffer);      while ( *(buffer++) != ' ' );          /* advance past num and space */      dirChng  = get_float(buffer);      while ( *buffer != ')' ) buffer++;    }    if ( *buffer != ')' ) my_error("Should be done with object info here");    buffer++;                                /* ")" */    if ( Mem->view_quality == HIGH_QUALITY &&/* angle is larger than I though */	 object != 'l' &&                    /* Not a line  */	 dist > FEEL_DISTANCE && fabs(ang) > Mem->GetViewAngle()/2 ){      /* printf("%d:%d dist = %.1f, ang = %.1f so angle's wider than I think\n",	     Mem->MyNumber,Mem->CurrentTime,dist,ang);*/      if ( fabs(ang) > Mem->GetViewAngle(NORMAL_WIDTH)/2 )	Mem->view_width = WIDE_WIDTH;      else	Mem->view_width = NORMAL_WIDTH;     }    /* marker */    if ( marker < NUM_MARKERS ){                  /* It's a marker */      if ( view_qual == LOW_QUALITY ){               /* Low quality   */	;         /* DON'T BOTHER PROCESSING ANY??? I don't think it helps ... */	/*if ( closestMarkerDist > 0 ){	/*  closestMarkerDist = 0;                   /* Only process 1*/	/*  processThisMarker = TRUE;	/*}*/      }      else{                                          /* high quality  */	if ( closestMarker < 0 || dist < closestMarkerDist){	  closestMarker = marker;	  closestMarkerDist = dist;	  processThisMarker = TRUE;	}	if ( dirChng != NODIR && dist < motionInfoDist ){	  motionInfoDist = dist;	  processThisMarker = TRUE;	}      }            if ( processThisMarker ){	if ( view_qual == LOW_QUALITY )              /* low quality   */	  Mem->SeeMarker(marker, ang, time);	else if (dirChng == NODIR)                   /* high quality  */	  Mem->SeeMarker(marker, dist, ang, time);   /* No motion info*/	else	  Mem->SeeMarker(marker, dist, ang, distChng, dirChng, time);      }    }/* line */    else if ( line < NUM_MARKERS ){               /* It's a line   */      if ( *buffer != ')' )	/* There's another line coming.  Assuming lines happen	   last in the visual string and the closer line comes first */	;       else if ( view_qual == LOW_QUALITY )           /* low quality   */	Mem->SeeLine(line, ang, time);      else                                           /* high quality  */	Mem->SeeLine(line, dist, ang, time);    }/* ball */    else if ( object=='b' ){                      /* It's the ball */      if ( view_qual == LOW_QUALITY )                /* low quality   */	Mem->SeeBall(ang, time);      else if ( dirChng == NODIR )                   /* high quality  */	Mem->SeeBall(dist, ang, time);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -