Answer.cpp

//------------------------------------------------------------------------------
/// @file
/// @author   ハル研究所プログラミングコンテスト実行委員会
///
/// @copyright  Copyright (c) 2019 HAL Laboratory, Inc.
/// @attention  このファイルの利用は、同梱のREADMEにある
///             利用条件に従ってください。
//------------------------------------------------------------------------------

#include "Answer.hpp"

//------------------------------------------------------------------------------
namespace hpc {

//------------------------------------------------------------------------------
/// コンストラクタ。
/// @detail 最初のステージ開始前に実行したい処理があればここに書きます。
Answer::Answer()
{
}

//------------------------------------------------------------------------------
/// デストラクタ。
/// @detail 最後のステージ終了後に実行したい処理があればここに書きます。
Answer::~Answer()
{
}

//------------------------------------------------------------------------------
/// 各ステージ開始時に呼び出される処理。
/// @detail 各ステージに対する初期化処理が必要ならここに書きます。
/// @param aStage 現在のステージ。
void Answer::initialize(const Stage& aStage)
{
}

//------------------------------------------------------------------------------
/// 各ターンのカメの行動を指定する。
/// @detail 各カメの行動を指定し、aActionsの要素に追加してください。
///         aActions[i]がi番目のカメの行動になります。
///         aActionsの要素数がaStage.turtlePositions()の要素数と異なる場合、アサートに失敗します。
/// @param[in] aStage 現在のステージ。
/// @param[out] aActions 各カメの行動を指定する配列。
void Answer::setActions(const Stage& aStage, Actions& aActions)
{
    // 解答コードのサンプルです。

    // まだ食べられていないエサを1つ選んで目的地に設定する。
    Point targetFoodPosition;
    for (Food food : aStage.foods()) {
        if (!food.isEaten()) {
            targetFoodPosition = food.pos();
            break;
        }
    }

    // すべてのカメを目的地に向かって移動させる。
    for (Point turtlePosition : aStage.turtlePositions()) {
        if (turtlePosition.x < targetFoodPosition.x) {
            aActions.add(Action_MoveRight);
        } else if (turtlePosition.x > targetFoodPosition.x) {
            aActions.add(Action_MoveLeft);
        } else if (turtlePosition.y < targetFoodPosition.y) {
            aActions.add(Action_MoveDown);
        } else if (turtlePosition.y > targetFoodPosition.y) {
            aActions.add(Action_MoveUp);
        } else {
            // 移動する必要がなければ、その場で待機する。
            aActions.add(Action_Wait);
        }
    }
}

//------------------------------------------------------------------------------
/// 各ステージ終了時に呼び出される処理。
/// @detail 各ステージに対する終了処理が必要ならここに書きます。
/// @param aStage 現在のステージ。
void Answer::finalize(const Stage& aStage)
{
}

} // namespace
// EOF