
Swiftはじめました 型編 その2

こんにちは、ムゥです。
だいぶ暖かくなり春めいてまいりましたね。
桜が咲いたらお花見と昼寝。
春はあけぼのというだけあって、ぽかぽかしたところでのお昼寝は最高ですが、今日も元気に眠気を吹き飛ばして頑張ってまいります!
型編 part2
前回に引き続き、型のお勉強です。
ここまでワープホールを適宜コントロールして目標を達成してきました。
この後はどんなステージが待っているのか楽しみですね。
ではさっそく次のステージへ行ってみましょう!
ここでは、前回と同様にワープホールを切り替えてスイッチを押したりジェムを取ったりしていきます。
ジェムとスイッチの配置がややこしく・・・混乱しますなぁ。。

解説にあるように正解は一つではないということなので、まずはどういうルートで行くのかを決めました。
画像にふった番号の順番でしず太郎を動かしていくイメージです。
①のgreenportal付近のスイッチを押しにいく
②のgreenportal付近のジェムを取りに行く
③のorangeportal付近のスイッチを押しに行く
④のorangeportal付近のジェムを取りに行く
この中にワープホールの切り替えを入れ込む感じで組み立ててみました。
ここですごい難しいなと感じたのは、切り替えのタイミングです。
forループやfunc関数を使ってプログラムしたのですが、それらの途中ではもちろん切り替えをすることはできません。
どこで切り替えるのかということと、切り替えるためにforループやfunc関数をどのように使うのか考えさせられました。
ワープホールを通った時のしず太郎の向きがうまく合わなくて、地味にイラッとしました(笑)
func turnAround() {
turnLeft()
turnLeft()
}
func move2() {
moveForward()
moveForward()
}
func serch() {
if isOnGem {
collectGem()
} else if isOnClosedSwitch {
toggleSwitch()
}
}
func collection4() {
for i in 1 ... 4 {
turnRight()
moveForward()
serch()
turnAround()
moveForward()
}
}
func collection2() {
serch()
turnAround()
moveForward()
turnRight()
moveForward()
serch()
turnAround()
}
turnLeft()
move2()
greenPortal.isActive = false
collection4()
moveForward()
greenPortal.isActive = true
turnAround()
moveForward()
greenPortal.isActive = false
turnAround()
moveForward()
collection2()
move2()
move2()
turnAround()
moveForward()
orangePortal.isActive = false
collection2()
orangePortal.isActive = true
moveForward()
orangePortal.isActive = false
collection4()
コードがめちゃくちゃ長くなってしまいました・・・なんだろう。
上級者はもっと短くスマートな感じになるのでしょうか。全く思いつかない。
func関数の名前がちょっとお粗末ですが、収集する個数別に設定してみました。
if関数もfunc関数の中で定義して少しは短くなったかも?。。多分気のせいです。
でもまあいいんです。
しず太郎がゴールできるかが重要なのでもう気にしません!
ドキドキしながら実行ボタンを・・・
ゴールに来ましたね。結構苦労した割にはあっさりとした褒め言葉なので物足りなさが否めませんが、達成できたので良しとしましょう。
難易度高くなってきてステージ進度が遅くてすみませんw
いよいよ今回ご紹介する最後のステージでございます。
ここではランダムに現れるジェムを全部取 ってこいってやつみたいです。

出現するジェムの数が変わるだなんて。。想像するだけで非常に複雑そうでパニックです。
両脇の道にあるジェムはワープホールを使わないと取りにいけない仕様。
まずは、通路を行ったり来たりしつつジェムを取ってカウントしていくプログラムを考えました。
let totalGems = randomNumberOfGems
var gemCounter = 0
func turnAround() {
turnLeft()
turnLeft()
}
func serchGem() {
while !isBlocked {
moveForward()
if isOnGem {
collectGem()
gemCounter += 1
}
}
turnAround()
}
名前はジェムを探すということでserchGem()としました。
行き止まりにならないように振り返ることも忘れずに入れましょう!
次に、ワープホールがONの時にはOFFに、逆にOFFの場合にはONにするためのプログラムを書いてみました。
func pinkPortal() {
if pinkPortal.isActive==true {
pinkPortal.isActive = false
} else {
pinkPortal.isActive = true
}
}
比較演算子。久しぶりに使った気がする。
青のワープホールも同様ですね。
このコードを使って組み立ててみると、以下プログラムの完成です!
while gemCounter < totalGems {
moveForward()
serchGem()
pinkPortal()
bluePortal()
}
こうやって見るとめちゃくちゃシンプルですが、ここまでたどり着くまで道のりは長く。。私の脳みそがポンコツなせいで数時間かかっているというw
自分の無能さにイラッとしますね。
本当に最後まで動いているのか、心配になるほど短いコードなので実行した様子を御覧ください!
ジェム1個かよ!ってツッコミたいところではありますが、、、
ちゃんと動いて安心しました。
どうも章の最後のステージの難易度は私には合っていないように思う。。。
これをすいすいできる人ってすごいなぁ。
ここまで連載してきましたが、最近思ったこととして。
理解できなくはないけどとっさに出てくるのか怪しい程度に知識を溜められればまずはい いと思っています。
そんなにはじめから理解して身につくものではないです。にんげんだもの。
苦手なことだってありますよ。うまくいかなくても自信をなくさず一緒に頑張っていきましょう!
それでは、今日はここでおしまいです!
また次回は新しい章に入っていきますのでお楽しみに