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

2020/08/11

Android kotlin プログラミング

   前回はさいころアプリのボタンを押したら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文の時と同じですが、よりコンパクトなコードを書くことができました。

より詳しく知りたい方へ

今回は全部英語ですが、詳しく知りたい方はことらも参考にして下さい。

自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

ラベル

QooQ