CODE Python RPG

初心者がPythonでRPGを作成する(第4回)スプレッドシートと連携

更新日:

こんにちは。
「Pythonでつくる ゲーム開発 入門講座」のChapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。

前回はキャラクターのクラスを作りました。
その時のパラメータはプログラムに直に入力しましたが、
今回はスプレッドシートから値を取得するようにします。

目次

  1. スプレッドシート連携
  2. 変更
  3. 例外
  4. 最後に

スプレッドシート連携

最初にスプレッドシートの連携ですが、詳細はこちらでお願いします。
プログラムは以下のところまで同じです。

import gspread
import json
import os.path
# 実行中のファイルのパスを取得
os.chdir(os.path.dirname(os.path.abspath(__file__)))

# ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。
from oauth2client.service_account import ServiceAccountCredentials 

# 2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# 認証情報設定
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く)
credentials = ServiceAccountCredentials.from_json_keyfile_name('ダウンロードしたJSONファイル名.json', scope)

# OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)

# 共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。
SPREADSHEET_KEY = 'スプレッドシートキー'

スプレッドシートは以下のようにしました。
シート名は「キャラ」にしています。
前回の通り使わないパラメータもあります。

 これで準備完了です。

 

 

変更

それではプログラムを変更していきます。
今回は前回作ったchara.pyのみの変更です。

まずは「キャラ」シートの取得です。

wb = gc.open_by_key(SPREADSHEET_KEY)
ws = wb.worksheet("キャラ")

wsを使って、「キャラ」シートの値を取得していきます。
今回はB列の値の取得です。
スプレッドシートの値の参照方法はこちらも参考にして頂ければと思います。

chara1_name = ws.acell('B2').value
chara1_lv = int(ws.acell('B3').value)
chara1_maxhp = int(ws.acell('B4').value)
chara1_hp = int(ws.acell('B5').value)
chara1_maxmp = int(ws.acell('B6').value)
chara1_mp = int(ws.acell('B7').value)
chara1_atk = int(ws.acell('B8').value)
chara1_dfs = int(ws.acell('B9').value)

それぞれの変数にスプレッドシートの値が入りました。
これを前回、作ったBraveクラスに使います。

class Brave():
    def __init__(self):
        self.name = chara1_name
        self.lv = chara1_lv
        self.maxhp = chara1_maxhp
        self.hp = self.maxhp # chara1_hp は使わない
        self.maxmp = chara1_maxmp
        self.mp = self.maxmp # chara1_mp は使わない
        self.atk = chara1_atk
        self.dfs = chara1_dfs

コメント文に書きましたが、HPの初期値は最大HPなので、
スプレッドシートのHP(chara1_hp)やMP(chara1_mp)は特に使いません。
※作ってて気づきました・・(ノω`*)

resetの関数も同じです。

    def reset(self):
        self.maxhp = chara1_maxhp
        self.hp = self.maxhp
        self.maxmp = chara1_maxmp
        self.mp = self.maxmp
        self.atk = chara1_atk
        self.dfs = chara1_dfs

 

プログラム実行

最大HPや攻撃力が反映されています。
※STRは攻撃力です

スプレッドシートの値を変更してみます。
最大HP:300 → 30
攻撃力:1000 → 100

プログラム実行

反映されています!(`・ω・´)

 

 

例外

今回の値は名前以外は以下のようにint型です。

chara1_lv = int(ws.acell('B3').value)
chara1_maxhp = int(ws.acell('B4').value)
chara1_hp = int(ws.acell('B5').value)
chara1_maxmp = int(ws.acell('B6').value)
chara1_mp = int(ws.acell('B7').value)
chara1_atk = int(ws.acell('B8').value)
chara1_dfs = int(ws.acell('B9').value)

この為、スプレッドシートで数字以外を指定すると当然エラーになります。

こんな時は例外処理が使えます。公式サイトはこちら
今回の例ですと以下のような感じにします。

try:
    chara1_name = ws.acell('B2').value
    chara1_lv = int(ws.acell('B3').value)
    chara1_maxhp = int(ws.acell('B4').value)
    chara1_hp = int(ws.acell('B5').value)
    chara1_maxmp = int(ws.acell('B6').value)
    chara1_mp = int(ws.acell('B7').value)
    chara1_atk = int(ws.acell('B8').value)
    chara1_dfs = int(ws.acell('B9').value)
except:
    print("int型ではない値が入っています")
    sys.exit() # プログラム終了(import sysが必要)

プログラムを実行すると「int型ではない値が入っています」が表示されて終了します。

こんな感じです。
ただ、今回のRPGを作成するでは、面倒なのでどこかに公開するわけでもないので、ひとまず省こうと思っています。

 

 

最後に

今回はスプレッドシートと連携してキャラのパラメータを指定しました。
スプレッドシートですと、値を追加したい時、変えたい時が非常に楽です。

次回はモンスター(敵)のクラスを作ってみます。

まとめサイトへ

 

 

【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。

 

 

-CODE, Python, RPG
-, , , , , , , , , ,

Copyright© kerublog , 2021 All Rights Reserved Powered by STINGER.