質問: obj.yi_ + 1; end ``` とプログラムを組みましたが、このプログラムでは、 (1,18)に達して以降ずっと(1,18)で止まってしまいます。 どうプログラムを変えれば、上手く動きますか?
回答: 手元にMatlabの実行環境がないので、コードを読む限りで分かる問題について回答します。間違いがありましたら指摘をお願いします。 現状の実装について ========= ``` if(yi >= 18) yi = obj.yi_ - 1; elseif(yi <= 5) yi = obj.yi_ + 1; end ``` この部分のコードを噛み砕くと、「 `obj.yi_`の値が18以上なら `y` を 1減少させ、`obj.yi_`の値が5以下なら `yi` を 1増加させ、**それ以外なら何もしない**」というようになっています。 このため、記載されているコードを読む限り、以下のような問題点があります。 * `6 <= obj.yi_ <= 17` の場合になにも起こらない * `obj` がどのように定義されているのか分からないため、正しい実装の示しようがない + `(1,18)に達して以降ずっと(1,18)で止まってしまいます` とのことですので、どこかで上下に動かしている実装があるのでしょうか? * 現在の移動方向が示されていない + 上2つについては、この質問に記載されていないだけでどこかに実装がある場合、問題ありません。しかし、主題である`(1,18)に達して以降ずっと(1,18)で止まってしまう`というのは、明らかに壁で跳ね返らずに現在の移動方向が正の方向のままであるのが原因です。 正しい実装の例 ======= 速度を表す`v`という変数を導入して、壁に跳ね返った時点でこれを逆方向に変換するのが良さそうです。今後、速度の変更や壁の弾性係数を指定することもできるでしょう。 ``` v = 1; xi = 1; yi = obj.yi_; if(yi >= 18) yi = obj.yi_ - 1; v = -v; elseif(yi <= 5) yi = obj.yi_ + 1; v = -v; end ```