Tetris Esolang
March 9, 2021 · View on GitHub
BNF
<program> ::= <statements>
<statements> ::= <statement> "\n" | <statements>
<statement> ::= <tet-move> | <comment> | <label>
<tet-move> ::= <tetris> <use-order><move>
<comment> ::= /^#.*/
<label> ::= /-?[0-9]+:/
<tetris> ::= /[ILJZSOT]/
<move> ::= /[><^VAB]*/
<use-order> ::= "." | ":"
処理
横10 x 高さ20を持つテトリスフィールド上でテトリミノを操作し、テトリスを消すと命令が実行される。
操作は ^,V,>,< が上下左右キーで、Aが時計回りの回転、Bが反時計回りの回転 ワールドルールの回転をする 各テトリミノには use-order が":"の時には固有の命令が書かれているので組み合わせて使う。 use-order が"."の時には何も描かれていない(XXXXの)テトリミノ。
- I: IXX= (Iの書き方の上から順に)
- L: LXXM (Lの書き方の上から順に)
- J: JXX/ (Jの書き方の上から順に)
- Z: ZXXB (Zの書き方の左上から順に)
- S: SXXP (Sの書き方の右上から順に)
- O: OX*X (Oの書き方の右上から順に)
- T: +XX- (Tの書き方の左上から順に)
テトリミノの操作は tet-move を上から順に実行していく。
brainfuckのように内部的に無限長の数値型(実装依存:js実装ではNumberも可)の配列Aを持っており、それにアクセスするための数値型のPがある。最初はAの要素はすべて0で初期化されている。また、最初はP=0である。
高さ20を超えてしまった場合、テトリスが終了するのでプログラムも(正常)終了する。実行できる命令がない場合も終了する。
演算結果は変数R(型は実装依存の数値型)に格納される。
テトリスを消すと通常のテトリスで加算される得点がRに格納される。nライン削除でR=100*n
Tスピンなどの追加得点は存在しない。あくまでnライン削除でR=100*nのみ。
テトリスの出現位置について その後削除されたテトリミノの左上から順に命令を実行する。一番上の行を左から実行し終えたら次の行を実行...という流れ。
- X:Nop
- I: 標準入力から1文字取ってRをそのユニコード値にする。EOFではR=-1となる。
- O:標準出力にRの値をユニコード値として出力。
- J:ラベル R にジャンプ。複数同じラベルがある場合はプログラム実行前にエラーをだす。ラベルが存在しない場合はジャンプしない。
- Z: P = 0 . Zero.
- P: P += R. ポインタを動かす。Pointer.
- L: R = A[P] .Load.
- S: A[P] = R. Store.
- +-*/= : よくある二項演算 (=は宇宙船演算)。R = R op A[P]
- M: R = -R . Minus.
- B: テトリスフィールドをすべて削除し、以降の命令は実行されない。Bomb.