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