top of page
logo_tkrite_2_edited_edited.png

Swiftはじめました 第11回

こんにちは〜ツクリテのムゥです。

12月に入り冬本番ですが、みなさまいかがお過ごしでしょうか。

冬といえばこたつと鍋ですね。こたつは電源切り忘れると怖いので買わないことにしています。

寒さに負けず今日も頑張りますのでよろしくお願いします!

 
前回まで

前回は「whileループ」に入っていきました。

この回でこの章は終わりにしたいと思っています。

残り4ステージ紹介することになりますが、あと少しなので頑張りましょう。


ではではさっそく次のステージを見てみましょう。


ここではスイッチとジェムの並びは変わらないが、コード実行の都度スイッチやジェムの数が増減するということなので、それを踏まえての組立てが必要となります。


増減することを考えるとforループを使うことができないので、whileループでの組立てを考えてみました。


分解していくと、以下のコードが必要になりますよね。

  1. 行き止まりまでスイッチを押しながら進む

  2. 行き止まりまでジェムを取りながら進む


①のコード

while !isBlocked{
    moveForward()
    if isOnClosedSwitch {
        toggleSwitch()
    }
}

②のコード

while !isBlocked {
    moveForward()
    if isOnGem {
        collectGem()
        }
}

ここまで分解できたらwhileループをつなぎ合わせて最後まで進むだけですね!



次、サクサク行きましょう!


ここのステージでは進むルートは指定されていて、左回りにジェムを取りながら進んでくれよ!ってことみたいです。


目標:ループの中に入れた別のループを使って、らせんに沿って移動しましょう。


この画面を見てこれだけのコメントだったらアプリを落としたくなるのは私だけではないでしょう。

しかしながらAppleさんは親切なもので。。。これ以降に回答の道筋を解説してくれているという器の大きさ。素敵。


解説に操られるままコードを組み立てていくとすんなりとゴールできちゃいました!

while !isBlocked{
   while !isOnGem{
      moveForward()
   }
   collectGem()
   turnLeft()
} 

whileループの中にまたwhileループを組み込むということがテーマだったのですが、こういうコードの書き方はネストするというようですよ。

ネストしたループはジェムがあるところまで進む、外側のループはジェムを取って左を向くという条件をつけるだけでした。

ここは解説のおかげでとてもスムーズに進めたので次に行きましょう。


次のステージでは、先程覚えたループをネストするというものです。


ここではコードの実行時にステージの大きさが変わるというところがポイントです。whileループを使って右回りに進んでいき、最後にスイッチを押すというものですが、どのようにネストすれば良いでしょうか。


ここで必要なこと・・・

行き止まらない限り進むことと、右に曲がること、最後にスイッチを押すってことですね。


逆順に考えていけばいいとのことなので、以下のような組立にしてみました。

while !isBlocked {
    while !isBlocked {
        moveForward()
    }
    turnRight()
    }
toggleSwitch()

実はまぐれで出来た感じです。

いまいち私にはネストするという行為が飲み込めていないので、偶然できたといっても過言ではありません。



奇跡の末のしず太郎の勇姿、まぐれなのにめっちゃ喜んでるのが申し訳ない。。

次こそ頑張るから見捨てないで欲しい。


そして今回最後のステージですが、大物ですね。

クリアできる気が全然しない。。

頑張るって言ったばかりだけどすでに心が折れそう。


ここではスイッチに加えてジェムも登場。

ジェムが最終地点にあるので、whileループの一つはこれで決まりですね。次に気になるのが、スイッチを押していくって部分・・。

ここはおなじみのif関数が使えることは間違いない。などなどと考えながら組み立てていくと思いの外あっさりとたどり着いてしまいました。


内側のwhileループは、「行き止まらない限り進んでいき、もしスイッチがOFFならば押し、行き止まりになったら右に曲がる」といった内容にしました。

ジェムにたどり着くと外側のループが終わるので、最後にジェムを取ることを指定してしまえばOK!!

while !isOnGem {
    while !isBlocked {
        moveForward()
        if isOnClosedSwitch {
            toggleSwitch()
        }
    }
    turnRight()
}
collectGem()


危うくしず太郎に愛想を尽かされて一人ぼっちになるとこでしたが、なんとかうまくいって安心しました・・・


さて、今回でwhileループは終わりですが、私はこれとても苦手です。

まあ、この連載を始めてから得意だったことは一つもないのですが 笑


振り返ると「なんとなくこうかな?」でクリアしてきて、あまり飲み込めていない部分が多かった気がします。皆さんはいかがでしたでしょうか?

私のように感じた人は、復習をして理解を深めるのがオススメです!


次回からはまた新しいところに入っていきますので、お楽しみに!

bottom of page