Python3でRPGを作る時に使えそうな技術の断片 -辞書でワールドマップを作ろう-

f:id:sakage24:20170722184642j:plain

ワールドマップを2次元リストで持つ時代は終わりました。代わりに辞書を使えば、拡張性も汎用性もグンと向上するでしょう!

この記事をご覧になっている時点でおそらく貴方はPythonを勉強中であり、RPG製作に興味があるはずです。たった今私は天才的な閃きによって、辞書を使ってワールドマップを表現することを思いついてしまったので紹介します。

私は今まで多次元リストでマップを表現していました。そしてそれ以外に方法は無いと思い込んでいたんですね。ですが、多次元リストは値を一つしか持てないし、データを取り出すのも非常に大変です。多次元リストの中にさらに複雑なリストがある…なんて考えるのも嫌ですよねw

なので、管理の容易な辞書を使いましょう!!何故今まで辞書にしなかったのかというツッコミがあると思うのですが、辞書の唯一の欠点は「順序が保証されない」ことです。

しかし、collectionsモジュールを利用すると、順序が保たれたまま辞書を利用することが出来るってEffective Pythonに書いてありました。

あれ…リストはいらない子…?

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

辞書の基本的な使い方

辞書はKey:Valueで構成されています。keyには、ハッシュに変換出来る型のみを用いることが出来ます。すなわち文字列型(str)や数値型(int)、タプルでも平気です。下の様に、リストをKeyにしたりすると怒られます。


>>> d = {"a": "b"}
>>> d
# 文字列なのでOK
{'a': 'b'}
>>> d = {1: 2}
>>> d
# 数値なのでOK
{1: 2}
>>> x, y = 0, 0
>>> d = {(x, y): "座標"}
>>> d
# タプルなのでOK
{(0, 0): '座標'}
l = ["a", "b"]
# リストは駄目よ
dic = {l}
>>> 実行結果
Traceback (most recent call last):
File "", line 1, in 
TypeError: unhashable type: 'list'

辞書でワールドマップを作ろう!

辞書は1つのKeyに対して、複数のValueを持てます。ネストしてさらにネストするようなカオスから抜け出せましたね。


from collections import OrderedDict  # 大事
from pprint import PrettyPrinter
pp = PrettyPrinter(indent=4)
maps = OrderedDict()  # 大事
for i in range(10):
for j in range(10):
maps[(i, j)] = {
"grid": (i, j),  # 座標
"terrain": 0,  # 地形のタイプ(壁とか草原とか山とか)
"cost": 1,  # 移動にかかるコスト(壁は99999とか)
"link": (),  # 最短経路アルゴリズムなどで使う、移動元の座標
"images": "",  # 画像のURL
"heuristic_values": 0,  # 最短経路アルゴリズムなどで使う、ヒューリスティック値
"keep_out_flag": False,  # 進入不可エリアフラグ
}
pp.pprint(maps)
>>> 実行結果
OrderedDict([   (   (0, 0),
{   'cost': 1,
'grid': (0, 0),
'heuristic_values': 0,
'images': '',
'keep_out_flag': False,
'link': (),
'terrain': 0}),
.
.  中略
.
(   (9, 9),
{   'cost': 1,
'grid': (9, 9),
'heuristic_values': 0,
'images': '',
'keep_out_flag': False,
'link': (),
'terrain': 0})])

CollectionsモジュールのOrderedDictを利用しているので、順序が保証されるようになりました。これでマップに関する処理が格段に書きやすくなりましたね!!

なお、何故か私の環境だと、普通の辞書を使っていても順番通りに出力されたりしますwよく分からんです。

辞書ならfor文で簡単に回せるのでいいですね~。今まで知らなくて苦労した時間を返せオライリーさんありがとう!!

終わり

涙なしでは語れないほどに、ワールドマップ関連では苦労しましたが、ようやく報われそうです。PythonでRPGを作るのはけっこう大変だと思いますが、とっても楽しいので皆さんも挑戦してみて下さい。

過去記事

こっちではリストを使っていますね。リストの利点は初期化が楽なことです。ワンライナーです。

https://www.kiwi-bird.xyz/2017/07/01/20170701193017/

コメントを残す

メールアドレスが公開されることはありません。