📄 knockorpass.c
字号:
(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 + -