見出し画像

テトリスでプログラミングを試そう(11)

こんにちは。
今日はミノの回転ができるようにしたいのですが、プログラムの訂正をさせてください。
回転操作について、昨日まで考えていた方法より簡単な方法を思いついたのですが、そうしようとすると、プログラムの訂正が必要になってしまいました!すみません!


class Mino の動作を次のように変更します。
今まで _px_8int_cur は、実際に表示される x座標、y座標を保持していたのですが、4×4マスの中での座標を表すことにします。
つまり、以下の4つの値のどれかを表すことにします。
0, Game.Px_BLOCK, Game.Px_BLOCK *2, Game.Px_BLOCK * 3

_px_8int_cur が表す座標は、平行移動では変わらず、回転移動のときだけ変更することにします。

さて、変更点を細かく書いてみましたが、伝わったでしょうか?
細かく書いたのには理由があります。
この変更による書き換えが、class Mino の内部だけにとどまる、ということが分かってほしいからです。
今から書き換えるのは、class Mino 内の _px_8int_cur についてですが、_px_8int_cur は public の指定がされていないので、class Mino の外側では利用されていない、ということが保証されるのです。

もし、オブジェクト指向で書いていなければ、_px_8int_cur の利用方法を変更するとき、その変更による影響がないか、プログラムの全ての行をチェックしなければなりません。
今回はオブジェクト指向で書いているため、class Mino の内部だけをチェックすればよい のです。
オブジェクト指向による書き方は、プログラムの内部動作の変更に対して強いのです。
オブジェクト指向を用いてプログラムを書く大きな理由が、少しは伝わったでしょうか?

変更点は、大きく分けて4つになります。
◆ 変更点1
class Mino の中に、実際に表示する位置を記録する変数 _px_x_px_y を追加します。

L117 のように1行追加してください。

◆ 変更点2
class Mino の Set() を以下のように変更します。

L123, 124 を追加して、L130, 131 を書き換えました。

◆ 変更点3
Move_L()、Move_R()、Move_D() を以下のように単純化します。

◆ 変更点4
Draw() を1行変更します。

L160 が少し変わりました。

以上の4つを変更しましたら、F5 キーを押して、T ミノが正しく動作するかどうかチェックしてみて下さい。


さて、それでは、ミノを回転する機能を追加しましょう。
ミノの大きさが3×3マスに入る場合 は以下のようになります。
4マスが直線に並ぶ I ミノは、別の方法を利用します。あと、正方形の Oミノは回転しません。)
90度右に回転したとき、それぞれの 四角形の左上の座標 の変化を見れば、回転の計算方法はすぐに分かります。

上の図では、四角形の辺の長さを 10px としています。

上の図のように、四角形の辺の長さを 10px として、赤色の列の座標 (x, y) を回転すると、(20 - y, x) に移ると分かります。
黄色の列も緑色の列も、同じ計算でうまくいきます。

では、class Mino に、以下の関数を追加して下さい。
配列 _8int の 0, 2, 4, 6 番目が x 座標で、1, 3, 5, 7 番目が y 座標となっています。

class Mino に追加します。

次に、この Rotate_R() を呼び出す関数を class MainPage に追加しましょう。

class MainPage に追加します。

最後に、xaml ファイルにも Clicked="" を追加しましょう。

L44 の1行を追加します。

ここで、F5 キーを押して、右回転することを確認しましょう。

T ミノが右を向きましたね^^

では、左回転もちょちょっと追加してしまいましょう。右回転と同じく、追加する所は3つです。

class Mino に追加します。
class MainPage に追加します。
xaml ファイルに、Clicked="" を1行追加します。

また、F5 キーを押して、左回転もすることを確認してくださいね。


今日は偶然にですが、オブジェクト指向でプログラムを組むときの利点が少し伝えられたかな?と思っています。

何か問題が発生したときに対処しやすいように、プログラム言語は発展してきています。
そのため、プログラム言語を学ぶときには、文法書を読むよりも、他人の真似でいいので、実際にコードを入力して動作を見ながら学んだほうが分かりやすいと思います。
問題が発生しなければ、プログラム言語になぜそのような機能があるのか分かりにくいからです。
文法書で public の機能について読むよりも、今日のように public を付けてないことによるメリットを実感する方が簡単だと思いませんか?

それでは、今日はまだ月曜なので体力を温存しながら、今週も頑張りましょうね。


この記事が気に入ったらサポートをしてみませんか?