こんにちは。
「Pythonでつくる ゲーム開発 入門講座」のChapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。
前回はキャラクターのクラスを作りました。
その時のパラメータはプログラムに直に入力しましたが、
今回はスプレッドシートから値を取得するようにします。
目次
スプレッドシート連携
最初にスプレッドシートの連携ですが、詳細はこちらでお願いします。
プログラムは以下のところまで同じです。
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を作成するでは、面倒なのでどこかに公開するわけでもないので、ひとまず省こうと思っています。
最後に
今回はスプレッドシートと連携してキャラのパラメータを指定しました。
スプレッドシートですと、値を追加したい時、変えたい時が非常に楽です。
次回はモンスター(敵)のクラスを作ってみます。
【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。