📄 parse.c
字号:
/* 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 + -