Swiftはじめました 第13回
こんにちは〜ツクリテのムゥです。
少し出遅れましたが、明けましておめでとうございます!
今年も定期的に投稿していきますので、引き続きよろしくお願いします!
前回まで
前回からアルゴリズムの学習に入りました。
ここのステージでは、前のステージからコピペしてきてそれを改変してもいいとのことで、まるっと持ってきちゃいました。
何も手を加えていないそのままのコードでしず太郎がどんな動きをするのかを確認してみましょう。
最後のジェムを取るところまではいいのですが、その後しず太郎が彷徨ってしまうという・・・切ない。
最初に組み立てたコード
func navigateAroundWall() {
if isBlockedRight && isBlocked {
turnLeft()
} else if isBlockedRight {
moveForward()
} else {
turnRight()
moveForward() }
}
while !isOnClosedSwitch {
navigateAroundWall()
if isOnGem {
collectGem()
turnLeft()
}
}
toggleSwitch()
このコードを見ると、OFFになっているスイッチの上じゃない限りジェムを取りつつfunc関数を繰り返して進み、最後にスイッチを押すとなっています。
しかしこのステージではジェムを取るのがゴールなので、whileループの条件が違ってきますよね。
このコードを実行すると、最後のジェムを取るところまではいいのですが、その後しず太郎が彷徨ってしまうと言ったとおり最後まで進むことはできているので、whileループを少し調整すればよいのです!
whileループの条件を、ジェムの上にではない限りfunc関数を繰り返すという形で調整し、最後にジェムを取るといったシンプルなコードでまとめました。
あんなに彷徨っていたしず太郎が路頭に迷うことがなくて安心ですね。
はい、では次のステージへいきましょ〜
ここは前ステージからのコピペ等は禁止です!
自分で0からアルゴリズムを書いていくのですが、説明にあるヒントはパターンを見つけるということ。。
スイッチの配置を見ると右か左に曲がっていくためのパターンが考えられますね。
曲がりたい方向毎にどういう条件をつけるのがいいのかを考えてみるとわかりやすかったです。
私は↓こんな感じからイメージしてアルゴリズムを書いてみました。
右に曲がるときはスイッチの上にいて、曲がって2マス目にまたスイッチがある
左に曲がるときはスイッチの上にいて、前が行き止まりになっている
これを踏まえて右手法を使ってコードを書いていくと、、、
func Aroundswitch() {
if isBlockedRight {
moveForward()
} else if isOnClosedSwitch {
toggleSwitch()
turnRight()
moveForward()
}
}
while !isOnGem {
Aroundswitch()
if isOnClosedSwitch && isBlocked {
toggleSwitch()
turnLeft()
moveForward()
}
}
collectGem()
右が行き止まりの時は前に進むが、もしスイッチの上にいたら押して右を向いて前に進む というfunc関数を組みました。(黄色丸)これで右に曲がれますね。
次に、スイッチの上にいて目の前が行き止まりという両方の条件を満たしたときは、スイッチを押して左を向いて前に進む というif関数で左に曲がります。(赤丸)このコードをwhileループに組み込んでしまえば完成となります!
分解して考えるとそんなに難しくないステージだと思いました。
珍しく一発でクリアできました!
しず太郎が淀みなく一直線にゴールにたどり着いたのは奇跡ですね。
さて、次はアルゴリズムの章最後であり、コードを学ぼう1の最終ステージでもあります。心してかかりましょう。
解き方は色々あるとのことなので、めちゃくちゃ悩みました。
目の前にはまずジェムが2つ、スイッチも2つずつ並んでいます。
最後のマスがONのスイッチなので、外側のwhileループはこれが条件になりそうです。
色々と解き方はあるってことですが、私にはその色々は思いつかない・・・
なので、以下を順番に組み立ててみました。
ONになっているスイッチの上にいくまでは前に進み続ける
もしジェムの上にいたらジェムを取る(2マス分)
ジェムの上ではなくOFFのスイッチ上にいたらスイッチを押す(2マス分)
行き止まりにならない限り前に進む
曲がる条件として、もし右側が行き止まりならば左を向き、そうでないならば右を向く
地味に躓いたのは、④の中に⑤を組み込んだ結果、同じところを延々と回ってしまいました。
かなり試行錯誤を繰り返しましたが、以下のコードでクリアすることができました!
while !isOnOpenSwitch {
moveForward()
if isOnGem {
collectGem()
turnRight()
moveForward()
collectGem()
} else if isOnClosedSwitch {
toggleSwitch()
turnLeft()
moveForward()
toggleSwitch()
}
while !isBlocked {
moveForward()
}
if isBlockedRight {
turnLeft()
} else {
turnRight()
}
}
ほんとになんとかクリアできて良かった。。。
このステージで『コードを学ぼう1』は終了です。
お疲れさまでした。
約半年くらい?やってきましたが、身につ いているのかどうか・・・後半はとくに不安が残る私です。
とはいえ、『コードを学ぼう2』なるものがあるようなので、引き続き手をつけていければいいなと思っております!
難易度は更に上がっていくであろうことは間違いないので、進度は遅そうな気配。。
暇な人もしくは奇特な方がいらっしゃいましたら是非また一緒に学んでいきましょう。
しず太郎とお待ちしております。
それでは、皆さんまた次回お会いしましょう♪