//------------------------------------------------------------------------------ /// ゲームの全情報を含む JSON データを出力します。 /// この関数を利用して出力したデータはビューアに渡すことが出来ます。 /// /// @param[in] isCompressed 圧縮した形で出力するかどうか。 /// @c true を指定した場合、空白やインデントが取り除かれ、サイズが削減された /// 形で出力されます。 void Record::dumpJson(bool isCompressed)const { HPC_PRINT("["); // 基本情報 HPC_PRINT("%d,%d,%d,%d,%d,", Parameter::FieldWidthMax, Parameter::FieldHeightMax, Parameter::PeriodCount, Parameter::ItemCountMax, Parameter::TruckWeightCapacity); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); // ステージ情報表示 HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (2) HPC_PRINT("["); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); for (int index = 0; index < Parameter::GameStageCount; ++index) { mStage[index].dumpJson(isCompressed); if (index + 1 < Parameter::GameStageCount) { HPC_PRINT(","); } HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); } HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (2) HPC_PRINT("]"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT("]\n"); }
//------------------------------------------------------------------------------ /// 記録された結果をJSON形式で出力します。 /// /// @param[in] isCompressed 圧縮された状態で出力するかどうか。 /// @c true にすると、改行やインデントを除いた形で出力されます。 void RecordStage::dumpJson(bool isCompressed)const { #ifdef DEBUG HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (4) HPC_PRINT("["); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); // 営業所の位置 HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("%d,%d,", mField.officePos().x, mField.officePos().y); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); // フィールド HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("["); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); for (int i = 0; i < mField.height(); ++i) { HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (8) HPC_PRINT("\""); for (int j = 0; j < mField.width(); ++j) { HPC_PRINT("%d", mField.isWall(j, i) ? 1 : 0); } HPC_PRINT("\""); if (i + 1 < mField.height()) { HPC_PRINT(","); } HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); } HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("],"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); // 荷物 HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("["); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); for (int i = 0; i < mItems.count(); ++i) { HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (8) HPC_PRINT("[%d,%d,%d,%d]", mItems[i].destination().x, mItems[i].destination().y, mItems[i].period() + 1, mItems[i].weight()); if (i + 1 < mItems.count()) { HPC_PRINT(","); } HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); } HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("],"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); // スコア HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("%d,", mScore); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); // 配達時間 int period = -1; bool periodFirst = true; for (int i = 1; i < mCurrentTurn; ++i) { // 初期状態は不要なので1から始める if (mTurns[i].initPeriod) { period++; if (period > 0) { // 前の配達時間帯終了 HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (8) HPC_PRINT("]"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("],"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); } // 配達時間帯開始 HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("["); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (8) HPC_PRINT("["); bool itemFirst = true; for (int j = 0; j < Parameter::ItemCountMax; ++j) { if (mTurns[i].itemGroup.hasItem(j)) { if (itemFirst == false) { HPC_PRINT(","); } itemFirst = false; int deliveryTurn = mCurrentTurn; for (int k = i + 1; k < mCurrentTurn; ++k) { if (mTurns[k].itemGroup.hasItem(j) == false) { deliveryTurn = k - 1; // 初期状態の分を引く break; } } HPC_PRINT("[%d,%d]", j, deliveryTurn); } } HPC_PRINT("],"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (8) HPC_PRINT("["); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); periodFirst = true; } { if (periodFirst == false) { HPC_PRINT(","); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); } periodFirst = false; HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (10) HPC_PRINT("\"%c%c%X\"", encodePosInt(mTurns[i].truckPos.x), encodePosInt(mTurns[i].truckPos.y), (mTurns[i].totalCost + mTurns[i].periodCost)); } } // 最後の配達時間帯終了 if (period >= 0) { HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (8) HPC_PRINT("]"); HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (6) HPC_PRINT("]"); } HPC_PRINT_JSON_DEBUG(!isCompressed, "\n"); HPC_PRINT_JSON_DEBUG(!isCompressed, " "); // インデント (4) HPC_PRINT("]"); #else // デバッグ無効の場合、json 出力はサポートされません。 HPC_PRINT("[]"); #endif }