[C++] 251 SDL : テトリスの最高スコアをxmlファイルに保存

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

製作中のテトリスはアプリ起動中の最高スコアを表示していて、閉じるとデータは消えてしまいます。

そこでxmlファイルに最高スコアを保存し、起動の度にxmlファイルを読み込み、ゲームオーバー時に更新するようにしました。同時にバックアップファイルも作成しています。

xmlファイル作成・読込はJavaアプリで扱ったことはありますが、今回はChatGPTを使ってサクッと作りました。Homebrewでインストールしたpugixmlライブラリを使っています。

ある程度プログラミングが分かる方はChatGPT Plusを活用されることをお勧めします。学習・作業効率がこれまでと段違いです。

#include "pugixml.hpp"

extern string xmlFile;
extern string xmlFileBackup;

int readXML(){
	pugi::xml_document doc;

	cout << "readXML関数 xmlFile: " << xmlFile << endl;

    // XMLファイルを読み込む
    pugi::xml_parse_result result = doc.load_file(xmlFile.c_str());

    if (!result) {
        std::cerr << "XMLの読み込みに失敗しました。" << std::endl;
        return -1;
    }

    // ルートノードを取得する
    pugi::xml_node root = doc.child("properties");

    // HISCOREのエントリーを取得する
    pugi::xml_node hiscore_node = root.find_child_by_attribute("entry", "key", "HISCORE");

    // エントリーの値を取得する
    hiScore = hiscore_node.text().as_int();

    std::cout << "HISCOREの値は" << hiScore << "です。" << std::endl;

	return hiScore;
}

int writeXML(){
	pugi::xml_document doc;

	cout << "writeXML関数 xmlFile: " << xmlFile << endl;

    // XMLファイルを読み込む
    pugi::xml_parse_result result = doc.load_file(xmlFile.c_str());

    if (!result) {
        std::cerr << "XMLの読み込みに失敗しました。" << std::endl;
        return -1;
    }

    // ルートノードを取得する
    pugi::xml_node root = doc.child("properties");

    // HISCOREのエントリーを取得する
    pugi::xml_node hiscore_node = root.find_child_by_attribute("entry", "key", "HISCORE");

    // エントリーの値を書き換える
    hiscore_node.text().set(hiScore);

    // XMLファイルを上書きする
    doc.save_file(xmlFile.c_str());

    std::cout << "更新するHISCOREの値は" << hiScore << "です。" << std::endl;

	// ファイルを読み込む
    std::ifstream file(xmlFile);
    if (!file.good()) {
        std::cerr << "ファイルの読み込みに失敗しました。" << std::endl;
        return -1;
    }

    // バックアップファイルを作成する
    std::ofstream backup(xmlFileBackup);
    if (!backup.good()) {
        std::cerr << "バックアップファイルの作成に失敗しました。" << std::endl;
        return -1;
    }

    // バックアップファイルにデータを書き込む
    backup << file.rdbuf();

    // ファイルを閉じる
    file.close();
    backup.close();

    std::cout << "バックアップファイルを作成しました。" << std::endl;
}