📄 teamorder.cpp
字号:
/****************************************************************************************************
teamorder.cpp 艾数机器人队形源文件
Purpose:
完成特定目的地队形分配,每个队形使用最合适的角色
author:
yy_cn
Created Time:
2006-5-10
****************************************************************************************************/
#include "area.h"
#include "teamorder.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 队形管理
//
// public
TeamManager::TeamManager (void)
: _teams ()
{
/********************************************************************************
//
// 添加所有的队形
//
********************************************************************************/
addTeam (new AttackTeam ());
addTeam (new DefendTeam ());
}
// public
TeamManager::~TeamManager (void)
{
for_each (_teams.begin (), _teams.end (), delete_t <TeamOrder> ());
}
// public
void
TeamManager::addTeam (TeamOrder *team)
{
if (team == 0) {
//ASSERT (false);
return;
}
//
// 初始化分配角色
//
if (team->initRoles () == false) {
//ASSERT (false);
;
}
//
// 初始化使用队形时所需要的状态条件
//
if (team->initCondition () == false) {
//ASSERT (false);
;
}
_teams.push_back (team);
}
// public
TeamOrder *
TeamManager::getTeam (const AreaInfo *areaInfo,
BallSpeed speed,
BallDirection direction,
BallPower power,
GuardLeak leak)
{
typedef vector <TeamOrder *>::const_iterator iterator;
iterator itend = _teams.end ();
for (iterator it = _teams.begin (); it != itend; ++it) {
if ((*it)->isHit (areaInfo, speed, direction, power, leak) == true)
return (*it);
}
//
// 没有一个队形符合条件 .... 真惨,使用基本队形
//
return _teams[0];
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 队形
//
// public
TeamOrder::TeamOrder (TeamNumber number)
: _number (number)
, _areas ()
, _speeds ()
, _directions ()
, _powers ()
, _leaks ()
{
for (int i = 0; i < PLAYERS_PER_SIDE; ++i)
_roles[i] = RT_UNKNOWN; // 队形所需要的角色
}
// public
TeamOrder::~TeamOrder (void)
{
}
// protected
bool
TeamOrder::isHit (const AreaInfo *areaInfo,
BallSpeed speed,
BallDirection direction,
BallPower power,
GuardLeak leak)
{
//
// 检查是否符合条件
// 如果所有状态条件都符合则说明当前队形符合条件
//
{
//
// 区域检查
//
typedef vector <BallArea>::const_iterator iterator;
iterator itend = _areas.end ();
for (iterator it = _areas.begin (); it != itend; ++it) {
if ((*it) == areaInfo->getArea ())
break;
}
if (it == itend)
return false;
}
{
//
// 球速检查
//
typedef vector <BallSpeed>::const_iterator iterator;
iterator itend = _speeds.end ();
for (iterator it = _speeds.begin (); it != itend; ++it) {
if (*it == speed)
break;
}
if (it == itend)
return false;
}
{
//
// 球的运动方向
//
typedef vector <BallDirection>::const_iterator iterator;
iterator itend = _directions.end ();
for (iterator it = _directions.begin (); it != itend; ++it) {
if (*it == direction)
break;
}
if (it == itend)
return false;
}
{
//
// 球的控制权
//
typedef vector <BallPower>::const_iterator iterator;
iterator itend = _powers.end ();
for (iterator it = _powers.begin (); it != itend; ++it) {
if (*it == power)
break;;
}
if (it == itend)
return false;
}
{
//
// 漏洞
//
typedef vector <GuardLeak>::const_iterator iterator;
iterator itend = _leaks.end ();
for (iterator it = _leaks.begin (); it != itend; ++it) {
if (*it == leak)
break;
}
if (it == itend)
return false;
}
//
// 所有条件都符合
//
return true;
}
// public
void
TeamOrder::addRole (RoleType role, int index)
{
if (index < 0 || index >= PLAYERS_PER_SIDE) {
//ASSERT (false);
return;
}
_roles[index] = role;
}
// public
void
TeamOrder::addBallArea (BallArea area)
{
_areas.push_back (area);
}
// public
void
TeamOrder::addBallSpeed (BallSpeed speed)
{
_speeds.push_back (speed);
}
// public
void
TeamOrder::addBallDirection (BallDirection direction)
{
_directions.push_back (direction);
}
// public
void
TeamOrder::addBallPower (BallPower power)
{
_powers.push_back (power);
}
// public
void
TeamOrder::addGuardLeak (GuardLeak leak)
{
_leaks.push_back (leak);
}
// public
void
TeamOrder::addAllArea (void)
{
for (int i = BA_1; i <= BA_20; ++i)
addBallArea ((BallArea) i);
}
// public
void
TeamOrder::addAllSpeed (void)
{
for (int i = BS_LOW; i <= BS_MORE_HIGH; ++i)
addBallSpeed ((BallSpeed) i);
}
// public
void
TeamOrder::addAllDirection (void)
{
for (int i = BD_REST; i <= BD_RIGHT_BOTTOM; ++i)
addBallDirection ((BallDirection) i);
}
// public
void
TeamOrder::addAllPower (void)
{
for (int i = BP_OPPONENT; i <= BP_WITHOUT; ++i)
addBallPower ((BallPower) i);
}
// public
void
TeamOrder::addAllGuardLeak (void)
{
for (int i = GL_OPPONENT_MORE_BIG; i <= GL_SELF_MORE_BIG; ++i)
addGuardLeak ((GuardLeak) i);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 进攻队形
//
// public virtual
bool
AttackTeam::initRoles (void)
{
{
//
// 为此队形安排角色
//
addRole (RT_GOALKEEPER, 0); // 守门员
addRole (PT_ATTACK, 1); // 进攻者 - 负责中路等待配合并进攻
addRole (PT_VANGUARD_TOP, 2); // 上前锋 - 进攻时负责上半个球场
addRole (PT_VANGUARD_BOTTOM, 3); // 下前锋 - 进攻时负责下半个球场
addRole (PT_ATTACK_DEFEND, 4); // 进攻后卫 - 选择进攻队形时负责防守的机器人
}
return true;
}
// public virtual
bool
AttackTeam::initCondition (void)
{
{
//
// 添加符合的区域
//
addBallArea (BA_3);
addBallArea (BA_4);
addBallArea (BA_5);
addBallArea (BA_8);
addBallArea (BA_9);
addBallArea (BA_10);
addBallArea (BA_13);
addBallArea (BA_14);
addBallArea (BA_15);
addBallArea (BA_18);
addBallArea (BA_19);
addBallArea (BA_20);
}
addAllSpeed (); // 添加所有速度
addAllDirection (); // 添加所有方向
addAllPower (); // 添加所有控制权
addAllGuardLeak (); // 添加所有漏洞
//{
// //
// // 添加符合的球的速度
// //
// addBallSpeed ();
//}
//{
// //
// // 添加符合的球的运动方向
// //
// addBallDirection ();
//}
//{
// //
// // 添加符合的球控制权
// //
// addBallPower ();
//}
//
//{
// //
// // 添加符合的漏洞情况
// //
// addGuardLeak ();
//}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 防守队形 - TN_DEFEND
//
// public virtual
bool
DefendTeam::initRoles (void)
{
//
// 为此队形安排角色
//
addRole (RT_GOALKEEPER, 0); // 守门员
addRole (PT_DEFEND_LEFT_TOP, 1); // 左上角的后卫
addRole (PT_DEFEND_LEFT_BOT, 2); // 左下角的后卫
addRole (PT_DEFEND_RIGHT_TOP, 3); // 右上角的后卫
addRole (PF_DEFEND_RIGHT_BOT, 4); // 右下角的后卫
return true;
}
// public virtual
bool
DefendTeam::initCondition (void)
{
{
//
// 添加符合的区域
//
addBallArea (BA_1);
addBallArea (BA_2);
addBallArea (BA_6);
addBallArea (BA_7);
addBallArea (BA_11);
addBallArea (BA_12);
addBallArea (BA_16);
addBallArea (BA_17);
}
addAllSpeed (); // 添加所有速度
addAllDirection (); // 添加所有方向
addAllPower (); // 添加所有控制权
addAllGuardLeak (); // 添加所有漏洞
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -