
Swiftはじめました 第12回

こんにちは、ツクリテのムゥです。
年末に差し掛かり、忙しい日々をお過ごしかと思います。この投稿を見て少しでも癒やされるかは微妙ですが今年もあと少しだけなので元気出して乗り切って行きましょう!
前回まで
whileループの最終回をお届けしました。
2回にわたり、ループをネストするという上級テク(私にとっては)を学びましたが、皆様覚えていらっしゃいますでしょうか?
何度か練習をしないとすんなりと出てこない組立かと思います。
まだまだ不安な人は私同様に練習してみるといいかもですね!
さて、今日は新しく「アルゴリズム」を勉強していきたいと思います。
このアルゴリズムとはなんだ?というところなのですが、whileループなどを使ってアルゴリズムを作るというもののようです。
説明下手な私では不足があるので、いつものように動画を御覧ください!
目的を達成する為のルールや指示をアルゴリズムと呼ぶようです。
そう考えると大きい意味で言えば今までやってきたことと同じであるように感じます。
この章で重要なのはルールを正しく定義することなのかなと漠然と思いました。
まずはやってみて理解を深めていくのがいいですね。
早速最初のステージへいきましょー!

ジェムを取りつつ最後にスイッチを押すというお題なのですが、私最初スイッチが全然見えてなくて迷走してました。。
ここのステージでは親切な解説とざっくりとコードも作られています。
ステージを見ながら提示されているコードを改変して進めていけばいいという。
実に優しい。ありがたや〜。
解説を読みながら組み立てていくのが一番わかりやすかったです。
個人的に落とし穴だなぁと感じたのは、ステージの作り的にwhileループをネストすればいいんじゃないかと思ってしまったことです。覚えたことをすぐ使いたがる悪い癖。。。
もしかしたらその方法でも組み立て次第でクリアできたのかもしれないのですが、どうしてもスイッチのところで躓いて手詰まりになってしまいました。。
そこから視点を変え、もうネストしなくてよくない?と思い、改めて解説通りに組み立てたらクリア出来ました。
この試行錯誤もきっと私の実になっているのでしょう・・・
では、正解のコードを見ていきましょう!
func navigateAroundWall() {
if isBlockedRight {
moveForward()
} else {
turnRight()
moveForward()
}
}
while !isOnClosedSwitch {
navigateAroundWall()
if isOnGem {
collectGem()
turnLeft()
turnLeft()
}
}
toggleSwitch()
func関数を使って壁伝いに右へ進むことを定義しています。
(右側が行き止まりだったら前に進み、行き止まりでない場合は右を向いて前に進む)
そして、もしジェムがあれば取って振り返るという指示をwhileループで定義していくと、スイッチがオフになっているところまでループされるようになっていますね。
最後にスイッチを押すコードを加えれば完成です!
お次は今回ご紹介する最後のステージです。少しまた難易度が上がったステージになっています。
前回のステージと同様のコードだけでは乗り切れない内容になっており、擬似コードを参考にすでに組まれているコードに手を加えていくとのこと。

ここでは、右も前も行き止まりというマスが登場しています。(黄色の◯)
試しにコードを実行してみると提示されている疑似コードではこのマスから 先に進めないようになっています。
なので、そのマスに来たときにしず太郎にどういった動きをさせるかを定義していく必要がありますね。
↓提示されている擬似コードはこんな感じ

文章にしてみると何が足りないのかなんとなく見えてきませんか?
そうなんです!ここではfuncの定義を修正する必要がありますね。
もちろんコードを並べてみるのも解決に有用な手順ではあるのですが、文章にしてみるのもオススメです!
さて、ここまできたら何をどう修正するのかですね。
今の所足りていないのは、右も前も行き止まりの場合の動作でしたね。
この作業に入るとどこにコードを配置するか、毎度悩んで試行錯誤をしています。組み立て・実行を繰り返して正解にたどり着くのです。
↓回答例は、、、
func navigateAroundWall() {
if isBlockedRight && isBlocked {
turnLeft()
} else if isBlockedRight {
moveForward()
} else {
turnRight()
moveForward() }
}
while !isOnClosedSwitch {
navigateAroundWall()
if isOnGem {
collectGem()
turnLeft()
}
}
toggleSwitch()
&&を使って足りていない指示を補完しています。
この&&条件にあてはまらないとき、右側が行き止まりのマスにいた場合は前に進み、右側が行き止まりではなければ右を向いて前に進む。としています。
これでちゃんと最後まで進めるようになりました!
しず太郎がまるでロボットのように動いてますね。。。
でも最後に生を感じさせる動きをしてるので良しとしましょう。
今回はここまでですが、アルゴリズムの章を終えたらコードを学ぼう1は終了なのです!!
ようやくここまで来ました。。長かったような気もします。途中ちらほら忘れてるとこあるし。(要復習!)
次回で一区切りとなりますが、皆様もここまで一緒に楽しんでいただけてるでしょう。。きっと。
そう思っていないともう文章書けない 笑
それでは、今年最後の投稿となりますので・・・風邪・インフル・コロナに気をつけて良いお年をお過ごしくださいませ!
また来年お会いしましょう\(^o^)/