本文整理汇总了C++中MoveArray::addUnit方法的典型用法代码示例。如果您正苦于以下问题:C++ MoveArray::addUnit方法的具体用法?C++ MoveArray::addUnit怎么用?C++ MoveArray::addUnit使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MoveArray
的用法示例。
在下文中一共展示了MoveArray::addUnit方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: generateMoves
void GameState::generateMoves(MoveArray & moves, const IDType & playerIndex) const
{
moves.clear();
// which is the enemy player
IDType enemyPlayer = getEnemy(playerIndex);
// we are interested in all simultaneous moves
// so return all units which can move at the same time as the first
TimeType firstUnitMoveTime = getUnit(playerIndex, 0).firstTimeFree();
for (IDType unitIndex(0); unitIndex < _numUnits[playerIndex]; ++unitIndex)
{
// unit reference
const Unit & unit(getUnit(playerIndex,unitIndex));
// if this unit can't move at the same time as the first
if (unit.firstTimeFree() != firstUnitMoveTime)
{
// stop checking
break;
}
if (unit.previousMoveTime() == _currentTime && _currentTime != 0)
{
// CHANGED
// printf("ERROR: Previous Move: %s\n", unit.previousMove().moveString().c_str());
int a = 6;
}
moves.addUnit();
// generate attack moves
if (unit.canAttackNow())
{
for (IDType u(0); u<_numUnits[enemyPlayer]; ++u)
{
const Unit & enemyUnit(getUnit(enemyPlayer, u));
if (unit.canAttackTarget(enemyUnit, _currentTime) && enemyUnit.isAlive())
{
moves.add(Move(unitIndex, playerIndex, MoveTypes::ATTACK, u));
}
}
}
else if (unit.canHealNow())
{
for (IDType u(0); u<_numUnits[playerIndex]; ++u)
{
// units cannot heal themselves in broodwar
if (u == unitIndex)
{
continue;
}
const Unit & ourUnit(getUnit(playerIndex, u));
if (unit.canHealTarget(ourUnit, _currentTime) && ourUnit.isAlive())
{
moves.add(Move(unitIndex, playerIndex, MoveTypes::HEAL, u));
}
}
}
// generate the wait move if it can't attack yet
else
{
if (!unit.canHeal())
{
moves.add(Move(unitIndex, playerIndex, MoveTypes::RELOAD, 0));
}
}
// generate movement moves
if (unit.isMobile())
{
for (IDType d(0); d<Search::Constants::Num_Directions; ++d)
{
Move move(unitIndex, playerIndex, MoveTypes::MOVE, d);
Position dest;
Position dir(Search::Constants::Move_Dir[move._moveIndex][0],
Search::Constants::Move_Dir[move._moveIndex][1]);
// if the unit can attack the destination will be set by default move distance
if (unit.canAttackNow() || unit.canHeal())
{
dest = Position(Search::Constants::Move_Distance*dir.x(), Search::Constants::Move_Distance*dir.y()) + unit.pos();
}
// otherwise it will be a move until attack move
else
{
dest = unit.getMoveUntilAttackDest(dir, _currentTime);
}
if (isWalkable(dest))
{
moves.add(Move(unitIndex, playerIndex, MoveTypes::MOVE, d));
}
}
}
// if no moves were generated for this unit, it must be issued a 'PASS' move
//.........这里部分代码省略.........
示例2: generateMoves
void GameState::generateMoves(MoveArray & moves, const IDType & playerIndex) const
{
moves.clear();
// which is the enemy player
IDType enemyPlayer = getEnemy(playerIndex);
// make sure this player can move right now
const IDType canMove(whoCanMove());
if (canMove == enemyPlayer)
{
System::FatalError("GameState Error - Called generateMoves() for a player that cannot currently move");
}
// we are interested in all simultaneous moves
// so return all units which can move at the same time as the first
TimeType firstUnitMoveTime = getUnit(playerIndex, 0).firstTimeFree();
for (IDType unitIndex(0); unitIndex < _numUnits[playerIndex]; ++unitIndex)
{
// unit reference
const Unit & unit(getUnit(playerIndex,unitIndex));
// if this unit can't move at the same time as the first
if (unit.firstTimeFree() != firstUnitMoveTime)
{
// stop checking
break;
}
if (unit.previousActionTime() == _currentTime && _currentTime != 0)
{
System::FatalError("Previous Move Took 0 Time: " + unit.previousAction().moveString());
}
moves.addUnit();
// generate attack moves
if (unit.canAttackNow())
{
for (IDType u(0); u<_numUnits[enemyPlayer]; ++u)
{
const Unit & enemyUnit(getUnit(enemyPlayer, u));
bool invisible = false;
if (enemyUnit.type().hasPermanentCloak())
{
invisible = true;
for (IDType detectorIndex(0); detectorIndex < _numUnits[playerIndex]; ++detectorIndex)
{
// unit reference
const Unit & detector(getUnit(playerIndex, detectorIndex));
if (detector.type().isDetector() && detector.canSeeTarget(enemyUnit, _currentTime))
{
invisible = false;
break;
}
}
}
if (!invisible && unit.canAttackTarget(enemyUnit, _currentTime) && enemyUnit.isAlive())
{
moves.add(Action(unitIndex, playerIndex, ActionTypes::ATTACK, u));
//moves.add(Action(unitIndex, playerIndex, ActionTypes::ATTACK, unit.ID()));
}
}
}
else if (unit.canHealNow())
{
for (IDType u(0); u<_numUnits[playerIndex]; ++u)
{
// units cannot heal themselves in broodwar
if (u == unitIndex)
{
continue;
}
const Unit & ourUnit(getUnit(playerIndex, u));
if (unit.canHealTarget(ourUnit, _currentTime) && ourUnit.isAlive())
{
moves.add(Action(unitIndex, playerIndex, ActionTypes::HEAL, u));
//moves.add(Action(unitIndex, playerIndex, ActionTypes::HEAL, unit.ID()));
}
}
}
// generate the wait move if it can't attack yet
else
{
if (!unit.canHeal())
{
moves.add(Action(unitIndex, playerIndex, ActionTypes::RELOAD, 0));
}
}
// generate movement moves
if (unit.isMobile())
{
// In order to not move when we could be shooting, we want to move for the minimum of:
// 1) default move distance move time
// 2) time until unit can attack, or if it can attack, the next cooldown
double timeUntilAttack = unit.nextAttackActionTime() - getTime();
timeUntilAttack = timeUntilAttack == 0 ? unit.attackCooldown() : timeUntilAttack;
//.........这里部分代码省略.........