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

📄 player.c

📁 机器足球2D比赛程序 对trlen_base_2002的改进
💻 C
📖 第 1 页 / 共 4 页
字号:
		} else if (area == 4 || area == 5) {			if (canThroughPass(posThroughPass, speedThroughPass)) {				soc = directPass(posThroughPass, PASS_FAST);				Log.logWithTime(777, " pass to tmt(%d)",						SoccerTypes::getIndex(tmtPass) + 1);			} else {				soc = clearBall(CLEAR_BALL_GOAL, sideType);				Log.logWithTime(777, " clear goal ");			}		} else {			soc = shoot(posShoot);			Log.logWithTime(777, " last shoot with the p (%f)", shootP);		}	} else if (WM->			getFastestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp)			== WM->getAgentObjectType() && !WM->isDeadBallThem()) {	// if fastest to ball		soc = intercept(false);	// intercept the ball		soc = adjustDashPowerForStamina(soc, ACT_INTERCEPT);	} else		soc = markOpponent(posStrat);	return soc;}/*! 中场的决策。 * */SoccerCommand Player::midfielderStrategy(){	SoccerCommand soc(CMD_ILLEGAL);	// for goal	VecPosition posGoal(52.5, 0);	//for me	VecPosition posAgent = WM->getAgentGlobalPosition();	VecPosition posStrat = WM->getMyStrategicPosition();	double myX = posAgent.getX();	double myY = posAgent.getY();	int area = WM->getPosArea(posAgent);	//自己所在的区域。	SideT sideType = WM->getSide();	AngDeg angBody = WM->getAgentGlobalBodyAngle();	AngDeg angBody2Goal =		VecPosition::normalizeAngle((posGoal - posAgent).getDirection() -				angBody);	int numOpp4 = WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,			Circle(posAgent, 4.0));	// for ball	VecPosition posBall = WM->getBallPos();	double spBall = WM->getBallSpeed();	// for shoot	VecPosition posShoot(PITCH_LENGTH / 2.0,			(-1 +			 2 * (WM->getCurrentCycle() % 2)) * 0.4 *			SS->getGoalWidth());	// for pass	ObjectT tmtPass = OBJECT_ILLEGAL;	VecPosition posPass;	AngDeg angPass = 0;	double speedPass = 2.0;	// for through pass	ObjectT tmtThroughPass = OBJECT_ILLEGAL;	VecPosition posThroughPass(52.5, 0);	AngDeg angThroughPass = 0;	double speedThroughPass = 2.0;	// for dribble	AngDeg angDribble = 0;	// for intercept	int iTmp;	formationDecision();	//确定比赛阵型。	if (WM->getConfidence(OBJECT_BALL) < PS->getBallConfThr()) {		soc = searchBall();	// if ball pos unknown	} else if (WM->isBallKickable()) {	// if kickable		double shootP = WM->getAgentShootProbability(posShoot);		if (shootP >= 0.9) {			soc = shoot(posShoot);			Log.logWithTime(777, " shoot with the p (%f)", shootP);			return soc;		} else if (fabs(angBody2Goal) > 90 && numOpp4 == 0) {			if (spBall < 1.7) {				soc =					turnWithBallTo(0, PS->getTurnWithBallAngThr(),							PS->getTurnWithBallFreezeThr());				Log.logWithTime(777, " turn with ball");			} else {				soc = freezeBall();				Log.logWithTime(777, " freeze ball");			}		} else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_FAST)) {			soc = dribble(angDribble, DRIBBLE_FAST);			Log.logWithTime(777, " dribble fast ");		} else if (canThroughPass(tmtThroughPass, posThroughPass)) {			soc = throughPass(tmtThroughPass, posThroughPass);			Log.logWithTime(777, "through pass");		} else if (WM->canSmartPassBallToTmt(tmtPass, angPass, speedPass)) {			soc = smartPassBallToTmt(tmtPass, angPass, speedPass);			Log.logWithTime(777, " pass to tmt(%d)",					SoccerTypes::getIndex(tmtPass) + 1);		} else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_SLOW)) {			soc = dribble(angDribble, DRIBBLE_SLOW);			Log.logWithTime(777, " dribble slow ");		} else if (isPlayOn				&& WM->canDribble(angDribble, DRIBBLE_WITHBALL)) {			soc = dribble(angDribble, DRIBBLE_WITHBALL);			Log.logWithTime(777, " dribble with ball ");		} else if (area == 1) {			soc = clearBall(CLEAR_BALL_DEFENSIVE, sideType);			Log.logWithTime(777, " clear defensive ");		} else if (area == 2) {			soc = clearBall(CLEAR_BALL_OFFENSIVE_SIDE, sideType);			Log.logWithTime(777, " clear offensive ");		} else if (area == 3) {			soc = clearBall(CLEAR_BALL_OFFENSIVE, sideType);			Log.logWithTime(777, " clear offensive side ");		} else if (area == 4 || area == 5) {			if (canThroughPass(posThroughPass, speedThroughPass)) {				soc = directPass(posThroughPass, PASS_FAST);				Log.logWithTime(777, " pass to tmt(%d)",						SoccerTypes::getIndex(tmtPass) + 1);			} else {				soc = clearBall(CLEAR_BALL_GOAL, sideType);				Log.logWithTime(777, " clear goal ");			}		} else {			soc = shoot(posShoot);			Log.logWithTime(777, " last shoot with the p (%f)", shootP);		}	} else if (WM->			getFastestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp)			== WM->getAgentObjectType() && !WM->isDeadBallThem()) {	// if fastest to ball		soc = intercept(false);	// intercept the ball		soc = adjustDashPowerForStamina(soc, ACT_INTERCEPT);	} else {		//if (WM->isBallInOurPossesion())		//	soc = remarkOpponent(posStrat);		//else		soc = remarkOpponent(posStrat);	}	return soc;}/*! 前锋的决策。 * */SoccerCommand Player::attackerStrategy(){	SoccerCommand soc(CMD_ILLEGAL);	// for goal	VecPosition posGoal(52.5, 0);	//for me	VecPosition posAgent = WM->getAgentGlobalPosition();	VecPosition posStrat = WM->getMyStrategicPosition();	double myX = posAgent.getX();	double myY = posAgent.getY();	int area = WM->getPosArea(posAgent);	//自己所在的区域。	SideT sideType = WM->getSide();	AngDeg angBody = WM->getAgentGlobalBodyAngle();	AngDeg angBody2Goal =		VecPosition::normalizeAngle((posGoal - posAgent).getDirection() -				angBody);	int numOpp4 = WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,			Circle(posAgent, 4.0));	// for ball	VecPosition posBall = WM->getBallPos();	double spBall = WM->getBallSpeed();	// for shoot	VecPosition posShoot(PITCH_LENGTH / 2.0,			(-1 +			 2 * (WM->getCurrentCycle() % 2)) * 0.4 *			SS->getGoalWidth());	// for pass	ObjectT tmtPass = OBJECT_ILLEGAL;	VecPosition posPass;	AngDeg angPass = 0;	double speedPass = 2.0;	// for through pass	ObjectT tmtThroughPass = OBJECT_ILLEGAL;	VecPosition posThroughPass(52.5, 0);	double speedThroughPass = 1.9;	// for dribble;	AngDeg angDribble = 0;	// for intercept	int iTmp;	// for clear forward	VecPosition posCorner(52.5, sign(myY) * 34);	AngDeg angToCorner = (posCorner - posAgent).getDirection();	VecPosition posClearF = posBall + VecPosition(15, angToCorner, POLAR);	double speedClearF = 1.0;	formationDecision();	//确定比赛阵型。	if (WM->getConfidence(OBJECT_BALL) < PS->getBallConfThr()) {		soc = searchBall();	// if ball pos unknown	}	else if (WM->isBallKickable()) {	// if kickable		//------------------------------------------------------//		double shootP = WM->getAgentShootProbability(posShoot);		if (shootP >= 0.9) {			soc = shoot(posShoot);			Log.logWithTime(777, " shoot with the p (%f)", shootP);			//cout << endl << "shoot   " << shootP * 100;			return soc;		} else if (canThroughPass(tmtThroughPass, posThroughPass)) {			soc = throughPass(tmtThroughPass, posThroughPass);			Log.logWithTime(777, "through pass");		} else if (fabs(angBody2Goal) > 90 && numOpp4 == 0) {			if (spBall < 1.7) {				soc =					turnWithBallTo(0, PS->getTurnWithBallAngThr(),							PS->getTurnWithBallFreezeThr());				Log.logWithTime(777, " turn with ball");			} else {				soc = freezeBall();				Log.logWithTime(777, " freeze ball");			}		} else if (canClearForward(posClearF, speedClearF)) {			soc = kickTo(posClearF, speedClearF);		} else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_FAST)) {			soc = dribble(angDribble, DRIBBLE_FAST);			Log.logWithTime(777, " dribble fast ");		} else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_SLOW)) {			soc = dribble(angDribble, DRIBBLE_SLOW);			Log.logWithTime(777, " dribble slow ");		} else if (WM->canSmartPassBallToTmt(tmtPass, angPass, speedPass)) {			soc = smartPassBallToTmt(tmtPass, angPass, speedPass);			Log.logWithTime(777, " pass to tmt(%d)",					SoccerTypes::getIndex(tmtPass) + 1);		} else if (isPlayOn				&& WM->canDribble(angDribble, DRIBBLE_WITHBALL)) {			soc = dribble(angDribble, DRIBBLE_WITHBALL);			Log.logWithTime(777, " dribble with ball ");		} else if (area == 1) {			soc = clearBall(CLEAR_BALL_DEFENSIVE, sideType);			Log.logWithTime(777, " clear defensive ");		} else if (area == 2) {			soc = clearBall(CLEAR_BALL_OFFENSIVE_SIDE, sideType);			Log.logWithTime(777, " clear offensive ");		} else if (area == 3) {			soc = clearBall(CLEAR_BALL_OFFENSIVE, sideType);			Log.logWithTime(777, " clear offensive side ");		} else if (area == 4 || area == 5) {			if (canThroughPass(posThroughPass, speedThroughPass)) {				soc = directPass(posThroughPass, PASS_FAST);			} else {				soc = clearBall(CLEAR_BALL_GOAL, sideType);				Log.logWithTime(777, " clear goal ");			}		} else {			soc = shoot(posShoot);			Log.logWithTime(777, " last shoot with the p (%f)", shootP);		}	} else if (WM->			getFastestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp)			== WM->getAgentObjectType() && !WM->isDeadBallThem()) {	// if fastest to ball		soc = intercept(false);	// intercept the ball		soc = adjustDashPowerForStamina(soc, ACT_INTERCEPT);	} else{		soc = remarkOpponent(posStrat);		//soc = markOpponent(posStrat);	}	return soc;}/*!  *  */bool Player::canThroughPass(VecPosition & pos, double &speed){	VecPosition posAgent = WM->getAgentGlobalPosition();	double myX = posAgent.getX();	double myY = posAgent.getY();	VecPosition posBall = WM->getBallPos();	//if (myX<30)	if (WM->getPosArea(posAgent) < 5)		return false;	Line line1 =		Line::makeLineFromPositionAndAngle(VecPosition(36, -20), 0);	AngDeg angL, angR, angMax;	if (myY > 0) {		angL = (VecPosition(36, -20) - posBall).getDirection();		angR = (VecPosition(52.5, -20) - posBall).getDirection();		line1 =			Line::makeLineFromPositionAndAngle(VecPosition(36, -20), 0);	} else {		angL = (VecPosition(52.5, 20) - posBall).getDirection();		angR = (VecPosition(36, 20) - posBall).getDirection();		line1 = Line::makeLineFromPositionAndAngle(VecPosition(36, 20), 0);	}	double dist = posAgent.getDistanceTo(VecPosition(52.5, 0));	AngDeg ang =		WM->getDirectionOfWidestAngle(posBall, angL, angR, &angMax, dist);	Line line2 = Line::makeLineFromPositionAndAngle(posBall, ang);	pos = line2.getIntersection(line1);	if (fabs(myY) > 10)		speed = 1.9;	else		speed = 1.7;	if (angMax > 10)		return true;	else		return false;}/*!  *  */bool Player::canThroughPass(ObjectT & tmt, VecPosition & pos){	//return false;	VecPosition posAgent = WM->getAgentGlobalPosition();	double myX = posAgent.getX();	double myY = posAgent.getY();	VecPosition posBall = WM->getBallPos();	int n = WM->getPlayerNumber();	if (myX < 0)		return false;	double dConfThr = PS->getPlayerConfThr();	int iIndex;	ObjectSetT setTmt = OBJECT_SET_TEAMMATES;	VecPosition posTmt(0, 0), posEnd(52.5, 0);	AngDeg angTmp, angMax = -1000;	//找到一个最好的接球者。	for (ObjectT o = WM->iterateObjectStart(iIndex, setTmt, dConfThr);			o != OBJECT_ILLEGAL;			o = WM->iterateObjectNext(iIndex, setTmt, dConfThr)) {		if (SoccerTypes::getIndex(o) + 1 == WM->getPlayerNumber())	// don't include me			continue;		posTmt = WM->getGlobalPosition(o);		if (fabs(posTmt.getY()) < 15 && posTmt.getX() < 30)			continue;		if (fabs(posTmt.getY()) > 24 && posTmt.getX() > 30)			continue;		if (fabs(posTmt.getX()) < 25				&& WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,					Circle(posTmt, 8.0)) > 0)			continue;		double distToTmt = posBall.getDistanceTo(posTmt);		if (distToTmt < 5 || distToTmt > 30)			continue;		if (fabs(myY) > fabs(posTmt.getY()))			continue;		if (posTmt.getX() < 30)			posEnd.setVecPosition(52.5, posTmt.getY());		else			posEnd.setVecPosition(52.5, sign(posTmt.getY()) * 6);		VecPosition posShoot =			getThroughPassShootingPoint(o, posEnd, &angTmp);		if (WM->				getNrInSetInCircle(OBJECT_SET_OPPONENTS,					Circle(posShoot, 8.0)) > 0)			continue;		if (angTmp > angMax) {			angMax = angTmp;			tmt = o;			pos = posEnd;		}	}	WM->iterateObjectDone(iIndex);	if (angMax >= 15) {		//cout << endl << " haha !  a good through pass!!";		return true;	} else		return false;}/* * */bool Player::canClearForward(VecPosition & posClearF, double &speedClearF){	VecPosition posBall = WM->getBallPos();	VecPosition posAgent = WM->getAgentGlobalPosition();	double myX = posAgent.getX();	double myY = posAgent.getY();	if (myX > 30 || myX < -5)		return false;	else if (WM->			getNrInSetInCircle(OBJECT_SET_OPPONENTS,				Circle(posBall, 10)) == 0)		return false;	else {		VecPosition posL, posR;		if (myY > -0.5) {			posL.setVecPosition(52.5, 20);			posR.setVecPosition(52.5, 34);		} else {			posL.setVecPosition(52.5, -34);			posR.setVecPosition(52.5, -20);		}		AngDeg angL = (posL - posBall).getDirection();		AngDeg angR = (posR - posBall).getDirection();		AngDeg angMax;		AngDeg angClear =			WM->getDirectionOfWidestAngle(posBall, angL, angR, &angMax, 30);		posClearF = posBall + VecPosition(15, angClear, POLAR);		if (myX < 20)			speedClearF = 1.9;		else if (myX < 25)			speedClearF = 1.0;		else			speedClearF = 0.5;		return true;	}}

⌨️ 快捷键说明

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