Example #1
0
    //------------------------------------------------------------------------------
    /// ゲームの全情報を含む 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");
    }
Example #2
0
    //------------------------------------------------------------------------------
    /// 記録された結果を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
    }