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

【その他】
プログラムの容量の都合で「T-Spin(Tスピン)」は行なえません。

  • 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

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