Action.hpp
//------------------------------------------------------------------------------
/// @file
/// @author ハル研究所プログラミングコンテスト実行委員会
///
/// @copyright Copyright (c) 2018 HAL Laboratory, Inc.
/// @attention このファイルの利用は、同梱のREADMEにある
/// 利用条件に従ってください。
//------------------------------------------------------------------------------
#pragma once
//------------------------------------------------------------------------------
#include "ActionType.hpp"
#include "CandidateLaneType.hpp"
#include "Vector2i.hpp"
//------------------------------------------------------------------------------
namespace hpc {
/// プレイヤーの行動。
/// @detail 生成された行動は、事前条件(@pre)を満たしている場合にのみ効力を発揮します。
/// それ以外の場合、その行動は無視され、何も起きません。
class Action
{
public:
/// @name 行動生成
/// @note プレイヤーはクッキーをとても大切にしているので
/// 生地を「捨てる」という行動は存在しません。
//@{
/// 「指定した生地置き場の生地をオーブンに入れる」という行動を生成する。
/// @detail aPutPos の位置に生地のカドが来るよう生地は配置されます。
/// そこから aPutPos + Vector2i(生地の横幅 - 1, 生地の縦幅 - 1) までを
/// 対角線とする長方形が、その生地が占有する空間です。
/// @note 生地を回転させることはできません。
/// @param aCandidateLaneType 対象の生地置き場。
/// @param aPieceIndex 生地置き場の何番目の生地を使うか。
/// @param aPutPos 生地をオーブンのどの位置に置くか。
/// @pre aPutPos に生地を置いたとき、オーブンの空間に収まっている。
/// @pre aPutPos に生地を置いたとき、オーブン内の他の生地と重ならない。
static Action Put(
CandidateLaneType aCandidateLaneType,
int aPieceIndex,
const Vector2i& aPutPos
);
/// 「何もしない」という行動を生成する。
static Action Wait();
//@}
/// @name コンストラクタ
//@{
/// 「何もしない」という行動を生成するコンストラクタ。
Action();
//@}
/// @name 問い合わせ
//@{
/// 行動タイプを取得する。
ActionType type() const;
/// 「何もしない」アクションか?
bool isWaiting() const;
/// 対象の生地置き場。
CandidateLaneType candidateLaneType() const;
/// 生地置き場の何番目の生地を対象とするか。
int pieceIndex() const;
/// 生地をオーブンのどの位置に置くか。
Vector2i putPos() const;
//@}
private:
/// @name プライベートメンバ変数
//@{
/// この行動の行動タイプ。
ActionType mType;
/// 対象の生地置き場。
CandidateLaneType mCandidateLaneType;
/// 生地置き場の何番目の生地を対象とするか。
int mPieceIndex;
/// 生地をオーブンのどの位置に置くか。
Vector2i mPutPos;
//@}
};
} // namespace
// EOF