初期化 1.エキスパートを初期化する

いままで、ステージに動かすキャラクターは一人(一匹?)だけだったので、moveForward()やturnLeft()などはドット表記で誰に対する指示かを示す必要はありませんでした。ただこれはプログラミングとしては本当は不完全で、ここからはより本格的な文法にそって、キャラクターのインスタンスも明示してドット記法で指示することになります。正直、Swift Playgroundsの入力操作でこれを徹底するのはかなり面倒くさいですが、先々キャラクターも複数になってきたりするので致し方ありません…

また前ステージまではbluePortalやpinkPortalなどのインスタンスが最初から用意されていましたが、これも本当に自分でプログラミングする時は逐一用意が必要です。これが初期化です。いままでも変数を

などとして用意(宣言)しましたが、それと同じことです。

はExpert()(先頭が大文字で()がついてることに注意)という設計図(クラス)に沿って、expert(先頭小文字で()無し)というインスタンスを作成(初期化)しなさい、ということです。
var(変数)ではなくlet(定数)として作成するのは、expertという名前はプログラム終了まで同じインスタンス(個体)のことを指してかわらないよ、という事です。
初期化が無事完了すれば、いままでどおりmoveForward()やturnLeft()といった命令を与えられるようになります。ただし今後はドット記法を使って、

とセットで書く必要があります。いくつもの命令を連続して書くのはウンザリしがちですが仕方ありません。もうちょっとアプリの反応がサクサクしてるといいんですけどね…

それ以外は今までのステージとかわりません。ナビゲーション周りについては、3歩連続で進む場面が多いので、今回もmove3()という名前で関数を作りました。関数の中でexpert.moveForward()と命令相手を明記しているので、move3()自体はexpert.move3()などとドット表記にする必要は(当面は)ありません。
続いて、中心にあるスタート地点から三方向に同じ距離だけいったところに宝石があるので、これを取ってスタート地点に戻ってくるというのをひとかたまりの処理として関数getGem()を作りました。
そして一方向だけ途中道が途切れていて渡れないところがあります。ここは残り1方向を進んだところにあるスイッチを操作して床板を浮上させる必要があります。ここはmove3()を活用しつつ個別に処理をしました。

余談ですが、いまいちインスタンスの初期化のイメージがわかないという人は、たい焼きとその型をイメージしてみましょう。Taiyaki()という型にたい焼きの形状があらかじめ彫り込んであります。これを使って実際に使える(食べられる)たい焼きを作るのが、

という記述になります。実際にはたくさんのたい焼きを作るので、区別ができるよう名前を変えていきます。

のように番号を振ってもいいし、

と丁寧に名前をつけても構いません。
このステージの

の左辺のexpertは、一体しか使わないことがわかっているので手抜きでそのまんまexpertとしてるので、型/設計図であるExpert()とかぶってわかりづらいのです。
さて、型であり設計図であるTaiyaki()には、「たい焼きにはあんこが入っているもので、その種類も選べる」という決まりも書き込まれていたとします。これは出来上がった個々のたい焼きがぞれぞれもつ個性(プロパティ)であり、

などと指定できるかも知れません。
あるいは、

とかして命令を出せたりして?これらは設計図(クラス)であるTaiyaki()で予め決まっています。それを元に量産された個体がインスタンスです。

改善希望!役に立った! (+11 rating, 21 votes)
読み込み中...

“初期化 1.エキスパートを初期化する” への1件の返信

  1. let expert = Expert()

    func move3() {
    for i in 1 … 3 {
    expert.moveForward()
    }
    }

    var countGems = 0

    func goGetNextGem() {
    expert.turnLeft()
    expert.turnLeft()
    move3()
    expert.turnLeft()
    move3()

    expert.collectGem()
    countGems += 1
    if countGems >= 3 {
    return
    }

    goGetNextGem()
    }

    move3()
    expert.turnLockUp()
    goGetNextGem()


    久しぶりに解いてみました。
    このコードに不備がありましたら
    ご教示いただけますと幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です