📄 formation.c
字号:
/* formation.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 MARK_DEBUG 0#define TEAM_POSITION_DEBUG 0/*************************************************************************//************************ FORMATION DEFINITIONS **************************//*************************************************************************/#define GOALIEMAXACTIVEDIST 14#define MAXACTIVEDIST 40#define MININACTIVEDIST 10/************************ 4-3-3 Formation ********************************/#define f433_GOALIE_BUF 2#define f433_POSITION_BUF 3#define f433_GOALTENDERX (-52)#define f433_SWEEPERX (-43)#define f433_DEFENDERX (-35)#define f433_MIDFIELDERX 0#define f433_FORWARDX 30#define f433_LEFTY 25#define f433_CENTERY 0#define f433_RIGHTY (-25)#define f433_HOMEXRANGE f433_FORWARDX#define f433_HOMEYRANGE f433_LEFTY#define f433_MAXXRANGE (f433_FORWARDX*2)#define f433_MAXYRANGE (((Y0+5) - f433_LEFTY)*2)void Initialize_433_Formation(Formation *formation){ /* set position within goal stay, in penalty box */ formation->SetPosition(f433_GOALIE, f433_GOALTENDERX, f433_CENTERY, f433_GOALIE_BUF, (X0- (-f433_GOALTENDERX))*2, GOAL_WIDTH, /*(-f433_GOALTENDERX - PA_X)*2, PA_Y*2,*/ (X0- (-f433_GOALTENDERX))*2, GOAL_WIDTH, GOALIEMAXACTIVEDIST, MININACTIVEDIST, FALSE); /* set position inside penalty box, don't go more than half-way to mid */ formation->SetPosition(f433_SWEEPER, f433_SWEEPERX, f433_CENTERY, f433_POSITION_BUF, (X0- (-f433_SWEEPERX))*2, PA_Y*2, -f433_SWEEPERX - X0/2, (Y0+5)*2, GOALIEMAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_RIGHT_DEFENSE, f433_DEFENDERX, f433_RIGHTY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_CENTER_DEFENSE, f433_DEFENDERX+5, f433_CENTERY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_LEFT_DEFENSE, f433_DEFENDERX, f433_LEFTY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_RIGHT_MIDFIELD, f433_MIDFIELDERX, f433_RIGHTY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_CENTER_MIDFIELD, f433_MIDFIELDERX, f433_CENTERY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_LEFT_MIDFIELD, f433_MIDFIELDERX, f433_LEFTY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_RIGHT_WING, f433_FORWARDX, f433_RIGHTY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_CENTER_FORWARD, f433_FORWARDX+5, f433_CENTERY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f433_LEFT_WING, f433_FORWARDX, f433_LEFTY, f433_POSITION_BUF, f433_HOMEXRANGE,f433_HOMEYRANGE, f433_MAXXRANGE ,f433_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); /* Candidate receivers will be chosen on the fly here */ int dummylist[TEAM_SIZE]; for (int i=0; i<TEAM_SIZE; i++) formation->SetCandidateReceivers(i,0,dummylist); formation->AllocateUnits(6); /* Positions listed in order of importance, captain indicated as index into list */ int defenders[5] = {f433_GOALIE, f433_SWEEPER, f433_CENTER_DEFENSE, f433_RIGHT_DEFENSE, f433_LEFT_DEFENSE}; formation->GetUnit(DEFENSIVE_UNIT)->InitializeUnit(DEFENSIVE_UNIT, 5, defenders, 0); int midfielders[3] = {f433_CENTER_MIDFIELD, f433_RIGHT_MIDFIELD, f433_LEFT_MIDFIELD}; formation->GetUnit(MIDFIELD_UNIT)->InitializeUnit(MIDFIELD_UNIT, 3, midfielders, 0); int forwards[3] = {f433_CENTER_FORWARD, f433_RIGHT_WING, f433_LEFT_WING}; formation->GetUnit(FORWARD_UNIT)->InitializeUnit(FORWARD_UNIT, 3, forwards, 0); int rights[3] = {f433_RIGHT_DEFENSE, f433_RIGHT_MIDFIELD, f433_RIGHT_WING}; formation->GetUnit(RIGHT_UNIT)->InitializeUnit(RIGHT_UNIT, 3, rights, 1); int centers[5] = {f433_GOALIE, f433_SWEEPER, f433_CENTER_DEFENSE, f433_CENTER_MIDFIELD, f433_CENTER_FORWARD}; formation->GetUnit(CENTER_UNIT)->InitializeUnit(CENTER_UNIT, 5, centers, 3); int lefts[3] = {f433_LEFT_DEFENSE, f433_LEFT_MIDFIELD, f433_LEFT_WING}; formation->GetUnit(LEFT_UNIT)->InitializeUnit(LEFT_UNIT, 3, lefts, 1);}int *Build_433_ReceiverList(int *PreferenceList, int position){ int NumOptions=0; int LocationSide = Mem->GetMyLocationSide(); switch ( position ){ case f433_CENTER_FORWARD: break; case f433_LEFT_WING: case f433_RIGHT_WING: NumOptions = (int_random(3) ? 1 : 0); /* shoot 1 in 3 times */ PreferenceList[0] = f433_CENTER_FORWARD; break; case f433_CENTER_MIDFIELD: NumOptions = 5; PreferenceList[0] = (LocationSide == RIGHT) ? f433_RIGHT_WING : f433_LEFT_WING; PreferenceList[1] = (LocationSide == RIGHT) ? f433_LEFT_WING : f433_RIGHT_WING; PreferenceList[2] = f433_CENTER_FORWARD; PreferenceList[3] = (LocationSide == RIGHT) ? f433_RIGHT_MIDFIELD :f433_LEFT_MIDFIELD; PreferenceList[4] = (LocationSide == RIGHT) ? f433_LEFT_MIDFIELD :f433_RIGHT_MIDFIELD; break; case f433_RIGHT_MIDFIELD: case f433_LEFT_MIDFIELD: NumOptions = 4; PreferenceList[0] = f433_CENTER_FORWARD; PreferenceList[1] = f433_CENTER_MIDFIELD; PreferenceList[2] = (LocationSide == RIGHT) ? f433_RIGHT_WING : f433_LEFT_WING; PreferenceList[3] = (LocationSide == RIGHT) ? f433_LEFT_WING : f433_RIGHT_WING; break; case f433_CENTER_DEFENSE: NumOptions = 3; PreferenceList[0] = (LocationSide == RIGHT) ? f433_RIGHT_MIDFIELD : f433_LEFT_MIDFIELD; PreferenceList[1] = (LocationSide == RIGHT) ? f433_LEFT_MIDFIELD : f433_RIGHT_MIDFIELD; PreferenceList[2] = f433_CENTER_MIDFIELD; break; case f433_RIGHT_DEFENSE: case f433_LEFT_DEFENSE: NumOptions = 3; PreferenceList[0] = (LocationSide == RIGHT) ? f433_RIGHT_MIDFIELD : f433_LEFT_MIDFIELD; PreferenceList[1] = (LocationSide == RIGHT) ? f433_RIGHT_WING : f433_LEFT_WING; PreferenceList[2] = f433_CENTER_MIDFIELD; break; case f433_SWEEPER: case f433_GOALIE: NumOptions = 7; PreferenceList[0] = (LocationSide == RIGHT) ? f433_RIGHT_DEFENSE : f433_LEFT_DEFENSE; PreferenceList[1] = (LocationSide == RIGHT) ? f433_LEFT_DEFENSE : f433_RIGHT_DEFENSE; PreferenceList[2] = (LocationSide == RIGHT) ? f433_RIGHT_MIDFIELD : f433_LEFT_MIDFIELD; PreferenceList[3] = (LocationSide == RIGHT) ? f433_LEFT_MIDFIELD : f433_RIGHT_MIDFIELD; PreferenceList[4] = f433_CENTER_MIDFIELD; PreferenceList[5] = (LocationSide == RIGHT) ? f433_RIGHT_WING : f433_LEFT_WING; PreferenceList[6] = (LocationSide == RIGHT) ? f433_LEFT_WING : f433_RIGHT_WING; break; } for (int i = NumOptions; i<TEAM_SIZE; i++) PreferenceList[i] = position; /* Pad list with own number, meaning no receiver */}/************************ 4-4-2 Formation ********************************/#define f442_GOALIE_BUF 2#define f442_POSITION_BUF 3#define f442_GOALTENDERX (-52)#define f442_SWEEPERX (-43)#define f442_DEFENDERX (-35)#define f442_MIDFIELDERX 0#define f442_FORWARDX 30#define f442_LEFTY 25#define f442_INSIDELEFTY 15#define f442_CENTERY 0#define f442_INSIDERIGHTY (-f442_INSIDELEFTY)#define f442_RIGHTY (-f442_LEFTY)#define f442_HOMEXRANGE f442_FORWARDX#define f442_HOMEYRANGE f442_LEFTY#define f442_MAXXRANGE (f442_FORWARDX*2)#define f442_MAXYRANGE (((Y0+5) - f442_LEFTY)*2)#define f442_INSIDE_MAXYRANGE (((Y0+5) - f442_INSIDELEFTY)*2)void Initialize_442_Formation(Formation *formation){ /* set position within goal stay, in penalty box */ formation->SetPosition(f442_GOALIE, f442_GOALTENDERX, f442_CENTERY, f442_GOALIE_BUF, (X0- (-f442_GOALTENDERX))*2, GOAL_WIDTH, /*(-f442_GOALTENDERX - PA_X)*2, PA_Y*2,*/ (X0- (-f442_GOALTENDERX))*2, GOAL_WIDTH, GOALIEMAXACTIVEDIST, MININACTIVEDIST, FALSE); /* set position inside penalty box, don't go more than half-way to mid */ formation->SetPosition(f442_SWEEPER, f442_SWEEPERX, f442_CENTERY, f442_POSITION_BUF, (X0- (-f442_SWEEPERX))*2, PA_Y*2, -f442_SWEEPERX - X0/2, (Y0+5)*2, GOALIEMAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_RIGHT_DEFENSE, f442_DEFENDERX, f442_RIGHTY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_CENTER_DEFENSE, f442_DEFENDERX+5, f442_CENTERY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_LEFT_DEFENSE, f442_DEFENDERX, f442_LEFTY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_RIGHT_MIDFIELD, f442_MIDFIELDERX, f442_RIGHTY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_DEFENSIVE_CENTER_MIDFIELD, f442_MIDFIELDERX-10, f442_CENTERY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_OFFENSIVE_CENTER_MIDFIELD, f442_MIDFIELDERX+10, f442_CENTERY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_LEFT_MIDFIELD, f442_MIDFIELDERX, f442_LEFTY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_RIGHT_WING, f442_FORWARDX, f442_INSIDERIGHTY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_INSIDE_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); formation->SetPosition(f442_LEFT_WING, f442_FORWARDX, f442_INSIDELEFTY, f442_POSITION_BUF, f442_HOMEXRANGE,f442_HOMEYRANGE, f442_MAXXRANGE ,f442_INSIDE_MAXYRANGE, MAXACTIVEDIST, MININACTIVEDIST, TRUE); /* Candidate receivers will be chosen on the fly here */ int dummylist[TEAM_SIZE]; for (int i=0; i<TEAM_SIZE; i++) formation->SetCandidateReceivers(i,0,dummylist); formation->AllocateUnits(6); /* Positions listed in order of importance, captain indicated as index into list */ int defenders[5] = {f442_GOALIE, f442_SWEEPER, f442_CENTER_DEFENSE, f442_RIGHT_DEFENSE, f442_LEFT_DEFENSE}; formation->GetUnit(DEFENSIVE_UNIT)->InitializeUnit(DEFENSIVE_UNIT, 5, defenders, 0); int midfielders[4] = {f442_DEFENSIVE_CENTER_MIDFIELD, f442_OFFENSIVE_CENTER_MIDFIELD, f442_RIGHT_MIDFIELD, f442_LEFT_MIDFIELD}; formation->GetUnit(MIDFIELD_UNIT)->InitializeUnit(MIDFIELD_UNIT, 4, midfielders, 0); int forwards[2] = {f442_RIGHT_WING, f442_LEFT_WING}; formation->GetUnit(FORWARD_UNIT)->InitializeUnit(FORWARD_UNIT, 2, forwards, 0); int rights[3] = {f442_RIGHT_DEFENSE, f442_RIGHT_MIDFIELD, f442_RIGHT_WING}; formation->GetUnit(RIGHT_UNIT)->InitializeUnit(RIGHT_UNIT, 3, rights, 1); int centers[5] = {f442_GOALIE, f442_SWEEPER, f442_CENTER_DEFENSE, f442_DEFENSIVE_CENTER_MIDFIELD, f442_OFFENSIVE_CENTER_MIDFIELD}; formation->GetUnit(CENTER_UNIT)->InitializeUnit(CENTER_UNIT, 5, centers, 4); int lefts[3] = {f442_LEFT_DEFENSE, f442_LEFT_MIDFIELD, f442_LEFT_WING}; formation->GetUnit(LEFT_UNIT)->InitializeUnit(LEFT_UNIT, 3, lefts, 1);}int *Build_442_ReceiverList(int *PreferenceList, int position){ int NumOptions=0; int Side = Mem->GetMyPositionSide(); int LocationSide = Mem->GetMyLocationSide(); switch ( position ){ case f442_LEFT_WING: case f442_RIGHT_WING: NumOptions = (int_random(3) ? 1 : 0); /* shoot 1 in 3 times */ PreferenceList[0] = (Side == RIGHT) ? f442_LEFT_WING : f442_RIGHT_WING; break; case f442_OFFENSIVE_CENTER_MIDFIELD: NumOptions = 2; PreferenceList[0] = (LocationSide == RIGHT) ? f442_RIGHT_WING : f442_LEFT_WING; PreferenceList[1] = (LocationSide == RIGHT) ? f442_LEFT_WING : f442_RIGHT_WING; break; case f442_DEFENSIVE_CENTER_MIDFIELD: NumOptions = 5; PreferenceList[0] = (LocationSide == RIGHT) ? f442_RIGHT_WING : f442_LEFT_WING; PreferenceList[1] = (LocationSide == RIGHT) ? f442_LEFT_WING : f442_RIGHT_WING; PreferenceList[2] = f442_OFFENSIVE_CENTER_MIDFIELD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -