TETRIN
『TETRIN(てとりん)』は、四つのブロックから構成される「テトリミノ」を操作して遊ぶ落ち物パズルゲームです。
【ルール】
テトリミノがフィールドの上部から落ちて来ます。
テトリミノがフィールド最下部か他の固定されたテトリミノに接地すると、
そのテトリミノは固定され、次のテトリミノが画面上から落ちて来ます。
フィールドの段がブロックで埋め尽くされると、その段は消去され得点になります。
次のテトリミノが表示された際に、そのテトリミノがブロックに重なっているとゲームオーバーです。
フィールドの右側には次のテトリミノと、得点が表示されています。
得点の「:」(コロン)の右側の数字が同時に消した段数で、左側が消した回数です。
【操作】
←→ : テトリミノを左右に移動させる
↑ : テトリミノを回転させる
↓ : テトリミノを落下させる
SPACE : テトリミノを接地するまで落下させる
(テトリミノが固定されるまで遊び時間があります。
待ちたくない場合は↓押下で固定して下さい)
【更新履歴】
2018/02/05 初版公開
2018/02/06 コードの最適化、SPACE押下でテトリミノを接地するまで落下させる機能を追加
2018/02/07 フィールドの段数を20段から22段に変更
(公式には20段だそうですが、次のブロックの高さの2段分を増加させました)
2018/02/08 タイトルを「TETRIN(てとりん)」に変更
(「テトリス」は登録商標とご指摘を頂きました)
【ソースコード解説】
《変数》
T : Tetrimino, テトリミノの形状( 0 〜 6 の 7 種類)
U : 次のテトリミノの形状( 0 〜 6 の 7 種類)
K : Key, キー入力値
W : Wait, テトリミノ落下までのカウント
F : Flag, テトリミノ接地判定フラグ
C : Character, テトリミノのブロック描画のキャラクタ( 0 ~ 3 の 4 種類)
X : テトリミノのブロック描画の X 座標
Y : テトリミノのブロック描画の Y 座標
Z : 一時変数(X と Y を求めるために利用)
S : Shift, 配列の添字のシフト値( 0, 3 の 2 種類。 X と Y を求めるために利用)
L : Line, 同時に消去された段数のカウント
A : Address, アドレスの保持(段の消去時に利用)
I,J : Iterator, ループ変数
《配列》
[0] : キー入力後のテトリミノの X 座標
[1] : キー入力後のテトリミノの Y 座標
[2] : キー入力後のテトリミノの回転の状態( 0 ~ 3 の 4 種類)
[3] : テトリミノの X 座標
[4] : テトリミノの Y 座標
[5] : テトリミノの回転の状態( 0 ~ 3 の 4 種類)
----
[6] 〜 [33] : テトリミノのブロックの描画座標
16 bit を 4 つの 4 bit に区切り、4つのブロックの描画座標を保持しています。
4 bit のうち、上位 2 bit が X 座標、下位 2 bit が Y 座標です。
[6] 〜 [9] : テトリミノの形状が 0 のテトリミノ(I-テトリミノ)
[6] : テトリミノの回転の状態が 0 のテトリミノのブロックの描画座標
[7] : テトリミノの回転の状態が 1 のテトリミノのブロックの描画座標
[8] : テトリミノの回転の状態が 2 のテトリミノのブロックの描画座標
[9] : テトリミノの回転の状態が 3 のテトリミノのブロックの描画座標
(以下、テトリミノの回転の状態は上記と同様のルールに従います)
[10] 〜 [13] : テトリミノの形状が 1 のテトリミノ(O-テトリミノ)
[14] 〜 [17] : テトリミノの形状が 2 のテトリミノ(S-テトリミノ)
[18] 〜 [21] : テトリミノの形状が 3 のテトリミノ(Z-テトリミノ)
[22] 〜 [25] : テトリミノの形状が 4 のテトリミノ(J-テトリミノ)
[26] 〜 [29] : テトリミノの形状が 5 のテトリミノ(L-テトリミノ)
[30] 〜 [33] : テトリミノの形状が 6 のテトリミノ(T-テトリミノ)
----
[34] 〜 [47] : 次のテトリミノを表現するセミブロック
2つのセミブロックで次のテトリミノを表現しています。
[34] 〜 [35] : テトリミノの形状が 0 のテトリミノ(I-テトリミノ)
[36] 〜 [37] : テトリミノの形状が 1 のテトリミノ(O-テトリミノ)
[38] 〜 [39] : テトリミノの形状が 2 のテトリミノ(S-テトリミノ)
[40] 〜 [41] : テトリミノの形状が 3 のテトリミノ(Z-テトリミノ)
[42] 〜 [43] : テトリミノの形状が 4 のテトリミノ(J-テトリミノ)
[44] 〜 [45] : テトリミノの形状が 5 のテトリミノ(L-テトリミノ)
[46] 〜 [47] : テトリミノの形状が 6 のテトリミノ(T-テトリミノ)
----
[48] 〜 [51] : 得点
[48] : 一段消しが行われた回数
[49] : 二段消しが行われた回数
[51] : 三段消しが行われた回数
[51] : 四段消しが行われた回数
《コード》
5 : タイトル
10 〜 15 : 初期化
20 〜 25 : キー入力受付
30 〜 36 : テトリミノの移動と固定
40 〜 45 : 次のテトリミノ配置とゲームオーバー処理
50 : F の算出
60 : X と Y の算出
70 : テトリミノのブロック描画
80 〜 86 : 段の消去
【その他】
プログラムの容量の都合で「T-Spin(Tスピン)」は行なえません。
5 'TETRIN
10 CLS:CLV:LET[6],5533,291,5533,291,325,325,325,325,5208,342,5208,342,1113,4677,1113,4677,1161,292,345,9302,328,294,5513,1110,5209,5206,1112,293,#8C,#8C,#8A,#85,#88,#87,#82,#8D,#82,#8B,#8A,#83,#88,#8D
15 FORI=1TO21:LC0,I:FORJ=0TO11:?CHR$(I=21||J%11=0);:NEXT:NEXT:U=RND(7):GOTO40
20 IF W>90 W=0:K=31 ELSE K=INKEY()
25 IFK<28||K>32W=W+1:GOTO20
30 CLK:[0]=[3]-(K=28)+(K=29):[1]=[4]+(K=31):[2]=([5]+(K=30))%4:S=3
32 IFK=32 GSB50:[1]=[1]-F*2+1:IF!F:W=0:GOTO32
34 GSB50:IF !F C=0:S=0:GSB70:S=3:C=2:GSB70:FORI=0TO2:[I+3]=[I]:NEXT ELSE IFK=31S=0:C=3:GSB70:GSB80:GOTO40
36 GOTO20
40 T=U:U=RND(7):LET[3],4,1,0:LC14,2:I=34+U*2:?CHR$([I],[I+1]):FORI=1TO4:LC14,I+4:?I;":";[47+I]:NEXT:GSB50:IF F C=1:GSB70:END
45 C=2:GSB70:GOTO20
50 F=0:FORI=0TO3:GSB60:F=F|SCR(X,Y)&1:NEXT:RTN
60 R=[5-S]:Z=[T*4+R+6]>>(I*4)&15:X=[3-S]+Z>>2:Y=[4-S]+Z&3:RTN
70 FORI=0TO3:GSB60:LCX,Y:?CHR$(C):NEXT:RTN
80 L=0:FORI=0TO19
82 A=#901+(20-I)*32:IF LEN(A)>9 FORJ=ITO19:COPYA,A-32,10:A=A-32:NEXT:I=I-1:L=L+1
84 NEXT:IFL L=L+47:[L]=[L]+1
86 RTN