Pythonの辞書は、キーと値のペアでデータを管理するのに非常に強力です。その実用的な応用例として、ファンタジーゲームのプレイヤーが持つアイテムとその数を管理する「持ち物リスト(インベントリ)」の作成があります。
この記事では、辞書を使ってゲームの持ち物リストを表現し、それを操作する2つの基本的な関数を作成する方法を解説します。
目次
1. 持ち物リストを表示する関数
まず、プレイヤーの現在の持ち物とその総数を表示する関数を作成します。持ち物は、アイテム名をキー、個数を値とする辞書で表現するのが最適です。
def display_inventory(inventory):
print("持ち物リスト:")
item_total = 0
# inventory.items()でキー(アイテム名)と値(個数)をループ処理
for item, quantity in inventory.items():
print(f"- {item}: {quantity}")
item_total += quantity
print(f"\nアイテム総数: {item_total}")
# --- テスト用の持ち物データ ---
player_inventory = {"ポーション": 3, "巻物": 2, "金貨": 50, "短剣": 1}
# 関数を呼び出して表示
display_inventory(player_inventory)
## コードの解説
display_inventory
関数は、引数として持ち物辞書(inventory
)を受け取ります。for item, quantity in inventory.items():
で、辞書の中身を一つずつ取り出します。- ループの中で各アイテムの名前と個数を表示し、
item_total
に個数を加算していきます。 - ループが終了した後に、最終的なアイテムの総数を表示します。
2. 倒した敵のアイテムをインベントリに追加する関数
次に、ゲームで敵を倒したときなどに得られる新しいアイテム(リスト形式)を、既存の持ち物リスト(辞書)に追加する関数を作成します。
def add_to_inventory(inventory, added_items):
# added_itemsリストの各アイテムをループ処理
for item in added_items:
# setdefault(item, 0)で、もしアイテムがなければ初期値0で追加
# その後、個数を1増やす
inventory.setdefault(item, 0)
inventory[item] += 1
return inventory
## コードの解説
add_to_inventory
関数は、現在の持ち物辞書(inventory
)と、新しく追加するアイテムのリスト(added_items
)を受け取ります。for item in added_items:
で、追加するアイテムを一つずつ処理します。inventory.setdefault(item, 0)
がこの関数の核です。- もし
item
が持ち物にまだなければ、{item: 0}
というペアを辞書に追加します。 - もし
item
が既に存在すれば、何もしません。
- もし
- 次の行
inventory[item] += 1
で、そのアイテムの個数を1つ増やします。これにより、新規アイテムも既存アイテムも正しくカウントアップできます。
3. プログラム全体の実行
それでは、作成した2つの関数を実際に使ってみましょう。プレイヤーがモンスターを倒して新しいアイテムを手に入れるシナリオをシミュレートします。
# --- プレイヤーの初期状態 ---
player_inventory = {"ポーション": 3, "金貨": 50}
# --- モンスターがドロップしたアイテム ---
monster_drops = ["金貨", "短剣", "金貨", "金貨", "ルビー"]
# --- アイテムを追加して、結果を表示 ---
updated_inventory = add_to_inventory(player_inventory, monster_drops)
display_inventory(updated_inventory)
実行結果:
持ち物リスト:
- ポーション: 3
- 金貨: 53
- 短剣: 1
- ルビー: 1
アイテム総数: 58
元々50枚だった金貨が、ドロップした3枚と合わさって53枚になり、新しく手に入れた短剣とルビーもリストに追加されていることがわかります。
まとめ
- 辞書は、アイテム名とその個数を関連付けて管理するゲームのインベントリに最適なデータ構造です。
- 処理を関数にまとめることで、コードが整理され、再利用しやすくなります。
setdefault()
メソッドを使うと、新しいアイテムの追加と既存アイテムの更新をエレガントに処理できます。