いままで、ステージに動かすキャラクターは一人(一匹?)だけだったので、moveForward()やturnLeft()などはドット表記で誰に対する指示かを示す必要はありませんでした。ただこれはプログラミングとしては本当は不完全で、ここからはより本格的な文法にそって、キャラクターのインスタンスも明示してドット記法で指示することになります。正直、Swift Playgroundsの入力操作でこれを徹底するのはかなり面倒くさいですが、先々キャラクターも複数になってきたりするので致し方ありません…
また前ステージまではbluePortalやpinkPortalなどのインスタンスが最初から用意されていましたが、これも本当に自分でプログラミングする時は逐一用意が必要です。これが初期化です。いままでも変数を
などとして用意(宣言)しましたが、それと同じことです。
はExpert()(先頭が大文字で()がついてることに注意)という設計図(クラス)に沿って、expert(先頭小文字で()無し)というインスタンスを作成(初期化)しなさい、ということです。
var(変数)ではなくlet(定数)として作成するのは、expertという名前はプログラム終了まで同じインスタンス(個体)のことを指してかわらないよ、という事です。
初期化が無事完了すれば、いままでどおりmoveForward()やturnLeft()といった命令を与えられるようになります。ただし今後はドット記法を使って、
とセットで書く必要があります。いくつもの命令を連続して書くのはウンザリしがちですが仕方ありません。もうちょっとアプリの反応がサクサクしてるといいんですけどね…
それ以外は今までのステージとかわりません。ナビゲーション周りについては、3歩連続で進む場面が多いので、今回もmove3()という名前で関数を作りました。関数の中でexpert.moveForward()と命令相手を明記しているので、move3()自体はexpert.move3()などとドット表記にする必要は(当面は)ありません。
続いて、中心にあるスタート地点から三方向に同じ距離だけいったところに宝石があるので、これを取ってスタート地点に戻ってくるというのをひとかたまりの処理として関数getGem()を作りました。
そして一方向だけ途中道が途切れていて渡れないところがあります。ここは残り1方向を進んだところにあるスイッチを操作して床板を浮上させる必要があります。ここはmove3()を活用しつつ個別に処理をしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
//Expertという設計図でexpertというインスタンスを初期化(新規作成)する let expert = Expert() //expertが散歩進む関数を用意 func move3() { for i in 1 ... 3 { expert.moveForward() } } //expertがスタート地点から移動し宝石をとって戻ってくる関数を用意 func getGem() { expert.turnRight() move3() expert.collectGem() expert.turnRight() expert.turnRight() move3() } //ここから本編 move3() expert.turnLockUp() expert.turnRight() expert.turnRight() move3() for i in 1 ... 3 { getGem() } |
余談ですが、いまいちインスタンスの初期化のイメージがわかないという人は、たい焼きとその型をイメージしてみましょう。Taiyaki()という型にたい焼きの形状があらかじめ彫り込んであります。これを使って実際に使える(食べられる)たい焼きを作るのが、
という記述になります。実際にはたくさんのたい焼きを作るので、区別ができるよう名前を変えていきます。
|
let taiyaki1 = Taiyaki() let taiyaki2 = Taiyaki() |
のように番号を振ってもいいし、
|
let taro = Taiyaki() let hanako = Taiyaki() |
と丁寧に名前をつけても構いません。
このステージの
の左辺のexpertは、一体しか使わないことがわかっているので手抜きでそのまんまexpertとしてるので、型/設計図であるExpert()とかぶってわかりづらいのです。
さて、型であり設計図であるTaiyaki()には、「たい焼きにはあんこが入っているもので、その種類も選べる」という決まりも書き込まれていたとします。これは出来上がった個々のたい焼きがぞれぞれもつ個性(プロパティ)であり、
|
taiyaki1.anko = ogura taiyaki2.anko = cream |
などと指定できるかも知れません。
あるいは、
とかして命令を出せたりして?これらは設計図(クラス)であるTaiyaki()で予め決まっています。それを元に量産された個体がインスタンスです。