
Swiftはじめました 第7回

こんにちは、ツクリテのムゥです。
「Swiftはじめました」の連載、楽しんでいただいてますでしょうか。
更新は隔週でのんびりと進めたかったのですが、難易度が上がってきてそんな余裕ないっていうね。。前回は手こずりの回でしたし。面目ないッス。
でもちゃんと継続するので安心してください!
前回まで
条件分岐コードの初歩的なことを学びました!前回の記事を読まれた方にとっては、記憶に新しいかと思います。私ちょいちょい躓いてました。読み返すとちょっと恥ずかしい。
得た教訓としては、「コードをきちんと理解する」ってことですね。
このことを胸に刻み、引き続き条件分岐コードの最終回をお送りします。
それでは、早速前回の続きとなるステージから見ていきましょう。

解説がとても親切なので、そこから順序立ててコードを組んでみました。
func collectOrToggle()を定義する
moveForward()
moveForward()
if isOnGem {
collectGem()
} else if isOnClosedSwitch {
toggleSwitch()
}
マスに何があるかの確認をしながら、該当する動作を指示する関数ですね。
この先はforループへ他の関数を組み合わせていくだけなのですが、繰り返しの回数はここでも地味に頭を悩ませてきますので、心してかかってください。
(コードを実行すると、配置されている内容がリセットされちゃうので画像と微妙に違うのはご了承くださいまし・・)
数えながら慎重に組み込みましたが、うまくいって良かったです。
forループは3回に分けて入れております。コードを見ると少し複雑に見えるかもしれませんが、funcで定義されている条件のおかげで実はシンプルな内容かと思います。
では次のステージへ参りましょう!
周りに配置されたジェムやスイッチを今まで習ったものを駆使してクリアしなくてはなりません。

ここは、小回りをきかせて移動する感じになるのですが、繰り返し箇所がコードを見ているとややこしく。。。funcで整理しないとforループを使うのも頭を使うところでした。クリアするのに約30分くらいかかりました 笑
ここで最初にやることは、条件分岐のコードを作成するところですね。
func switchOrCollectGem() {
if isOnClosedSwitch {
toggleSwitch()
} else if isOnGem {
collectGem()
}
}
このコード作成にはだいぶ慣れてきました。
次にfunc関数をいくつか作って、最後にforループを使用して完成させるという流れですね。
クリアまでのルートはいくつかあるので、どれが正解とは一概には言えないのがこのアプリのいいところだと思います。
私は左回りで進むルートを選択し、↓こんな感じに出来上がりました!
「すばらしい!」と称賛されるとしず太郎に何かあげたくなりますね。
出発地から正面を向いて最初にぶつかる壁の辺を1辺目として、2〜4辺をまるっと繰り返しにしました。
とはいえ、すぐにここにたどり着いたわけではなく、コードを全て書いて25分くらい熟考した結果です。これはズルではありません!多分。
次は条件分岐コードの最終ステージにふさわしい難易度・・・全然嬉しくない。

忘れかけていることも駆使しなければならなそうな気配がします。。。
ここでは、一本道を進みながら左右に配置されているジェムを取りに行くってやつですね。
ここで必要なのは、以下4つのコードです。
条件分岐コード
右の道への行きのコード
右の道からの帰りのコード
左のジェムを取るコード
①条件分岐コード
func collectgemOrtoggleswitch() {
moveForward()
if isOnGem {
collectGem()
} else if isOnClosedSwitch {
toggleSwitch()
}
}
②右の道のコード
func rightgem() {
turnRight()
moveForward()
moveForward()
moveForward()
turnLeft()
collectgemOrtoggleswitch()
}
③右の道からの帰りのコード
func rightreturn() {
turnRight()
turnRight()
moveForward()
turnRight()
moveForward()
moveForward()
moveForward()
turnRight()
}
④左のジェムを取るコード
func Leftgem() {
turnLeft()
collectgemOrtoggleswitch()
turnLeft()
turnLeft()
moveForward()
turnLeft()
}
複雑で難しいと思っていましたが、ルート上同じ動きになるところが一目瞭然ですね。
なので、ここまでの組み立てができればあともう一息。
定義した関数をループにまとめてしまうとだいぶ短いコードになりました!
for i in 1 ... 2 {
collectgemOrtoggleswitch()
rightgem()
rightreturn()
collectgemOrtoggleswitch()
Leftgem()
moveForward()
}
いつも関数を定義する時、名前の付け方に迷ってしまうんですよね。。
第3回目で、どういう動作をまとめているのか連想しやすいものにするのがオススメとお話しましたが、今後チームで開発を進める時は、命名規則を事前に決めておいた方が良さそうです。
まとめ
皆様いかがでしたでしょうか。今回でようやく条件分岐コードが終わりです!
けっこうな複雑さでしたが着実に身についてきた気がします。