さいころアプリを作成する~Kotlinによるif・else文~

   前回はさいころアプリのボタンを押したら1から6までの間のランダムな数字を返すようにしました。今回はif・else文について学び、ラッキーナンバーを設定し、ラッキーナンバーかどうかを判定できるようにします。

(googleの無料講座の順に進んでいます。)

前回の記事とgoogleの講座はこちらです。

次回の記事はこちらです。

if・else文を使えるようにする。

今回はラッキーナンバーを設定して、さいころを振った結果がラッキーナンバーだったらお祝いのメッセージを受け、ラッキーナンバーでなければもう一度やってくださいというメッセージを表示します。
上記実装をするためにここでは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 件のコメント :

コメントを投稿