前回の続きです
(前回) なでしこでテトリスブロックをスーパーローテーションさせる - なでしこを明後日の方向に
回転テーブルはプログラムで作る!
テトリスのブロック回転の実装方法を検索すると、回転結果をテーブルとしてソースに直打ちしているものをよく見かけます。
SRSのほうは条件分岐をひたすら打ち込んでいるものも多数あり、長くなっているものが多い気がします。
プログラムでテーブルを作成することによって、SRSを短いコードで実装する方法を考えます。
完成プログラムと図
投稿してきました。
とりあえず実行すると、ブロックが回ります。
回転と左右反転
あとで使うので右回転と左右反転の関数を置いておきます。 なでしこ3のインデント構文で書いています。
●右回転(ブロックを)
ブロックを[0,0]で1にブロック回転
●左回転(ブロックを)
ブロックを[0,0]で-1にブロック回転
●左右反転(vを)
変数 結果 = []
vを反復
x,y = 対象
結果に[-x,y]を配列追加
結果を戻す
//回転方向:1=右 それ以外=左
//新しい配列を生成して返す
●ブロック回転(ブロックを,回転中心で,回転方向に)
結果 = []
変数 [中心X, 中心Y] = 回転中心
もし回転方向=1でなければ、回転方向=-1
ブロックを反復
x,y = 対象
x,y = [x-中心X, y-中心Y] //中心を引く
x,y = [-y*回転方向, x*回転方向] //回転する(回転方向は+1が右、-1が左)
x,y = [x+中心X, y+中心Y] //中心を足す
結果に[x,y]を配列追加
結果を戻す
回転結果のテーブルを作成する
初期値だけ書いておき、 x,y = [-y,x] で右回転すればOKです 前回の記事を参照。
以下は初期の回転軸を[0,0]としたブロックの中心です。
//なでしこ3 ブロック7種初期値
ブロック初期値={}
ブロック初期値["T"]=[[0,0],[1,0],[-1,0],[ 0,-1]]
ブロック初期値["L"]=[[0,0],[1,0],[-1,0],[ 1,-1]]
ブロック初期値["J"]=[[0,0],[1,0],[-1,0],[-1,-1]]
ブロック初期値["S"]=[[0,0],[1,-1],[-1,0],[0,-1]]
ブロック初期値["Z"]=[[0,0],[1,0],[-1,-1],[0,-1]]
ブロック初期値["I"]=[[-1.5,-0.5],[-0.5,-0.5],[0.5,-0.5],[1.5,-0.5]]
ブロック初期値["O"]=[[0.5,0.5],[-0.5, 0.5],[-0.5,-0.5],[0.5,-0.5]]
これを右回転させた座標を使えばプログラム内でテーブルを生成できます。
SRSの回転中心テーブルを生成する1(棒以外)
完成形はこれです。(棒以外)
これを中心に回転するとSRSが実装できます。
この表の左上を初期値として、右回転と左右反転でテーブルを完成させることができます。
[棒以外・状態0・左回転] = [[[0,0],[0.5,-0.5],[0,-1],[1,1],[1.5,0.5]]
[棒以外・状態0・右回転]は上記を左右反転
[棒以外・状態1・左回転]は上記を右回転
[棒以外・状態1・右回転]は上記を右回転
[棒以外・状態2・左回転]は上記を右回転
[棒以外・状態2・右回転]は上記を左右反転
[棒以外・状態3・左回転]は上記を右回転
[棒以外・状態3・右回転]は上記を右回転
//なでしこ3
定数 SRSテーブル1 = SRSテーブル1作成
●SRSテーブル1作成 //棒以外
変数 table = [] //戻り値
変数 a = 0 //回転状態 0~3
変数 v = [[0,0],[0.5,-0.5],[0,-1],[1,1],[1.5,0.5]] //通常回転[0,0] とSRS1~4(状態0の左回転)
aを0から3まで繰り返す
table[a]=[]
table[a][0]=v //table[状態][左回転]
もしa=0またはa=2ならば
v=vを左右反転
違えば
v=vを右回転
table[a][1]=v //table[状態][右回転]
v=vを右回転
//↑ vを左右反転・右回転・右回転・右回転・左右反転・右回転・右回転・右回転 の8回
tableを戻す
SRSの回転中心テーブルを生成する2(棒)
完成形はこれです。(棒)
まず棒の状態0を初期値として手入力します。
[棒・状態0・左回転] = [[0,0],[-0.5, 0.5],[ 1.0,-1.0],[-1.5,-0.5],[ 1.5,-0.5]]
[棒・状態0・右回転] = [[0,0],[-1.0,-1.0],[ 0.5, 0.5],[-1.5,-0.5],[ 1.5,-0.5]]
この2つを基準として、右回転+2つを入れ替えしていきます……これは画像かプログラムを見た方が早い
定数 SRSテーブル2 = SRSテーブル2作成
●SRSテーブル2作成 //棒
変数 table =[] //戻り値
変数 v0 = [[0,0],[-0.5, 0.5],[ 1.0,-1.0],[-1.5,-0.5],[ 1.5,-0.5]] //[状態0][左回転]
変数 v1 = [[0,0],[-1.0,-1.0],[ 0.5, 0.5],[-1.5,-0.5],[ 1.5,-0.5]] //[状態0][右回転]
変数 a = 0
//a = [回転状態]
aを0から3まで繰り返す
table[a]=[v0,v1] //[左回転時,右回転時]
v0,v1 = [v1を右回転,v0を右回転] //右回転してv0とv1を入替
tableを戻す
できあがり
以上を用いて出来上がったのが最初のプログラムです。 もう一回リンクを貼っておきます。
あなたのテトリスにもSRSが実装されますように!