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

📄 data.c

📁 RoboCup 2D 仿真组冠军源代码之1997年冠军队——CMUnited97源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* data.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"void GetStampedName( char *name, char *outputName ){  char date[100],weekday[10],month[10],temp[10];  int  day,hour,min,sec,year;  FILE *dateFile;    /* Coach client does this                                      */  /* system("date > ../date.log");        /* Put the date in a file */  dateFile = fopen("../date.log","r");  fscanf(dateFile,"%[^\n]",date);         /* Scan it in             */  fclose(dateFile);    sscanf(date,"%s %s %d %d:%d:%d %s %d",	 weekday,month,&day,&hour,&min,&sec,temp,&year);  sprintf(name,"../%s-%s%d-%d:%d:%d",outputName,month,day,hour,min,sec);}/*****************************************************************************/#if SAVE_COLLECT_DATAstatic FILE *CdataFile = NULL;#endifvoid RecordCollectData( float TurnAngle, float GoPower){#if SAVE_COLLECT_DATA     static char CdataFileName[100];  if ( Mem->NewCoach ){     /** Open the output file with a time stamp **/    GetStampedName(CdataFileName,"collect.dat");    CdataFile = fopen(CdataFileName,"a");        fprintf(CdataFile,"%% -----------------------------------------\n");    fprintf(CdataFile,"%% Net used (if any): %s\n",INIT_ToUse_FILE);    fprintf(CdataFile,"%% -----------------------------------------\n");    fprintf(CdataFile,"%% Dist  Ang  VMag  TAng  GPow R\n");    fprintf(CdataFile,"%% -----------------------------------------\n");    /** Unsetting Mem->NewCoach in RecordCollectResult **/  }  if (CdataFile == NULL) {    CdataFile = fopen(CdataFileName,"a");  }  /* vdir was 4th input before 6/12/96                                        */  /* float vdir = 180 - Mem->GetBallRelVelDirection();  /* Reverse the direction */  /* if (vdir == 180) vdir = 0;                      /* Unreverse if it was 0 */  /* CleanAngle(&vdir);                                                       */  fprintf(CdataFile,"  %4.1f %5.1f %4.1f ",	  Mem->GetBallDistance(),Mem->GetBallAngle(),	  Mem->GetBallRelVelMagnitude());	  /* Mem->GetBallRelVelMagnitude()*(Mem->CurrentTime - Mem->LastTime) ); */          /* Assuming always on narrow view when using nns */  fprintf(CdataFile,"%6.2f %4.2f ", TurnAngle, GoPower);#endif}/*****************************************************************************/void RecordCollectResult(char Result){#if SAVE_COLLECT_DATA     if (Mem->RecordCollectData)   /** Never collected the data, so don't **/    return;                     /** record the result                  **/  if ( CdataFile != NULL ){     /** Only the client that recorded data **/    static int counter = 0;    static int misses  = 0;    static int saves   = 0;    static int goals   = 0;    if ( Mem->NewCoach ){ /** First time through, reset everything **/      counter = misses = saves = 0;      Mem->NewCoach = FALSE;    }    fprintf(CdataFile,"%c\n",Result);    switch(Result){    case COLLECT_MISS: misses++; break;     case COLLECT_SAVE: saves++;  break;    case COLLECT_GOAL: goals++;  break;    }        if ( ++counter%(SAVE_FREQ)==0 ){      fprintf(CdataFile,"%%misses: %d/%d = %4.1f%%   saves: %d/%d = %4.1f%%   goals: %d/%d = %4.1f%%\n",	      misses,counter,(float) 100*misses/counter,	      saves,counter,(float) 100*saves/counter,	      goals,counter,(float) 100*goals/counter);      fprintf(CdataFile,"%%saves/goals: %d/%d = %4.1f%%\n",	      saves,goals+saves,(float) 100*saves/(goals+saves));      fclose(CdataFile);      CdataFile = NULL; /** Set it back to Null so RecordCollectData knows to reopen **/    }  }#endif}/*****************************************************************************/void GetPassData(char *outStream, int receiver, char sortBy){  float angle,distance;  if ( !Mem->TeammateAngleValid(receiver) ){    if (sortBy == 'a')      my_error("Need to know player angle to get tree stats!!");    else       angle = 0;  }  else     angle = Mem->GetTeammateAngle(receiver);  if ( !Mem->TeammateDistanceValid(receiver) )    distance = 0;  else     distance = Mem->GetTeammateDistance(receiver);    GetPassData(outStream,distance,angle,sortBy);}/* Can be used to get data to a point--not just a receiver */void GetPassData(char *outStream, float receiverDist, float receiverAng, 		 char sortBy){  char MySide = Mem->MySide, TheirSide = Mem->TheirSide;  /* If sorting by angle, put receiver's angle at 0           */  /* If sorting by distance, use 0 as the key (closest first) */  float key = 0;  /* Assume that if I'm passing, I know at least the angle    */  if ( sortBy == 'a' ){    key = receiverAng;  }  int teammates[TEAM_SIZE];  int NumTeammates = Mem->SortPlayersBy('m',sortBy,key,teammates);  int opponents[TEAM_SIZE];  int NumOpponents = Mem->SortPlayersBy('t',sortBy,key,opponents);  int counter = 0;  for (int i=0; i<NumTeammates; i++){  /* Sorted by angle insures receiver's first */    if ( Mem->PlayerValid(MySide, teammates[i]) ){      if ( Mem->GetTeammateDistance(teammates[i]) >= 150 ){	char msg[200];	sprintf(msg,"player %d valid (%.1f)  and  > 150 (%.1f)?  I'm at (%.1f,%.1f) (conf %.1f),  other's at (%.1f, %.1f) (conf %.1f)\n",		teammates[i],Mem->TeammateValid(teammates[i]),		Mem->GetTeammateDistance(teammates[i]),		Mem->GetGlobalX(),Mem->GetGlobalY(),Mem->MarkerValid(THEIR_GOAL),		Mem->GetPlayerGlobalX(Mem->MySide,teammates[i]),		Mem->GetPlayerGlobalY(Mem->MySide,teammates[i]),		Mem->PlayerValid(Mem->MySide,teammates[i]));	my_error(msg);      }      sprintf(&outStream[counter],"%5.1f,%6.1f,",	      Mem->GetPlayerDistance(MySide, teammates[i]), 	      fabs(Mem->GetPlayerAngle(MySide, teammates[i]) - key));      counter+=13;    }    else{ /* Only angle is valid */      sprintf(&outStream[counter],"?,%6.1f,",	      fabs(Mem->GetPlayerAngle(MySide, teammates[i]) - key));      counter+=9;    }  }  for (int i=NumTeammates; i<TEAM_SIZE-1; i++){ /* -1 to leave out self */    sprintf(&outStream[counter],"?,?,");    counter+=4;  }  int NumOpsEntered = 0;  for (int i=0; i<NumOpponents; i++){  /* Sorted by angle insures receiver's first */    if ( opponents[i] == 1 &&	 Mem->MarkerValid(THEIR_GOAL) &&	 receiverDist == Mem->GetMarkerDistance(THEIR_GOAL) &&	 receiverAng  == Mem->GetMarkerAngle(THEIR_GOAL) ){      /* Special Case:  Disregard the goalie if shooting */      i++;    }    else if ( Mem->PlayerValid(TheirSide, opponents[i]) ){      sprintf(&outStream[counter],"%5.1f,%6.1f,",	      Mem->GetPlayerDistance(TheirSide, opponents[i]), 	      fabs(Mem->GetPlayerAngle(TheirSide, opponents[i]) - key));      counter+=13;      NumOpsEntered++;    }    else{ /* Only angle is valid */      sprintf(&outStream[counter],"?,%6.1f,",	      fabs(Mem->GetPlayerAngle(TheirSide, opponents[i]) - key));      counter+=9;      NumOpsEntered++;    }  }  for (int i=NumOpsEntered; i<TEAM_SIZE; i++){    sprintf(&outStream[counter],"?,?,");    counter+=4;  }  /* Now some stats. If want more, make dist,ang into arrays, use loop*/  /* What if distance isn't valid? */   if ( receiverDist ){    float RD = receiverDist;    float RA = receiverAng;#define NUM_STATS 15    float dist[NUM_STATS]     = {4 ,8 ,12,4 ,8 ,12,4 ,8 ,12,RD,RD,RD,RD,RD,RD};    float ang[NUM_STATS]      = {4 ,4 ,4 ,8 ,8 ,8 ,12,12,12,1 ,2 ,3 ,4 ,5 ,6 };    float fromDist[NUM_STATS] = {RD,RD,RD,RD,RD,RD,RD,RD,RD,0 ,0 ,0 ,0 ,0 ,0 };    float fromAng[NUM_STATS]  = {RA,RA,RA,RA,RA,RA,RA,RA,RA,RA,RA,RA,RA,RA,RA};        for (int i=0; i<NUM_STATS; i++){      sprintf(&outStream[counter],"%d, %d, %d, ",	      Mem->NumTeammatesWithin(dist[i],ang[i],fromDist[i],fromAng[i]),	      Mem->NumOpponentsWithin(dist[i],ang[i],fromDist[i],fromAng[i]),	      Mem->NumPlayersWithin  (dist[i],ang[i],fromDist[i],fromAng[i]) );      counter += 9;    }  }  else{ /* distance isn't valid */    for (int i=0; i<NUM_STATS; i++){      sprintf(&outStream[counter],"?, ?, ?, ");      counter += 9;    }  }}/*****************************************************************************/#if SAVE_PASS_DATAstatic FILE *PdataFile = NULL;#endifvoid RecordPassData( int receiver ){#if SAVE_PASS_DATA     static char PdataFileName[100];  if ( Mem->NewCoach ){     /** Open the output file with a time stamp **/    GetStampedName(PdataFileName,"pass.dat");    PdataFile = fopen(PdataFileName,"a");        fprintf(PdataFile,"| -----------------------------------------\n");    fprintf(PdataFile,"| Tree used (if any): %s\n",TREE_STEM);    fprintf(PdataFile,"| -----------------------------------------\n");    fprintf(PdataFile,"| teammates(me) opponents(me) stats(me) teammates(rec) opponents(rec) stats(rec) res\n");    fprintf(PdataFile,"| -----------------------------------------\n");

⌨️ 快捷键说明

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