Python の勉強 スロットゲーム編 〜その3:変数の算術、定数、マジックナンバー〜

プログラミング

前回、Python における変数について以下のような特徴を確認しました。

  • 数学の変数のように、結果の入れ物として使うことができる
  • 右辺の結果が、左辺の変数に代入される
  • 変数には「x」や「y」以外にも、自由に名前を付けることができる
    • ASCII半角英数字(a~z、A~Z、0~9)とアンダーバー「_」を使う
    • 先頭に数字(0~9)は使えない
    • 予約語(for、def 等)は使えない
    • 日本語も可能だが慣例的ではない

また、現在の VS Code の設定では「変数が水色文字で表現される」というのも特徴です。他にも行数を表示してくれたり、対象の変数が使われ散る場所を強調表示してくれたり……といった機能は地味だけど大変、便利です。メモ帳で同じファイルを開いた様子(右画像)と比較するとよく分かると思います。

四則演算

またプログラムを ASCII 半角英数字を使って表現する性質上、四則演算に「×」「÷」のような記号は使えません。代わりに「*」と「/」を使います。基本的な四則演算は以下のように記載します。

a = 1 + 2           # 足し算
print(a)            #==> 3

b = 10 - 3          # 引き算
print(b)            #==> 7

c = 6 * 7           # かけ算
print(c)            #==> 42

d = 72 / 9          # 割り算
print(d)            #==> 8.0

e = 30 // 7         # 割り算の商
print(e)            #==> 4

f = 30 % 7          # 割り算の余り
print(f)            #==> 2

g = 2 ** 4          # 累乗 ※後日追加したため、画面キャプチャには含まれておりません。
print(g)            #==> 16

Python での書き方に慣れるためにも、適当なファイル(xxx.py)等を作成して、一度、実行してみて下さい。ここでは更に「#」以降は “コメント” として扱われるという Python の機能を利用して説明を記載しています。上記のように行内にコメントすることも可能ですので覚えておくとよいでしょう。

Python で四則演算をしている様子

対話モード

簡単なプログラムを確認する場合に、毎回、ファイルを準備するのを手間ですね。そんな場合は “対話モード” を使ってみましょう。使い方は簡単です。ターミナルで「python」と入力して Enter キーを押しましょう。「>>>」が表示されれば対話モードの開始です。

対話モードで計算している様子

ここで 136 行目に注目すると、不思議な式があります。
これはプレーヤーの名前を「king」に設定した場合、ゲーム開始時の所持コイン数が 100 倍になる!という裏技(?)用のプログラムです。

player_coin = player_coin + 100

……変ですよね?数学的に考えると、この数式を満たす player_coin はありません。ですがプログラム的には何ら問題ありません。

数学的には不思議なこの式は Python に限らず、色んなプログラミング言語で大人気の書き方……所謂 “常套(じょうとう)手段” です。そして他のプログラミング言語と同様に、Python で「=」を使った式が意味するのは “代入” だということを覚えておきましょう。決して「左辺と右辺が等しい」という “等式” を意味するものではありません。

右辺の結果を、左辺に “代入” する。

右辺は、player_coin(123枚)+ 100 で 223 になるので、

結果として player_coin が 223 になります。

所持コイン数が 100 枚増えている様子

では、この書き方に慣れるためにも、また適当なファイル(xxx.py)を作成して確認してみましょう。(上記の “対話モード” を使用して確認してみてもいいですね)
変数の中身を表示するために print() を使用しています。

a = 10
print(a)                #==> 10

a = a + 20
print(a)                #==> 30

a = a * 5
print(a)                #==> 150

a += 33
print(a)                #==> 183

a *= 4
print(a)                #==> 732

各代入式で、右辺の a にどんな値が入っているのか、そして計算した結果、左辺の a にはどんな値が代入されるかをイメージすることはできましたでしょうか?
3、4つ目では、また新しい書き方が登場しました。それぞれ以下のように解釈します。

  • a += 33a = a + 33 と同じ意味
  • a *= 4a = a * 4 と同じ意味

こちらも各種プログラミング言語で大人気の書き方なので、この機会に一緒に覚えておきましょう!
ここでは足し算と、かけ算の例しか扱いませんでしたが、引き算、割り算も同様の書き方が可能ですので、ご自身で確かめてみて下さい。

ちなみに JavaScript 等の他のプログラミング言語では「a++」「a--」のような書き方もあります。それぞれ「a = a + 1」「a = a - 1」、または「a += 1」「a -= 1」と同じ意味です。残念ながら Python では使えません。

定数

プログラムの 12~15 行目を見て下さい。「REEL_MARK_LIST」は「player_coin」と同じく水色で表現されているので変数のようです。しかし……

  1. 変数名が全て大文字で書かれている
  2. 右辺に見慣れない書き方がされている

ということが目につくと思います。

定数「REEL_MARK_LIST」を定義している様子

今回は特に「1」の “全て大文字” (とアンダーバー「_」)という点に注目してください。「2」については別の記事で勉強します。

変数の名称に全て大文字を使った場合、その変数は、プログラム内で「定数」として扱うことを意味します。実際には「定数としてあつかうことにしている」というだけです。しかし一度、定義した値を変更することは、混乱を招くので絶対にやめましょう!

世界中の Python プログラマー達による暗黙の了解です。

これが変数・定数に日本語を使わない理由なのかも知れません

私達も定数を定義して使ってみましょう。前回の「002.py」をコピーして「003.py」を作成して下さい。ファイルの作成手順は前回のブログ(こちら)を参考にして下さい。
「003.py」を作成したら、17、18 行目に以下のコードを挿入します。

# プレーヤーの名前が「king」だった場合、ゲームスタート時の所持コイン数にボーナスするコイン数
KING_BONUS_COIN = 100
17、18 行目に定数「KING_BONUS_COIN」を定義した様子

そして 139 行目の「100」を「KING_BONUS_COIN」に変更します。

「100」を「KING_BONUS_COIN」に変更した様子

変更したら、変更前と同様にプログラムが動くかどうか確認してみましょう。

(おまけ)マジックナンバーと、定数を使用する意味

002.py までのプログラムでは、唐突に「100」という数字が現れていました。コメント付きで定数を定義し、その定数を使うことで「100」という数字が意味していたことが明確になりました。定数を定義することは、一見、面倒に思えるかも知れません。しかし今回のように、プログラム内で使用される値に意味を与えるという大きな役割を担うことができます。
逆に 002.py の「100」のように、唐突に登場する、意味がわからない値のことを “マジックナンバー” と呼び、プログラマーの間で恐れられる存在となっております。あなたが良いプログラマーを目指すなら、マジックナンバーを登場させないように気をつけましょう!

また「2回目の掛けコイン入力前に king のみボーナス追加」や「大当たり時に king のみボーナス追加」等の機能を追加した場合を想像してみましょう。定数を使わない場合、都度「100」というマジックナンバーが登場します。知らない人がプログラムを見た場合「こっちの 100 と、あっちの 100 は同じ意味なんだろうか?」と疑問に思うことは容易に想像できますね。
さらにボーナスを 200 枚に変更したい場合、マジックナンバーを使用している場合は、ボーナスとして登場した全ての 100 を探して 200 に変更していくという面倒な作業が発生してしまいます。一方、定数を定義・使用していた場合はどうでしょう。18 行目の「100」を「200」に変更するだけでよくなります。

数字に意味を与える、プログラム変更時の手間を少なくするという観点からも、定数を使うことは大きな意味があることを感じて頂けましたでしょうか?

コメント

タイトルとURLをコピーしました