前回はさいころアプリのボタンを押したら1から6までの間のランダムな数字を返すようにしました。今回はif・else文について学び、ラッキーナンバーを設定し、ラッキーナンバーかどうかを判定できるようにします。
(googleの無料講座の順に進んでいます。)
前回の記事とgoogleの講座はこちらです。
次回の記事はこちらです。
今回はラッキーナンバーを設定して、さいころを振った結果がラッキーナンバーだったらお祝いのメッセージを受け、ラッキーナンバーでなければもう一度やってくださいというメッセージを表示します。
上記実装をするためにここではifやelse、whenなどを使っていきます。
Kotlinの動作確認にはこちらのサイトで行います。
if文について
まず初めにif文についてです。
Kotlinでのif文の使い方は次の通りです。
if (条件式) {
条件を満たした場合に実行するコード
}
if文を使った具体例を見てます。
fun main() {
val num = 5
if (num > 4) {
println("The variable is greater than 4")
}
}
こちらのコードは変数numに5をセットして、numが4より大きいか判断し、
大きい場合は文章を表示します。
今回の例だとnumは4より大きいので、文章が表示されます。
(今回の例では条件を満たしてない場合のコードが書かれてないので、4以下の場合は何も表示されません。)
else・else if文を追加する
上記コードの場合、条件を満たさない場合何も実行されません。
なので、条件を満たさなかった場合の処理をelse文を使って追加します。
fun main() {
val num = 3
if (num > 4) {
println("The variable is greater than 4")
} else {
println("The variable is less than 4")
}
}
この例ではnumが3で、条件式の4より大きいを満たしてないので、else文の中の文章"The variable is less than 4"が出力されます。
このままでもいいのですが、
numに4が入った場合でも"The variable is less than 4"(変数は4より小さい)
と出力されてしまうので、正しくありません。
なので、もう一つの条件をelse ifを使って追加していきます。
fun main() {
val num = 4
if (num > 4) {
println("The variable is greater than 4")
} else if (num == 4) {
println("The variable is equal to 4")
} else {
println("The variable is less than 4")
}
}
これで変数が4の時に"The variable is equal to 4"(変数hじゃ4と等しいです)
と出力されるようになってます。
val num の値を変えてみて出力がどのように変わるか試してみてください。
制御フローについて
上記例を見て頂くと分かりますが、作成したコードは上から順に判定条件を見て、処理が流れていきます。
例えば変数numが3である場合、最初の条件(num>4)をチェックしこれは偽なので、次の処理に行きます。次の条件(num == 4)もチェックしますが、これも偽なので、最後のelse文を実行して終了します。
変数numが6の場合は最初の条件(num>4)が真になるので、残りの条件はチェックせずに終了します。
ラッキーダイスゲームの土台を作成
if・else文が使えるようになったので、さいころの振った結果をチェックしてラッキーナンバーかどうかを判定します。
さいころを振る処理は前作成したコードを流用します。
fun main() {
val myFirstDice = Dice(6)
val diceRoll = myFirstDice.roll()
println("Your ${myFirstDice.numSides} sided dice rolled ${diceRoll}!")
}
class Dice (val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
上記コードのmain文を次のように改変します。
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
//ラッキーナンバーの設定
val luckyNumber = 4
}
ラッキーナンバーを設定出来たら後は、さいころを振った結果がラッキーナンバーだった時の処理と、そうでなかった場合の処理を追加していきます。
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
//さいころを振った結果がラッキーナンバーと一致しているか判定
//一致したら"You win!"と表示し、不一致だったら"You didn't win, try again!"と表示
if (rollResult == luckyNumber) {
println("You win!")
} else {
println("You didn't win, try again!")
}
}
else if文も追加して数字毎に表示されるメッセージを変えていきます。
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
println("You win!")
} else if (rollResult == 1) {
println("So sorry! You rolled a 1. Try again!")
} else if (rollResult == 2) {
println("Sadly, you rolled a 2. Try again!")
} else if (rollResult == 3) {
println("Unfortunately, you rolled a 3. Try again!")
} else if (rollResult == 4) {
println("No luck! You rolled a 4. Try again!")
} else if (rollResult == 5) {
println("Don't cry! You rolled a 5. Try again!")
} else {
println("Apologies! you rolled a 6. Try again!")
}
}
else if/else文で1から6までのメッセージがありますが、もしさいころを振った結果がラッキーナンバーだった場合は一番上のif文の処理が実行されて他は実行されません。
今回の例ではelse if文が多くなってしまいます。
Kotlinではこれを回避できるシンプルな記述法があります。
When文を使ってコンパクトな記述にする
プログラミングでテストケースごとに条件を設定することが一般的です。
例えば12面のさいころの場合、成功した場合に表示する文章と最終的なelseの間に11個のelse if文を書くこともあります。
このような書き方はミスに気が付きにくくしてしまいます。
Kotlinではこのような文を読み書きしやすくし、ミスを少なくするWhen文というものがあります。
(C言語のswitch文のようなもんでしょうか。)
When文の書き方は次の通りです。
when (判定する変数) {
変数の値 -> 処理
//(これを条件の数だけ繰り返す)
}
先ほどのif・else文で書いたものをwhenで書き換えると次のようになります。
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
luckyNumber -> println("You won!")
1 -> println("So sorry! You rolled a 1. Try again!")
2 -> println("Sadly, you rolled a 2. Try again!")
3 -> println("Unfortunately, you rolled a 3. Try again!")
4 -> println("No luck! You rolled a 4. Try again!")
5 -> println("Don't cry! You rolled a 5. Try again!")
6 -> println("Apologies! you rolled a 6. Try again!")
}
}
実行した結果はif・else文の時と同じですが、よりコンパクトなコードを書くことができました。
より詳しく知りたい方へ
今回は全部英語ですが、詳しく知りたい方はことらも参考にして下さい。
0 件のコメント:
コメントを投稿