Enjoy programming more!
Kidspod is a post site which supports young programmers.
First step to join us.
Register as a member
For members

2018/02/05 13:25:26

MixJuice GET URL : kidspod.club/mj/458

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 : 段の消去

  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

SOURCE CODE

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

COMMENT

Kidspod運営チーム
Kidspod運営チーム2018/02/10 18:29:43

これはハマりますね。スコアの表現や、消えるときのアニメーションも素敵です。コードの解説まで付けていただき、ありがとうございます!