ICON公式ブログ

ICON公式ブログ

静岡大学コンテンツ制作サークルICONの公式ブログです

【pythonではじめるゲームプログラミング 第5回】リスト

f:id:iconcreator:20210623065004p:plain


今回の記事はICONのpython勉強会の資料として書かれました。

担当は ふれうと です



はじめに


今回はリストについて学んでいきます。

python以外の言語では配列と呼ばれることもあります。

(厳密にはリストと配列は別のものです。気になったら調べてみてください。)


リストは複数のデータをまとめて管理するのに便利です。

ゲーム制作で多用すると思いますので、ぜひ学んでいきましょう。


前回の記事


iconcreator.hatenablog.com


Step 5-0 前回の記事の参考ゲーム例


前回の記事のStep4-4の参考例を置いておきます。


enemy_name = "スラチュウ"
enemy_MAXHP = 100
enemy_HP = enemy_MAXHP
enemy_ATK = 20
my_name = "ポケットゆうしゃ"
my_MAXHP = 100
my_HP = my_MAXHP
my_ATK = 15
turn_count = 0

while True:

    turn_count += 1

    print("/////////////////////////////////////////")
    print("ターン {}".format(turn_count))
    print("//////////")
    print("{}\nHP {} / {}".format(enemy_name, enemy_HP, enemy_MAXHP))
    print("//////////\n")

    print("//////////")
    print("{}\nHP {} / {}".format(my_name, my_HP, my_MAXHP))
    print("//////////\n")

    print("//////////")
    print("行動\n1. 攻撃\n2. パワーアップ\n3. 回復")
    print("//////////\n")
    print("/////////////////////////////////////////\n")


    print("//////////////////////////")
    my_action = int(input("行動を選んでください...."))
    while my_action != 1 and my_action != 2 and my_action != 3:
        my_action = int(input("行動を選んでください...."))

    print("")
    if my_action == 1:
        enemy_HP -= my_ATK
        print("{}の攻撃!{}に{}のダメージ!".format(my_name, enemy_name, my_ATK))
    elif my_action == 2:
        my_ATK *= 2
        print("{}のパワーアップ!攻撃力が{}あがった!".format(my_name, my_ATK))
    elif my_action == 3:
        tmp_heal = int(my_MAXHP / 2)
        if tmp_heal > (my_MAXHP - my_HP):
            tmp_heal = my_MAXHP - my_HP
        my_HP += tmp_heal
        print("{}の回復!体力が{}回復!".format(my_name, tmp_heal))

    if enemy_HP <= 0:
        print("/////////////////////////////////////////")
        print("You Win!")
        print("/////////////////////////////////////////")
        break

    print("")
    my_HP -= enemy_ATK
    print("{}の攻撃!{}に{}のダメージ!".format(enemy_name, my_name, enemy_ATK))

    if my_HP <= 0:
        print("/////////////////////////////////////////")
        print("You Lose...")
        print("/////////////////////////////////////////")
        break

    print("//////////////////////////\n")


今回はこのゲームを例にリストの有用性を説明したいと思います。


Step 5-1 リスト


Step 5-0 で挙げたゲームでは敵キャラが1体のみでしたね。

敵キャラを増やしたいと考えたとき、どのようにすればいいでしょう。

当然思いつくのは、新たに変数を作り、そこに敵キャラの情報を入力していく方法です。

しかし、そのやり方では用意する変数が膨大になってしまい管理しきれなくなってしまいます。


そういった問題に対処するのに便利なものが「リスト」です。

リストは複数の「要素」と呼ばれる値を「添え字(インデックス)」によって管理するものです。

さっそく、プログラムの例を用いて学んでいきます。


リストの作成


デスクトップ上のフォルダ「ICONPythonLesson」に、「list.py」というファイルを作りましょう。

コードは以下のようにしてください。

monster_name = ["スラモン", "ドラモン", "ぽっくる"]
print(monster_name)


書けたら実行してみましょう。

cd Desktop/ICONPythonLesson
python list.py


以下のように表示されれば成功です。

['スラモン', 'ドラモン', 'ぽっくる']


pythonでのリストの書き方は以下です。

変数 = [要素1, 要素2, ...]


値を[]で囲むとリストになります。

要素の数はいくらでも構いません。

例えば、0個や1個でも構いません。次のようなコードだと

exampleA= []
exampleB= ["ひとつだけ"]

print(exampleA)
print(exampleB)

次のように表示されます。

[]
['ひとつだけ']


要素の参照


続いては、リストの中から特定の要素を参照してみましょう。

先ほどの list.py を書き変えてください。(2行目をコメントアウトするのを忘れずに)

monster_name = ["スラモン", "ドラモン", "ぽっくる"]
#print(monster_name)
print(monster_name[1])

実行してみましょう。以下のように表示されるはずです。

ドラモン


pythonでの要素の参照の仕方は以下です。

リスト[添え字]


何か変ですね。お気づきになりましたでしょうか?

添え字が「1」なのに二番目の値が表示されていますね。

そう。ここで注意すべきは、添え字は「0」から始まるということです!!

つまり、monster_name[1]で二番目の要素のドラモンが表示されているのは間違いではありません。

(なぜ0からなのか..?自分は理由は知りませんが、このおかげで便利なことがいくつかあるみたいです。)


ためしに以下のようにプログラムを改変してください。

monster_name = ["スラモン", "ドラモン", "ぽっくる"]
#print(monster_name)
print(monster_name[0])
print(monster_name[1])
print(monster_name[2])

実行するとこうなります。

スラモン
ドラモン
ぽっくる


では、こうするとどうなるでしょう。

monster_name = ["スラモン", "ドラモン", "ぽっくる"]
#print(monster_name)
print(monster_name[0])
print(monster_name[1])
print(monster_name[2])
print(monster_name[3])

エラーが出ますね。

IndexError: list index out of range

最もよく見るエラーの一つです。

リストに無い要素を参照しようとしたときのエラーです。


リストの使用例


ここまで学んできたことを使い、以下のようなプログラムを作成できます。

monster_name = ["スラモン", "ドラモン", "ぽっくる"]
monster_power = [40, 80, 60]

i = 0
while i < 3:
    print("モンスターの{}が現われた!強さは{}だ!".format(monster_name[i], monster_power[i]))
    i += 1

実行して、挙動を確かめてみましょう。


また、途中で要素の値を変更することも出来ます。

monster_name = ["スラモン", "ドラモン", "ぽっくる"]
monster_power = [40, 80, 60]

i = 0
while i < 3:
    print("モンスターの{}が現われた!強さは{}だ!".format(monster_name[i], monster_power[i]))
    i += 1

print(monster_name[1] + "がパワーアップ!")

monster_name[1] = "スーパードラモン"
monster_power[1] = 200

i = 0
while i < 3:
    print("モンスターの{}が現われた!強さは{}だ!".format(monster_name[i], monster_power[i]))
    i += 1

実行して、挙動を確かめてみましょう。


Step 5-2 リストで使える関数・メソッド


リストに対して使える関数・メソッドは多くあります。

ここでは代表的なものを4つ挙げます。

len関数

len(リスト)

リストの要素数を求めます。


sum関数

sum(リスト)

リストの値の合計を求めます


appendメソッド

リスト.append(値)

リストに値を追加します


removeメソッド

リスト.remove(値)

リストから値を削除します。

(同じ値が複数ある場合は最初の要素を削除します。)

(削除した要素の場所には後ろの要素が詰めます。)


実行例

以下のようなプログラムを作成し

example = [100, 40, 500, 230]

print(example)
print(len(example))
print(sum(example))

example.append(80)
print(example)

example.remove(40)
print(example)

実行すると

[100, 40, 500, 230]
4
870
[100, 40, 500, 230, 80]
[100, 500, 230, 80]

となります。


Step 5-3 二次元リスト


リストの要素をリストにすることもできます。

二次元(多次元)リストと呼ばれます。


以下に具体例を示します。

monster = [["スラモン", 40], ["ドラモン", 80], ["ぽっくる", 60]]

print(monster[1])
print(monster[1][0])
print(monster[1][1])

実行すると

['ドラモン', 80]
ドラモン
80

となります。


二次元リストの要素の参照は

リスト[i][j]

です。

まず、一つ目の添え字iで、全体のリストから要素が参照され、

その要素自身がリストであるため、二つ目の添え字jでさらに要素を参照します。


以下のようなプログラムが作成できます。

monster = [["スラモン", 40], ["ドラモン", 80], ["ぽっくる", 60]]

i = 0
while i < 3:
    print("モンスターの{}が現われた!強さは{}だ!".format(monster[i][0], monster[i][1]))
    i += 1


クラスや構造体を使えばいいって?おっしゃる通りです。

それを知っているのなら、この記事を読むまでもなくゲーム制作を楽しめばよいと思われ...


Step 5-4 for文


反復処理について学んだ際、for文についてはリストを学ぶときに改めて説明すると言いましたね。

ここで説明したいと思います。


以下のようなプログラムを作成して、実行してみましょう。

example = [100, 40, 230]

for value in example:
    print(value)

実行結果は

100
40
230

となります。


for文は以下のような書き方をします。

for 変数 in (リストなどの)イテラブルオブジェクト
    処理文

ここで、「イテラブルオブジェクト」はとりあえずリストだと思っておいてください。

(本当は違います)


そして、for文は変数にリストの要素を最初から最後まで代入することを繰り返します。

よって上のような実行結果になるのです。


また、range関数を用いることも出来ます。

range関数は以下のように書きます。

range(整数)

こうすることで、[0, ...]という整数個の要素を持った整数列を作ります。

(要素が整数個なので、最後の要素の値は整数 - 1になります)

具体例を示すと、

for value in range(3):
    print(value)

は実行すると

0
1
2

です。


以下のように使います。

example2 = ["スラモン", "ドラモン", "ぽっくる"]

for value in range(3):
    print(example2[value])


こうすると、リストの要素数が変わっても安心。

example2 = ["スラモン", "ドラモン", "ぽっくる"]

for value in range(len(example2)):
    print(example2[value])


終わりに


今回はリストについて学びました。

もうここまでくれば、ゲーム制作は自由自在です。

次回はゲームエンジンの導入をしてみましょう。


第六回はコチラ!


iconcreator.hatenablog.com