前回はさいころアプリのボタンを押したら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 件のコメント:
コメントを投稿