変数 と似たものに 定数 があります。
変数 は var
で作ることができますが、 定数 は let
というキーワードで作ります。
var a = 2
let b = 2
変数 は後から 代入 して値を変更することができました。
var a = 2
a = 3
let b = 2
しかし、 定数 は後から 代入 して値を変更することができません。
var a = 2
a = 3
let b = 2
b = 3
実行しようとするとコンパイルエラーになります。
constant.swift:4:3: error: cannot assign to value: 'b' is a 'let' constant
b = 3
~ ^
constant.swift:3:1: note: change 'let' to 'var' to make it mutable
let b = 2
^~~
var
英語でおそろしげなエラーメッセージが表示されました😨
b
が let
で作られているので、 b = 3
のように後から値を変更することができない、もし 代入 しなおしたいなら let
ではなく var
を使えという内容です。
このように、 let
で作られた 定数 の値は後から変更できません。
定数 は値を変更できない分、 変数 よりできることが少ないように思えます。
変数 の方ができることが多いなら、一体 定数 は何の役に立つのでしょうか。
1000 行もあるような長いコードを考えてみて下さい。 100 行目で 変数 a
が作られて 365
が 代入 されていたとします。
さて、 800 行目に a
を使った計算が書かれていました。このとき a
の値は 365
でしょうか。それとも別の値でしょうか。
それを知るためには途中のコードをすべて調べて a
の値が変更されている箇所がないか確認しなければなりません。
もし a
が 定数 だったらどうでしょう?
定数 の値は後から変更できないので、もし 100 行目で a
が 365
だったら 800 行目でも 365
のはずです。
つまり、値を変更する必要がない場合には、 変数 ではなく 定数 を使うことでコードが読みやすくなるということです。
定数 で良い場合には積極的に 定数 を使いましょう。
RPG ではどのようなときに 定数 が使えるでしょうか。
最大 HP や攻撃力は戦闘中に変化することがありません。
戦闘のプログラムでは、最大 HP や攻撃力を 定数 で表すと良さそうです。
最大 HP を maxHp
、最大 MP を maxMp
、攻撃力を attack
、防御力を defense
で表すことにしましょう。
let maxHp = 153
let maxMp = 25
let attack = 162
let defense = 97
maxHp
の H はなぜ大文字なのでしょうか。
最大 HP は英語で max HP なので、本来なら max hp
としたいところです。
しかし、 変数 や 定数 の名前にスペースを使うことはできません。
かといって maxhp
としてしまうとどこが単語の区切りなのかわかりません。 max hp ではなく、 ma xhp かもしれません。
そこで、本来スペースの直後にあった文字を大文字にするのが慣例となっています。
maxHp
のような書き方を camelCase と言います。
camel とはラクダのことです。どうして camelCase と呼ぶかというと、大文字の部分がラクダのコブのように見えるからです。
さて、この他に 定数 で表せるものがあります。
それはキャラクターの名前です。 name
という 定数 で名前を表すことにしましょう。
let name = "ゆうしゃ"
let maxHp = 153
let maxMp = 25
let attack = 162
let defense = 97
このように、数値だけでなく 文字列 を 変数 や 定数 に 代入 することもできます。
最大 HP や最大 MP は戦闘中変化することはありません。一方で、これまでやってきたように現在 HP や現在 MP は変化します。
ですので、 HP や MP は 定数 ではなく 変数 で表すべきです。
let name = "ゆうしゃ"
let maxHp = 153
var hp = maxHp
let maxMp = 25
var mp = maxMp
let attack = 162
let defense = 97
HP も MP も全回復した状態で戦闘が始まるものとして、 hp = maxHp
, mp = maxMp
として初期値を与えました。
このようにして、勇者のステータスを 変数 と 定数 で表すことができました。
さて、これらを使って戦闘をしたいところですが敵が必要です。魔王のステータスも同じように 変数 と 定数 で表してみましょう。
しかし、同じ名前の 変数 や 定数 を作ることはできません。
勇者のステータスの 変数名 にすべて 1
を、魔王のステータスには 2
を付けることにしましょう。
まずは勇者のステータスの 変数名 に 1
を付けます。
let name1 = "ゆうしゃ"
let maxHp1 = 153
var hp1 = maxHp1
let maxMp1 = 25
var mp1 = maxMp1
let attack1 = 162
let defense1 = 97
このように、 変数名 には数字を使うこともできます。ただし、 変数名 の最初の文字は数字にできません。
a1
という 変数名 は可能ですが、 1a
という 変数 を作ることはできません。
さて、次は魔王のステータスです。
let name1 = "ゆうしゃ"
let maxHp1 = 153
var hp1 = maxHp1
let maxMp1 = 25
var mp1 = maxMp1
let attack1 = 162
let defense1 = 97
let name2 = "まおう"
let maxHp2 = 999
var hp2 = 999
let maxMp2 = 99
let mp2 = maxMp2
let attack2 = 185
let defense2 = 58
では、 1 ターン分の戦闘を作ってみましょう。
まず、今の HP と MP を表示します。せっかくなので HP 153 / 153
のように、現在 HP と最大 HP を表示してみましょう。
let name1 = "ゆうしゃ"
let maxHp1 = 153
var hp1 = maxHp1
let maxMp1 = 25
var mp1 = maxMp1
let attack1 = 162
let defense1 = 97
let name2 = "まおう"
let maxHp2 = 999
var hp2 = 999
let maxMp2 = 99
let mp2 = maxMp2
let attack2 = 185
let defense2 = 58
print(name1)
print("HP \(hp1) / \(maxHp1)")
print("MP \(mp1) / \(maxMp1)")
print()
ゆうしゃ
HP 153 / 153
MP 25 / 25
魔王は敵なので、魔王の HP と MP は表示しません( RPG では敵の HP と MP は表示されないことが多いです)。
次に、勇者の攻撃です。ダメージの計算は、勇者の攻撃力 attack1
から魔王の防御力 defense2
を引いて 2 で割ります。
let name1 = "ゆうしゃ"
let maxHp1 = 153
var hp1 = maxHp1
let maxMp1 = 25
var mp1 = maxMp1
let attack1 = 162
let defense1 = 97
let name2 = "まおう"
let maxHp2 = 999
var hp2 = 999
let maxMp2 = 99
let mp2 = maxMp2
let attack2 = 185
let defense2 = 58
print(name1)
print("HP \(hp1) / \(maxHp1)")
print("MP \(mp1) / \(maxMp1)")
print()
var damage = (attack1 - defense2) / 2
hp2 -= damage
print("\(name1)のこうげき。")
print("\(name2)に\(damage)のダメージ。")
print()
ゆうしゃ
HP 153 / 153
MP 25 / 25
ゆうしゃのこうげき。
まおうに52のダメージ。
次は魔王の攻撃です。逆に魔王の攻撃力 attack2
から勇者の防御力 defense1
を引いて 2 で割ります。
let name1 = "ゆうしゃ"
let maxHp1 = 153
var hp1 = maxHp1
let maxMp1 = 25
var mp1 = maxMp1
let attack1 = 162
let defense1 = 97
let name2 = "まおう"
let maxHp2 = 999
var hp2 = 999
let maxMp2 = 99
let mp2 = maxMp2
let attack2 = 185
let defense2 = 58
print(name1)
print("HP \(hp1) / \(maxHp1)")
print("MP \(mp1) / \(maxMp1)")
print()
var damage = (attack1 - defense2) / 2
hp2 -= damage
print("\(name1)のこうげき。")
print("\(name2)に\(damage)のダメージ。")
print()
damage = (attack2 - defense1) / 2
hp1 -= damage
print("\(name2)のこうげき。")
print("\(name1)に\(damage)のダメージ。")
print()
ゆうしゃ
HP 153 / 153
MP 25 / 25
ゆうしゃのこうげき。
まおうに52のダメージ。
まおうのこうげき。
ゆうしゃに44のダメージ。
最後にもう一度勇者の HP と MP を表示しましょう。
let name1 = "ゆうしゃ"
let maxHp1 = 153
var hp1 = maxHp1
let maxMp1 = 25
var mp1 = maxMp1
let attack1 = 162
let defense1 = 97
let name2 = "まおう"
let maxHp2 = 999
var hp2 = 999
let maxMp2 = 99
let mp2 = maxMp2
let attack2 = 185
let defense2 = 58
print(name1)
print("HP \(hp1) / \(maxHp1)")
print("MP \(mp1) / \(maxMp1)")
print()
var damage = (attack1 - defense2) / 2
hp2 -= damage
print("\(name1)のこうげき。")
print("\(name2)に\(damage)のダメージ。")
print()
damage = (attack2 - defense1) / 2
hp1 -= damage
print("\(name2)のこうげき。")
print("\(name1)に\(damage)のダメージ。")
print()
print(name1)
print("HP \(hp1) / \(maxHp1)")
print("MP \(mp1) / \(maxMp1)")
print()
ゆうしゃ
HP 153 / 153
MP 25 / 25
ゆうしゃのこうげき。
まおうに52のダメージ。
まおうのこうげき。
ゆうしゃに44のダメージ。
ゆうしゃ
HP 109 / 153
MP 25 / 25
これで 1 ターンの戦闘ができました!
ステータスを色々変更して実行してみると楽しそうです。
ステータスが 変数 や 定数 で表されると、より一層 RPG っぽくなりましたね!