
Swiftはじめました 第10回

こんにちは、ムゥです。
この連載も第10回目を迎えました。
記念すべき回ですが、いつもどおりまったりと進むだけです 笑
この先も連載は続くので、見捨てずについてきてもらえると嬉しいです!
前回まで
論理演算子を学びました。
前回のまとめでもお話したように、条件分岐の進化系という感じでしたね。
複雑な条件を指定できるので、動きに幅をもたせられるようにと考えられたのでしょう。きっと。
今日はループの進化系かと思われる、whileループ をお勉強したいと思います。
かいつまんで説明すると、指定した条件に合致する限り繰り返すというもの。
毎度おなじみの動画を見ていただきましょう!
ループとの違いは回数を指定するのではなく、条件でループの継続と停止を指示できるという点かと思います。
早速最初のステージへ行ってみましょう。

ここでは、OFFになっているスイッチを押し続けていくというものでした。
都度スイッチの個数は変わりますが、最後のスイッチはONになっている仕様。
最初のステージということもあり、しず太郎さんは余裕でクリア。
コードは以下で問題なく進んでONになっているスイッチ上で停止しました。
while isClosedSwitch{
toggleSwitch()
moveForward()
}
これならば次も簡単かもしれないと期待しつつ進んでみましょう。

難易度いきなり上がってる感が否めませんが、、、解説にあるようにここではif関数も組み込んでいくようですね。
最初は小難しくコードを組んでみたのですが、動きもあまり良くなく再考。
そこでたどり着いたのは、3本目の通路だけワープホールが無い(行き止まり)というのがポイントになります。
行き止まりにならない限りは前に進むということをwhileループの条件にするんですね。
それにスイッチを押す/押さないの指示をif関数で追加して組み込むだけ。
かなりスッキリとしたコードになりました!
while !isBlocked{
moveForward()
if isOnClosedSwitch{
toggleSwitch()
}
}
まだ序盤ということもあるのか、そこまで苦もなくクリアできました。
良かった。。ここからまた徐々に難易度が上がっていくのでしょう。
さっそく次のステージでは一癖ありそうな感じです。

どのループを使うのかを選んで組み立てるのがお題となるようです。
func関数は最初にすでに組まれており、これを使ってループをしてねってことですね。
まず、func関数からループさせる回数を数えて、forループでゴールするという道筋があります。
これは間違いではないですが、正解への道は一つではないというのが、このPlaygroundsのテーマでもあると思うので、他の方法がないか考えてみました。
ここでのポイントは、whileループの条件はfunc関数の中の指示には介入できないというところです。
func関数はコードをまとめるっていう意味でしたよね。
そのまとめられている一連の動作で一つのコードと認識した方が分かりやすいかと思います。このコードの過程でwhileループの停止条件に合致する箇所があったとしても、途中で止まることは無いのです。
それを踏まえ ると、以下のコードを組み立てれば最後まで進めちゃうんですね。
while !isBlocked {
turnAndCollectGem()
}
func関数のコードにある最後のTurnRight()を動作してもしず太郎は行き止まりのマスにはいません。
そのため、「行き止まりじゃない限り繰り返す」という条件でコードを組んでみました。
私もここのステージを通してそのことに気づいたんですよね。
分解してよくよく考えてみると納得です。
続いては、ループを使ってスイッチを切り替えるってやつです。

ここも前回と似たステージだったなと思いました。ので、さっくとクリアです。
以下のコードで最後まで進むことができて一安心!
while !isBlocked {
moveForward()
moveForward()
moveForward()
if isOnClosedSwitch {
toggleSwitch()
}
turnRight()
}
今回最後に紹介するステージは、今まで学んだもの全てを思い出しながらいかに効率よくジェムを取りに行くかというお題でした。

まず最初に試してみたのは、whileループを使ってみるというものでした。
ただ、今までのように「行き止まりではない」ことを条件にしてしまうと延々とフィールドを回ってしまうため、不正解。。
効率よくというお題で考えると、繰り返しになる部分を分解し、func関数を使用したforループが最適なのではと考え、以下コードを組んでクリアしました。
func Gemcollect() {
moveForward()
collectGem()
turnLeft()
moveForward()
collectGem()
turnLeft()
moveForward()
turnRight()
}
for i in 1 ... 4 {
Gemcollect()
}
ついつい覚えたてのものを使いたくなるんですよね 笑
さて、連載第10回目はここまでです。
「whileループ」はいかがでしたでしょうか。
forループと違って停止条件が提示できるのであれば、whileループはとても便利に使えそうな関数でしたね〜
次回でこのwhileループも終わりですが、後半ステージではもっと難しいお題が待っているのでしょう。。
楽しみ?でプルプルしてきますね。寒気で。
また次回も一緒に楽しんで勉強してもらえたらなと思います。
それでは、再来週の更新でお会いしましょう!