なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこでテトリスの回転やSRSのテーブルを生成する

前回の続きです

(前回) なでしこでテトリスブロックをスーパーローテーションさせる - なでしこを明後日の方向に

回転テーブルはプログラムで作る!

テトリスのブロック回転の実装方法を検索すると、回転結果をテーブルとしてソースに直打ちしているものをよく見かけます。

SRSのほうは条件分岐をひたすら打ち込んでいるものも多数あり、長くなっているものが多い気がします。

プログラムでテーブルを作成することによって、SRSを短いコードで実装する方法を考えます。

完成プログラムと図

投稿してきました。
とりあえず実行すると、ブロックが回ります。

n3s.nadesi.com

回転と左右反転

あとで使うので右回転左右反転の関数を置いておきます。 なでしこ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の左回転)
 
 a0から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 = [回転状態]
 a0から3まで繰り返す
   table[a]=[v0,v1] //[左回転時,右回転時]
   v0,v1 = [v1右回転,v0右回転] //右回転してv0とv1を入替
 
 table戻す

できあがり

以上を用いて出来上がったのが最初のプログラムです。 もう一回リンクを貼っておきます。

n3s.nadesi.com

あなたのテトリスにもSRSが実装されますように!