テトリス（tetris）のガイドラインを理解する

~~（後で推敲する）~~

この記事は[プログラマーのオススメのゲームの話をする Advent Calendar2019](https://adventar.org/calendars/3962)7日目の記事です。
前日はisk_tknsさんのCarnage Heartシリーズについて→http://isk-holistic.hatenablog.jp/entry/2019/12/06/134046

最近Tetris99やってハマった。そこで自分でもTetris作りたいなーって思いながら色々調べてて思ったことある。
Tetrisってプログラミングの練習やショートコード等の曲芸の対象にされてるけど、大体がホールドがギリあるか程度で、スーパーローテーションもRandom bagも設置猶予がないのが多いなぁって。
Tetrisには版権を持っている会社が「大体この通りに作ってね」ってのを示すガイドラインがある。
日本の記事であんまり見ないので海外のサイト等を見ながら説明していこうと思う。
説明で開発者視点とプレイヤー視点がごっちゃになってるけど許して。
英語苦手なんで翻訳ミスってるとこある気がする。正確な情報は[ガイドラインPDF](https://www.dropbox.com/s/g55gwls0h2muqzn/tetris%20guideline%20docs%202009.zip?dl=0)を見て。（ゲームプレイに関しては2009 Tetris Design Guideline.pdf）
実際に[Tetrisをプレイ](https://tetris.com/play-tetris)してみて確かめてもいい。
あと時間があれば実装も載せたいけど多分無い。
準拠したらTetrisの著作権等に触れちゃうとかそういう話は今回はしない。

#ガイドラインについて
年によって差異があるっぽいので今回は見つかった中で一番新しい2009年のものを参照する。
これはTetris99やぷよテトで使われるやつだと思われる。（ちゃんと検証してないので違う部分あるかも）
あとTetris99やぷよテトの対人戦の仕様についても触れます。
これは一応ガイドラインにも記載はあるけど、少ないし何より製品の対戦の仕様と矛盾する部分がある。
バランス調整でかなり仕様変更があると思うので、そこはガイドラインから一旦離れて他サイトでの検証結果の方を参照する。
全部書くのは疲れるのでプレイに関係ありそうな部分だけ書く。

#デザイン
>![コメント 2019-12-06 090539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67919/c720e4bd-6c5c-cb65-e42c-37373e5fa22a.png)
出典-2009 Tetris Design Guideline.pdf(P6)

1，フィールドの大きさ。20行10列。21行目目がちょっと見えてもいいらしい。
><img width="50%" alt="2019-12-06 ff.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67919/5fa1358e-b5a6-a845-50da-c13f2f8843fa.png">
出典-2009 Tetris Design Guideline.pdf(P10)

2、操作中のテトリミノ。左右回転と左右移動、ハード/ソフトドロップができる。

3，ネクスト。次に降っってくるテトリミノを表示する。6個まで表示が理想的だが、デザイン都合等で1～6個になっても大丈夫らしい。（図では明らかに7個表示してるけど、一番近いネクストは数に含めないのか、1個の表示と6個の表示の例を2つとも載せてるだけなのか……。）
ちなみにTetris99はネクスト6個、ぷよテトは二人対戦だと5個で3～4人対戦だと3個。

4、ゴースト。今操作してるテトリミノをハードドロップしたときに設置される場所を示す。半透明やアウトラインのみで表示する。

8、現在ホールドしているミノ。

#テトリミノ

　鏡像を別として数えたテトロミノ7種類。
画像のように色が決まっている。白黒の場合はマークや濃淡で違いを表現する。
ミノの形により画像の左からそれぞれO、I、T、L、J、Z、Sミノと呼ばれる。（俗称？）
>![hhhh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67919/eea10c3e-9bcc-ae62-4b59-03b5a63504e4.png)
![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67919/fd0cd0f0-afaa-0cde-ecb0-2469f020da7a.png)
出典-2009 Tetris Design Guideline.pdf(P9)

###バッグシステム
テトリミノの降ってくる順番には法則がある。7個を1順として、そこに全ての種類のテトリミノが出現する。この1順をバッグと言うらしい。
つまり同じミノが2つ続くならそれはバッグの境目であり、特定のミノは13個以内に必ず来る。

###出現時の初期状態
向きはネクストに表示されている状態（北向き）。場所は、横はOミノ以外は左から4列目にミノの左端がくるように出現、Oミノだけは左から5列目にミノの左端が来るように出現する。縦はミノの下端が21行目になるように出現。

#操作
左右移動、左右回転、ハード\ソフトドロップ、ホールド、ポーズの各コントローラーでの割当。
ゲームコントローラー、スマホからテレビのリモコンにも割当がある。キーボードの割当の上キーが右回転なのが謎。というかやりにくい。

#テトリミノの挙動(P16)

###左右移動
ボタン1回押したら1ブロック移動。そこから長押しすると0.3秒の待機時間後にオートリピートが入り、端から端に0.5秒で到達する速度で動く(10ブロック分だから0.05秒で1ブロック？)。オートリピートはミノを設置しても途切れないので、オートリピートが入った状態で設置したら次のミノは0.3秒の待機時間無しで押してる方に高速で動く。
つまりミノを端に置く場合、先行入力の有る無しで最大0.3秒の差が発生する。

###向き・回転(スーパーローテーションシステム）(P36)
Tetrisちゃんねるの記事が詳しい。この記事の向きのA,B,C,DがガイドラインP36のNorth,East,South,Westに対応。
[SRS - Tetrisチャンネル](https://tetrisch.github.io/main/srs.html)
スーパーローテーションと呼ばれる回り方をする。二次配列をそのまま回して壁やブロックと衝突判定して回転可能かどうか判定する場合よりも、直感的な回転を可能にする。（直感的に不可能な回転も可能になってる）

回転後に許容するミノの位置が1~5の5パターンあり、その位置に障害物（ブロック・壁・床）が無いパターンのうち一番小さいインデックスの位置に移動する。どのパターンも無理なら回転しない。
パターンの位置のずれ方は元のI、O以外は共通。向きと回転方向で場合分けが必要だけど実装は見た目よりも楽。

これがあるので見た目上明らかに入らない場所に回転を駆使して設置する「回転入れ」やミノをぐるぐるさせて地形を「登らせる」ことが可能になる。S、Zミノは見た目上同じでもSRSの都合で回転入れができる向きと出来ない向きがある。
[各種回転入れ - 喜竹屋本舗](http://waka.nu/tetris/spin/index.html)

###ハード/ソフトドロップ
ハードドロップは0.0001秒で落下。つまり100,000FPSでもない限り押したら即設置でいい。ソフトドロップは押してる間落下速度が現在の自然落下速度の20倍になる。

###ホールド
テトリミノを1個保持できる。使うと現在のミノがホールドに入り、ホールドにあったミノが降ってくる（最初だけはネクストが降る）。1回使うと設置するまで使えない。

###ロックダウン（設置判定）(P17)
3つあるらしいけど一番使われてるExtended Placement LOCK DOWNについて書く。
ミノは底面が床やブロックと触れても即設置されない。0.5秒間なにも無ければ設置される。
この0.5秒間に回転や移動が行われるとタイマーがリセットされてまた0.5秒の猶予が生まれる。
これだけだと無限に設置しないことが可能なので、回転or移動が計15回行われると猶予無しで設置される。底面が触れてない場合はまだ回転・移動はできるけど触れた瞬間設置される。
この15のカウントはミノが1ブロック落下するとリセットされる。ただし回転で上昇しても位置の最低値が更新されないとリセットされない。

#ゲームオーバー(P26)
3パターン。
1. ネクストミノが出現する場所にブロックがある。
2. ミノを完全にフィールド外に置く。
3. 敵の攻撃等によりフィールドの更に20ブロック上までブロックがせり上がる。

1が一般的。2はフィールド内にミノの一部もはみ出ずにおいてしまった場合。これはぷよテトとTetris99で判定が違う。
例えば完全にフィールド外に横に置いたIミノで1ライン消しをした場合、ぷよテトだとゲームオーバー判定だけどTetris99だと
ゲームオーバー判定にならない。（どっちが正しいかはわからない）
3は対戦でもめったに起こることはない。どちらかというと技術的上限を設けてるだけっぽい。
ぷよテトはこれを守ってないらしく、20ラインを超えてもゲームオーバーにならないどころかブロックが増殖する。→https://www.youtube.com/watch?v=9X2AYnr2XaQ

#Tスピン(P28)
直前の移動が回転であり、さらに図のABCDのうち3つ以上ががブロックか壁で埋まってたらTスピン。

>![fhhhh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67919/65513f2c-2d86-f5af-bc7c-3beb2c249a16.png)
出典-2009 Tetris Design Guideline.pdf(P10)

Tスピンミニというものがあり、これの条件を満たすとTスピンが「弱く」なる。（スコアとか攻撃的に）
図のABのどちらかが空いてしまっていたらTスピンミニになる。
ただし、SRSでのパターンの一番最後のパターンでの回転で設置された場合のみミニにならない。（これのおかげでSTSDの1発目がミニにならない）


#終わりに
正直全部反映しようとすると面倒くさいのでしたいとこだけ実装すればいいと思う。
でもSRSとロックダウンはせめてほしい。
これを参考にTetris作ってくれてもTetrisのプレイの参考にしてくれても嬉しい。
Tetris面白いよ。
時間ギリギリなぐり書きになったので後で修正します。（多分）