ICON公式ブログ

ICON公式ブログ

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

【pythonではじめるゲームプログラミング 第4回】これまでの復習

f:id:iconcreator:20210617181207p:plain

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

担当は ふれうと です



はじめに


今回は学んできた順次分岐反復の3つの基本処理を、演習を通して復習しましょう。

最後のステップでは、コマンドプロンプトで動くゲームを実際に作ってみます。


次回以降の記事では「リスト(配列)」や「関数(メソッド)」を学ぶ予定です。今回の記事を通して、それらを学ぶための基礎を固めましょう。


前回の記事


iconcreator.hatenablog.com


Step 4-1 FizzBuzzの合計


以下のAtCoderの問題を解いてみましょう。


atcoder.jp


前回のFizzBuzz問題の応用ですね。

もし、AtCoderが何かわからなければ、以下のページを参考にしてください。


AtCoderの導入記事


iconcreator.hatenablog.com


参考解答


解いてみましたか?

以下に参考解答を載せます。

クリックして開いてください。

参考解答

N = int(input())
a = 1
ans = 0

while a <= N:
    if a % 5 != 0 and a % 3 != 0:
        ans += a
    a += 1

print(ans)


Step 4-2 クヌースの矢印表記


クヌースの矢印表記というものがあります。


ja.wikipedia.org


NとMを入力したら、

N↑↑M

の値を出力できるようなプログラムを考えましょう


以下にその仕様を述べます。

//////////////////////////////

ファイル名は「knuth.py」

コマンドプロンプトから数値N、Mを入力する。

N↑↑Mを計算し、出力する

//////////////////////////////

それでは、実装してみましょう。


実装できたら、予想通りの挙動をするか確認してみましょう。

コマンドプロンプトで実行し、NやMに適当な値を入れてみましょう。

(ちなみに、NやMに大きい値を入れると、計算した結果がとてつもなく大きな数になります。その場合、表示にとても時間がかかることがありますので注意してください。もし、いつまで経っても表示されないようであれば、慌てず騒がず、Ctrl + C で強制終了。)


実行は

cd Desktop/ICONPythonLesson
python knuth.py

です。


参考解答


クリックして参考解答を開いてください。

参考解答(knuth.py)

N = int(input("N = "))
M = int(input("M = "))

ans = N
i = 1

while M > i:
    ans = N ** ans
    i += 1

print("\n{}↑↑{} = {}".format(N, M, ans))


見慣れない命令について解説すると、

input("N = ")...こうすることで、入力の際に文字を表示できます。ここでは何を入力しているのか分かりやすくするために使っています。

\n...改行文字です。文字列の中にこれがあると、そこで改行されます。今回のプログラムでは視認性向上のために使っています。無くても問題ありません。

.format()...直前の文字列の{}に値を代入します。


Step 4-3 九九の表


続いては、コマンドプロンプト上で九九の表を表示するプログラムを作ってみましょう。

九九の表と言っても、任意の N × N の表を出力するようにしたいですね。

(インドでは20×20まで覚えるらしいですよ[要出典])


九九の表を表示することで二重ループを使う練習をするのが目的です。


以下にその仕様を述べます。

//////////////////////////////

ファイル名は「kuku.py」

コマンドプロンプトから数値Nを入力する。

N × N の表を出力する。

(可能であれば、)列が崩れないような表示をする。

//////////////////////////////

それでは、実装してみましょう。


改行しないprint命令


ここで、改行しないprint命令を使いたいかもしれないので、その使い方を以下に示します。

print("文字列", end = "")

print()end = ""と入れればOKです。,をお忘れなく。


具体例を示すと、以下のようなプログラムの場合

print("1", end = "")
print("2")
print("3", end = "")
print("4", end = "")
print("5")

次のように出力されます。

12
345


改行しないprint命令の説明は以上です。


参考解答


クリックして参考解答を開いてください。

参考解答(kuku.py)

N = int(input("N = "))

i = 1
while i <= N:
    j = 1
    while j <= N:
        tmp = i * j

        print("{} ".format(tmp), end = "")

        j += 1

    print("\n")
    i += 1


tmpとは英語「temporary」の略から来ており、一時的に保持したい値の変数名に用いられます。



クリックして参考解答を開いてください。

参考解答(列を揃える場合)

N = int(input("N = "))

maxlength = len(str(N ** 2))

i = 1
while i <= N:
    j = 1
    while j <= N:
        tmp = i * j
        tmplength = len(str(i * j))

        while tmplength < maxlength:
            print(" ", end = "")
            tmplength += 1

        print("{} ".format(tmp), end = "")

        j += 1

    print("\n")
    i += 1


len(文字列)では、文字列の長さを変数に代入します。

つまり、3行目では、変数maxlengthに N * N の長さを入力しています。

N = 9 なら 81 の長さの「2」、N = 20 なら 400 の長さの「3」となります。

そして、10~14行目で、桁数のズレを空白で埋めています。

変数tmplengthに i × j の桁数を代入し、12~14行目で、tmplengthmaxlengthの値が等しくなるまで空白を出力します。


Step 4-4 コマンドプロンプトで動くゲーム


では、ここまで学んだことを総動員して、コマンドプロンプトで動くゲームを作ってみましょう。

イメージとしては、ドラクエポケモンのバトルといった感じです。


以下にその仕様を述べます、無視して自由に作ってくれても構いません。

//////////////////////////////

ファイル名は「dramon.py」

コマンドプロンプト上で敵の名前、敵の体力、自分の名前、自分の体力、自分の取れる行動、ターン数を表示する。

自分の取れる行動は

  1. 攻撃
  2. パワーアップ
  3. 回復

とする。

コマンドプロンプトから数値N(1~3)を入力するとその行動をする。

敵は毎ターン攻撃する

自分と敵の行動をコマンドプロンプト上に出力する。

数値計算

攻撃...攻撃力分だけ体力を減らす

パワーアップ...攻撃力を二倍にする

回復最大体力分の半分を回復する。最大体力より多くは回復しない

敵の体力が0を下回った場合、「You Win」と出力。

自分の体力が0を下回った場合、「You Lose」と出力。


(参考変数名)変数の値は自由です。

敵の体力...enemy_HP

敵の最大体力...enemy_MAXHP

敵の攻撃力...enemy_ATK

自分の体力...my_HP

自分の体力...my_MAXHP

自分の攻撃力...my_ATK

ターン数...turn_count

その他、必要な変数を適宜追加してください。

//////////////////////////////

それでは、実装してみましょう。


※参考解答は次回の記事で載せるつもりです。

​正解があるわけではないので、自由にゲームプログラミングを楽しんでください。


備考(変数について)


制御変数について


while文やfor文などで、ループ回数を決めるための変数があります。

Step4-1の参考解答ではa、Step4-2ではi、Step4-3ではijがそれにあたります。

これらは「制御変数」と呼ばれます。

制御変数には他であまり使われない、ijを用いることが多いです。

最近ではijではなく、もう少し何を指すのかわかりやすい変数名にすることが推奨されることもあります。


命名規則について


変数名の話題が出たのでもう一点、「変数の命名規則」について説明します。

各言語において、変数名の付け方には規則があります。

今までは、自由に変数名を設定してきたと思いますが、これからは命名規則に則った変数名をつけるようにすると良いかもしれません。


python命名規則についての参考ページ:


qiita.com


qiita.com


また、大規模なプログラム作成や複数人でのプログラム作成の際には、さらに詳細な命名規則を事前に設定するのも良いかと思われます。


さらに包括的な「コーディング規約」というものも存在します。


終わりに


今回は、順次分岐反復の三つの基本処理の復習をしました。

そして、Step 4-4では実際にゲームプログラミングも行いました。

ゲーム制作の第一歩を踏み出しましたね!

ゲームプログラミングや競技プログラミングで、さらに自分のプログラミング力を磨いて、作りたいものを作れるようになってください。


第五回はコチラ!


iconcreator.hatenablog.com


競技プログラミングに関する記事はコチラ!


iconcreator.hatenablog.com