注目キーワード

【Python】ゲームデータのバックアップを自動で作成するプログラムの作成方法 – プログラミング初心者向けに徹底解説

はじめに

Cities:Skylinesというゲームがあります。街づくりシミュレーションゲームとして高い評価を受けている名作で、日々多くのプレイヤーに愛されています。別名「時間泥棒」と呼ばれるほど神ゲーです。

さて、このゲームにはMODを入れることで、さらにゲームシステムをカスタマイズして遊ぶことができます。しかし、MODにはエラーや不具合がつきもの(あくまでMODの導入は自己責任によるため)。時にはセーブデータが破損し、使えなくなることもあります。

こんなときに、「セーブデータのバックアップを取っておけばよかった・・・」と後悔してももう遅い。破損したセーブデータはもう戻ってきません(←by経験者)。

実際、この記事の執筆者が数十時間にわたって一生懸命に開発してきたセーブデータがある日突然破損し、使えなくなったことがあります。

そこでふと思うのです。

バックアップを自動で取ってくれるスクリプトを書けばいいのではないか?」と。

本記事では、プログラミングを用いてゲームのセーブデータのバックアップを作成する方法について解説します。もちろん、CitiesSkylinesに限らず、minecraftを始めとする、セーブファイルが存在するあらゆるゲームでも使えます

事前準備

まずは、プログラミング言語のひとつである、Pythonをインストールしましょう。

https://www.python.org

他の言語でももちろん良いですが、使い勝手などを考慮するとPythonに軍配が上がるかと思います。インストール後、適当な場所にテキストファイルを新規作成し、.pyファイルを作成しましょう(改名して拡張子を変更すればOK)。これをメモ帳などのテキストエディタで開きます。

スクリプト

要求される機能は以下の通りです。

  • ゲームのファイルのバックアップを作成する(コピー&ペースト)
  • バックアップを取りすぎるとストレージを圧迫するので、適度に削除する
  • ストレージの圧迫を防ぐために、zipファイルにする
  • あくまでバックアップを作成し、「必要な時にリカバリーができるようにする」ことが目的です。頻繁にバックアップにアクセスすることは考慮していません。

    これを満たすようなPythonのスクリプトをChatGPTに書いてもらいました。以下の通りです。これをコピー&ペーストし、保存しましょう。

    import os
    import shutil
    import time
    from datetime import datetime
    import zipfile
    import subprocess
    
    source_dir = 'ここにセーブデータがあるフォルダのパスを記述'
    backup_dir = 'バックアップを補完するフォルダのパスを記述'
    
    # バックアップ保持数
    backup_limit = 5
    
    # バックアップを作成する関数
    def create_backup():
        # 現在の日付・時刻を取得してフォルダ名を作成
        current_time = datetime.now().strftime('%Y%m%d_%H%M%S')
        backup_path = os.path.join(backup_dir, f'backup_{current_time}')
        
        # ディレクトリをコピーしてバックアップ作成
        shutil.copytree(source_dir, backup_path)
        print(f'Backup created at {backup_path}')
        
        # バックアップフォルダをZIPファイルに圧縮
        zip_path = f"{backup_path}.zip"
        shutil.make_archive(backup_path, 'zip', backup_path)
        print(f'Backup compressed to {zip_path}')
        
        # 圧縮後、元のバックアップフォルダを削除
        shutil.rmtree(backup_path)
        print(f'Deleted original backup folder: {backup_path}')
    
    # 古いバックアップを削除する関数
    def cleanup_old_backups():
        backups = sorted([f for f in os.listdir(backup_dir) if f.endswith('.zip')])
        
        # 保持数を超えたバックアップを削除
        if len(backups) > backup_limit:
            for old_backup in backups[:-backup_limit]:
                old_backup_path = os.path.join(backup_dir, old_backup)
                os.remove(old_backup_path)
                print(f'Deleted old backup: {old_backup_path}')
    
    # メイン処理
    create_backup()
    cleanup_old_backups()

    上記のsource_dirとbackup_dirは人によって異なります。各自確認の上、変更してください。参考までに、Cities:Skylinesのセーブデータは以下に保存されています(ユーザー名は人によって異なります)。

    C:\Users\User\AppData\Local\Colossal Order\Cities_Skylines\Saves

    これを実行すると、きちんとバックアップが取れていることが確認できます。また、このバックアップのzipファイルが5つを超えると古いものから削除され、ストレージの圧迫を防ぐこともできます。

    スクリプトを自動実行

    さて、このスクリプトは実際に動かさなければ意味がありません。手動で定期的にこのpythonファイルを動かしても良いのですが、それでは忘れてしまいます。できることなら、自動でこのpythonファイルを実行したいものです。

    いくつか方法はありますが、その一つに、「スタートアップ」フォルダ内にこのpythonファイルのショートカットを配置するという方法があります。スタートアップの場所は以下(ユーザー名は各自異なります):

    C:\Users\User\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

    ここに配置されたファイルは、PCの起動時に自動で実行されますので、忘れる心配はないでしょう。

    あるいは、Windowsに標準搭載されているアプリである「タスクスケジューラ」を用いて定期的にこのpythonファイルを実行するという方法も考えられます。タスクバーの検索欄よりタスクスケジューラと入力することによって起動できます。

    おしまい

    このようにして、自動的にゲームデータのバックアップを作成することができます。これでいつデータが破損しても(ある程度は)安心ですね。二度と同じ轍を踏まぬよう…

    data codes through eyeglasses
    最新情報をチェックしよう!