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

📄 knockorpass.c

📁 足球机器人仿真组CMU97的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
         (Mem->MarkerValid(THEIR_GOAL) &&           Mem->GetMarkerDistance(THEIR_GOAL) < SHOOT_DIST) )      *KnockOrPass = 'k';    else       *KnockOrPass = 'd';    *BallTo = THEIR_GOAL;    int myType = Mem->GetMyLocationsPositionType();    int mySide = Mem->GetMyLocationsPositionSide();    if ( myType <= DEFENDER &&   mySide == CENTER ){      if (Mem->GetMyLocationSide() == RIGHT) /* Actual side */        *BallTo = RF_FLAG;   /* center backs shouldn't clear it up the middle */      else        *BallTo = LF_FLAG;       }    if ( myType != FORWARD )      *KnockOrPass = 'c';  /* avoid players */    return WHATEVER;  }#endif#if PASSER_DEBUG  printf("Running the DT stuff\n");#endif  /* Find the best teammate */  float Confidences[NumActions];  /* Array to keep confidence that pass will succeed */  /* Limit the options that are considered */  /* if (NumOpen > 3) NumOpen = 3;         */#if PASS_DEBUG  /* Random choice among DT options */  /* int receiverIndex = int_random(NumOpen);*/  /* First choice among DT options (like WTW)*/  printf("random pass\n");  int receiverIndex = 0;  int receiver = actions[receiverIndex];  float PassSuccessConf = 1;#else   int receiverIndex = FindTreeConfidences(NumActions,actions,action_types,Confidences);  if (receiverIndex<0) receiverIndex=0;  /* To adjust for passing in self */  /*  printf("%d hurry:%d -- ",Mem->MyNumber,hurry);  for (int i=0; i<NumActions; i++)    printf("%d ",actions[i]);  printf("\n");  */  /* Overwrite the max value */  receiverIndex = RLforReceiver(NumActions,actions,action_types,Confidences);  int receiver = actions[receiverIndex];  float PassSuccessConf = Confidences[receiverIndex];#endif  /* printf("%d passing to %d\n",Mem->MyNumber,receiver); */#if 0  static int Attempts = 0, Shots = 0;  if (action_types[receiverIndex] == RL_KNOCK_ACTION &&      receiver == THEIR_GOAL)    Shots++;  if ( Attempts++%100 == 0 ){    char fileName[100];    sprintf(fileName,"rlDat/rlDatShots%d.dat",Mem->MyNumber);    FILE *shotsFile = fopen(fileName,"w");    fprintf(shotsFile,"%d shots out of %d attempts (%.1f\%)\n",            Shots,Attempts,100*((float)Shots)/Attempts);    fclose(shotsFile);  }#endif  if (action_types[receiverIndex]==RL_KNOCK_ACTION)    *KnockOrPass = 'k';  else    *KnockOrPass = 'p';  *BallTo = receiver;#if 0    /* printf("          None will succeed\n");    */  if (receiver == Mem->MyNumber /* || PassSuccessConf < 0 */){#if 1    *KnockOrPass = 'k';    *BallTo = THEIR_GOAL;    return WHATEVER;#endif    /* printf("          None will succeed\n");    */    if ( hurry ||          (Mem->MarkerValid(THEIR_GOAL) &&           Mem->GetMarkerDistance(THEIR_GOAL) < SHOOT_DIST) )      *KnockOrPass = 'k';    else       *KnockOrPass = 'd';    *BallTo = THEIR_GOAL;    int myType = Mem->GetMyLocationsPositionType();    int mySide = Mem->GetMyLocationsPositionSide();    if ( myType <= DEFENDER &&   mySide == CENTER ){      if (Mem->GetMyLocationSide() == RIGHT)  /* Actual side */        *BallTo = RF_FLAG;   /* center backs shouldn't clear it up the middle */      else        *BallTo = LF_FLAG;       }    if ( myType != FORWARD )      *KnockOrPass = 'c';  /* avoid players */#if PASSER_DEBUG    printf("Don't pass with confidence of %.1f\n",PassSuccessConf);#endif    return WHATEVER;  }  else{    /* printf("ChooseReceiverTree returned %d\n",receiver); */    *BallTo = receiver;  }#endif  if ( *KnockOrPass == 'p' && ( !*BallTo || *BallTo>TEAM_SIZE ) )    my_error("Need to pass to a teammate with a valid number (rl)");  return WHATEVER;}/*****************************************************************************//*****************************************************************************//****************   OLD STUFF ************************************************//*****************************************************************************//*****************************************************************************//*****************************************************************************/#if 0int WorkRightWing(char *KnockOrPass, int *BallTo){  /* This is brain dead */  float dist;  int MyPositionType = Mem->GetMyPositionType();  int MyPositionSide = Mem->GetMyPositionSide();  *KnockOrPass = 'p';  if (MyPositionType < DEFENDER){    *BallTo = Mem->EncodePosition(DEFENDER,RIGHT); /* encode has to make receiver 						      > teammate */  }  else if (MyPositionType < FORWARD){    if ( MyPositionSide == CENTER )      *BallTo = Mem->EncodePosition(MyPositionType,RIGHT);    else      *BallTo = Mem->EncodePosition(MyPositionType+1,MyPositionSide);  }  else { /* MyPositionType == FORWARD */    if ( MyPositionSide != CENTER )      *BallTo = Mem->EncodePosition(FORWARD,CENTER);    else {      *KnockOrPass = 'k';      *BallTo = THEIR_GOAL;    }  }  return WHATEVER;}#endif/*****************************************************************************/#if 0#define OLD_PREF_LIST 0/* Based on your position, prioritize your possible receivers *//* return the number of options in the priority list          */int BuildPreferenceList(int MyPositionType, int MyPositionSide, 			int PreferenceList[]){  int MyLocationSide = Mem->GetMyLocationSide();    int NumOptions=0;#if OLD_PREF_LIST    /* from client 11-2 */  /* build pref lists */  switch (MyPositionType){  case FORWARD:     if ( MyPositionSide == CENTER );  /* Never Pass */    else{      NumOptions = (int_random(5) ? 1 : 0); /* shoot 1 in 5 times */      PreferenceList[0] = Mem->EncodePosition(FORWARD,CENTER);    }    break;  case MIDFIELDER:    if ( MyPositionSide == CENTER ){      NumOptions = 5;      PreferenceList[0] = Mem->EncodePosition(MIDFIELDER,RIGHT );      PreferenceList[1] = Mem->EncodePosition(MIDFIELDER,LEFT  );      PreferenceList[2] = Mem->EncodePosition(FORWARD   ,RIGHT );      PreferenceList[3] = Mem->EncodePosition(FORWARD   ,LEFT  );      PreferenceList[4] = Mem->EncodePosition(FORWARD   ,CENTER);    }    else{      NumOptions = 3;      PreferenceList[0] = Mem->EncodePosition(FORWARD , MyPositionSide);      PreferenceList[1] = Mem->EncodePosition(FORWARD , CENTER        );      PreferenceList[2] = Mem->EncodePosition(FORWARD ,-MyPositionSide);      /* preceding line assumes LEFT = -RIGHT */    }    break;  case DEFENDER:      case SWEEPER:  case GOALTENDER:    if ( MyPositionSide == CENTER ){      NumOptions = 7;      PreferenceList[0] = Mem->EncodePosition(DEFENDER  ,RIGHT );      PreferenceList[1] = Mem->EncodePosition(DEFENDER  ,LEFT  );      PreferenceList[2] = Mem->EncodePosition(MIDFIELDER,RIGHT );      PreferenceList[3] = Mem->EncodePosition(MIDFIELDER,LEFT  );      PreferenceList[4] = Mem->EncodePosition(MIDFIELDER,CENTER);      PreferenceList[5] = Mem->EncodePosition(FORWARD   ,RIGHT );      PreferenceList[6] = Mem->EncodePosition(FORWARD   ,LEFT  );    }    else{      NumOptions = 3;      PreferenceList[0] = Mem->EncodePosition(MIDFIELDER,MyPositionSide);      PreferenceList[1] = Mem->EncodePosition(FORWARD   ,MyPositionSide);      PreferenceList[2] = Mem->EncodePosition(MIDFIELDER,CENTER);     }    break;  }				        /* built pref lists */#else  /* build pref lists */  switch (MyPositionType){  case FORWARD:     if ( MyPositionSide == CENTER );  /* Never Pass */    else{      NumOptions = (int_random(3) ? 1 : 0); /* shoot 1 in 3 times */      PreferenceList[0] = Mem->EncodePosition(FORWARD,CENTER);    }    break;  case MIDFIELDER:    if ( MyPositionSide == CENTER ){      NumOptions = 5;      PreferenceList[0] = Mem->EncodePosition(FORWARD   , MyLocationSide );      PreferenceList[1] = Mem->EncodePosition(FORWARD   ,-MyLocationSide );      PreferenceList[2] = Mem->EncodePosition(FORWARD   , CENTER);      PreferenceList[3] = Mem->EncodePosition(MIDFIELDER, MyLocationSide );      PreferenceList[4] = Mem->EncodePosition(MIDFIELDER,-MyLocationSide );    }    else{      NumOptions = 4;      PreferenceList[0] = Mem->EncodePosition(FORWARD   , CENTER        );      PreferenceList[1] = Mem->EncodePosition(MIDFIELDER, CENTER );      PreferenceList[2] = Mem->EncodePosition(FORWARD   , MyPositionSide);      PreferenceList[3] = Mem->EncodePosition(FORWARD   ,-MyPositionSide);      /* preceding line assumes LEFT = -RIGHT */    }    break;  case DEFENDER:        if ( MyPositionSide == CENTER ){      NumOptions = 3;      PreferenceList[0] = Mem->EncodePosition(MIDFIELDER, MyLocationSide);      PreferenceList[1] = Mem->EncodePosition(MIDFIELDER,-MyLocationSide);      PreferenceList[2] = Mem->EncodePosition(MIDFIELDER, CENTER);     }    else{      NumOptions = 3;      PreferenceList[0] = Mem->EncodePosition(MIDFIELDER,MyPositionSide);      PreferenceList[1] = Mem->EncodePosition(FORWARD   ,MyPositionSide);      PreferenceList[2] = Mem->EncodePosition(MIDFIELDER,CENTER);     }    break;  case SWEEPER:  case GOALTENDER:    if ( MyPositionSide == CENTER ){      NumOptions = 7;      PreferenceList[0] = Mem->EncodePosition(DEFENDER  , MyLocationSide );      PreferenceList[1] = Mem->EncodePosition(DEFENDER  ,-MyLocationSide );      PreferenceList[2] = Mem->EncodePosition(MIDFIELDER, MyLocationSide );      PreferenceList[3] = Mem->EncodePosition(MIDFIELDER,-MyLocationSide );      PreferenceList[4] = Mem->EncodePosition(MIDFIELDER, CENTER);      PreferenceList[5] = Mem->EncodePosition(FORWARD   , MyLocationSide );      PreferenceList[6] = Mem->EncodePosition(FORWARD   ,-MyLocationSide );    }    break;  }				        /* built pref lists */#endif  return NumOptions;}#endif/*****************************************************************************/#if 0/* This function just prioritizes the players that are considered    as receivers and then takes the favorite receiver  */int WorkTheWings(char *KnockOrPass, int *BallTo){#if 0  /* Base pass on my position */  int MyPositionType = Mem->GetMyPositionType();  int MyPositionSide = Mem->GetMyPositionSide();#else  /* Base pass on my location */  int MyPositionType = Mem->GetPositionTypeOfMyLocation();  int MyPositionSide = Mem->GetPositionSideOfMyLocation();#endif  int PreferenceList[TEAM_SIZE];  int NumOptions = BuildPreferenceList(MyPositionType,MyPositionSide,PreferenceList);  int FoundReceiver = FALSE;  for(int i=0; !FoundReceiver && i<NumOptions; i++){    if ( Mem->PositionOccupied(PreferenceList[i]) && 	 Mem->GetPositionHolder(PreferenceList[i]) != Mem->MyNumber ){      *BallTo = PreferenceList[i];      FoundReceiver = TRUE;    }  }  if (FoundReceiver)    *KnockOrPass = 'p';            /* *BallTo already set */  else {  /* No positions occupied, so shoot */    if ( Mem->MarkerValid(THEIR_GOAL) && Mem->GetMarkerDistance(THEIR_GOAL) < SHOOT_DIST )      *KnockOrPass = 'k';    else       *KnockOrPass = 'd';    *BallTo = THEIR_GOAL;    if ( MyPositionType <= DEFENDER && MyPositionSide == CENTER )      *BallTo = RF_FLAG;   /* center backs shouldn't clear it up the middle */  }  return WHATEVER;}#endif/*****************************************************************************/

⌨️ 快捷键说明

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