ぴゅう太テトリス 20190401版 by hex125(293)/20190413 ●はじめに  ぴゅう太・日本語G-BASIC上で動作するテトリスです。  なるとさんの 日本語G-BASICシミュレータ for Windows でも動作します。 ●導入方法  ぴゅう太実機で動かすためには、プログラムはもちろんですが、グラフィックデータも  正確に入力する必要があり、導入手順は非常に煩雑です。そのため後述します。  日本語G-BASICシミュレータを使用する場合は、起動して「一括ロード」から  「pyuta_tetris_20190401」(拡張子は何でもOK)を開いてください。 ●謝辞 poipoiさん 大杉ぴゅう太さん なるとさん Enriさん 制作にあたって大変お世話になりました。ありがとうございました。 ●実機での導入方法  このプログラムは「セルに書かれた上部2ラインぶんのビットパターンをセル文で取得  できる」という大杉ぴゅう太さんの発見をベースに構想したもので、グラフィックに  回転表示用のデータを埋め込んでいます。  このパターンを正確に描画しないとプログラムが正常に動きません。  セル249番から横に16個、縦に7個+1個(最終行は横に6個)の上部2ラインのパターンが  非常に重要です。正確に入力してください。  入力が終わったら、このテキストの末尾にある「ブロック回転表示テスト用プログラム」  を入力してください。実行するとRTを押すたびにブロックを表示します。すべてのブロック 、の表示がキチンと行われることを確認してください。  ここまで問題がなければ、以下のプログラムを入力してください。 ;------------------------------------------------------------------------------ ; ぴゅう太テトリス 20190401版 (コメントなし) ;------------------------------------------------------------------------------ 10 ZERO=0 20 WD=32 30 ST=248 40 NX=ZERO 50 SC=ZERO 60 マワレ 80 I=75 カラ 683 カンカク 32 70 980 ヲヨベ 80 トジル 90 TN=ZERO 100 POS=87 110 BC=NX 120 RI=(BC*WD)+ST 130 960 ヲヨベ 140 BC=ランスウ(6) 150 RI=(BC*WD)+ST 160 900 ヲヨベ 170 TP1=BC 180 BC=NX 190 NX=TP1 200 POS=47 210 RI=(BC*WD)+ST 220 760 ヲヨベ 230 モシ RET>ZERO ナラバ 720 ニイケ 240 カケ 99, SC 250 900 ヲヨベ 260 タイマ 1 オン 270 キイ 1 K1,K2 280 モシ K2<>ZERO ナラバ 610 ニイケ 290 モシ K1=7 ナラバ 550 ニイケ 300 モシ K1=3 ナラバ 570 ニイケ 310 モシ タイマ1>40 ナラバ 330 ニイケ 320 モシ K1<>5 ナラバ 270 ニイケ 330 MOVE=WD 340 850 ヲヨベ 350 モシ RET=ZERO ナラバ 590 ニイケ 360 オト ニオン 370 マワレ 530 I=75 カラ 683 カンカク 32 380 マワレ 410 J=1 カラ 10 390 K=セル(I+J) 400 モシ K=ZERO ナラバ 530 ニイケ 410 トジル 420 オト シオン 430 980 ヲヨベ 440 SC=SC+1 450 J=I 460 マワレ 480 K=1 カラ 10 470 セル(J+K)=セル(J+K-WD) 480 トジル 490 J=J-WD 500 モシ J>76 ナラバ 460 ニイケ 510 E=75 520 990 ヲヨベ 530 トジル 540 90 ニイケ 550 MOVE=-1 560 580 ニイケ 570 MOVE=1 580 850 ヲヨベ 590 オト イチオン 600 260 ニイケ 610 960 ヲヨベ 620 TP1=TN 630 TP2=RI 640 TN=セル(TN+475) 650 RI=(BC*WD)+(TN*4)+ST 660 760 ヲヨベ 670 モシ RET=ZERO ナラバ 700 ニイケ 680 TN=TP1 690 RI=TP2 700 オト サンオン 710 240 ニイケ 720 カケ 333, "GAMEOVER" 730 キイ 1 K1,K2 740 モシ K2=ZERO ナラバ 730 ニイケ 750 50 ニイケ 760 RET=ZERO 770 マワレ 830 J=1 カラ 4 780 K=セル(RI+J) 790 L=セル(POS+K) 800 モシ L=ZERO ナラバ 830 ニイケ 810 RET=WD 820 840 ニイケ 830 トジル 840 カエレ 850 960 ヲヨベ 860 POS=POS+MOVE 870 760 ヲヨベ 880 モシ RET=ZERO ナラバ 900 ニイケ 890 POS=POS-MOVE 900 CHAR=BC+164 910 マワレ 940 I=1 カラ 4 920 K=セル(RI+I) 930 セル(POS+K)=セル(CHAR) 940 トジル 950 カエレ 960 CHAR=163 970 910 ニイケ 980 E=I 990 マワレ 1010 R=1 カラ 10 1000 セル(E+R)=セル(163) 1010 トジル 1020 カエレ 9999 オワリ ;------------------------------------------------------------------------------ ; ぴゅう太テトリス 20190401版 (コメントあり) ;------------------------------------------------------------------------------ ;line command ;size total comment ;------------------------------------------------------------------------------ INIT: 10 ZERO=0 ; 2 2 ゼロ値(固定値) 20 WD=32 ; 2 4 横サイズ(固定値) 30 ST=248 ; 2 6 ブロック表示情報セル先頭 40 NX=ZERO ; 1 7 最初のNEXTXブロックを設定 ;------------------------------------------------------------------------------ RESTART: 50 SC=ZERO ; 1 8 消去ライン数(スコア) 60 マワレ 80 I=75 カラ 683 カンカク 32 ; 4 12 75はパネル左上座標-1(マワレが1スタートなので) 70 980(ERASE_LINE) ヲヨベ ; 2 14 パネル初期化 80 トジル ; 1 15 ;------------------------------------------------------------------------------ MAKE_NEW_BLOCK: 90 TN=ZERO ; 1 16 回転ID初期値 100 POS=87 ; 2 18 前回NEXTを消す 110 BC=NX ; 1 19 120 RI=(BC*WD)+ST ; 2 21 130 960(ERASEBLOCK) ヲヨベ ; 2 23 140 BC=ランスウ(6) ; 2 25 今回NEXTを表示 150 RI=(BC*WD)+ST ; 2 27 160 900(PUTBLOCK) ヲヨベ ; 2 29 170 TP1=BC ; 1 30 一時保存 180 BC=NX ; 1 31 ブロックID 190 NX=TP1 ; 1 32 NEXTブロック 200 POS=47 ; 2 34 初期表示位置 210 RI=(BC*WD)+ST ; 2 36 ブロック表示情報位置(回転時以外計算不要なのでココでしておく) 220 760(IS_PUTTABLE) ヲヨベ ; 2 38 置けるか確認 230 モシ RET>ZERO ナラバ 720(GAMEOVER) ニイケ ; 2 40 置けなければゲームオーバー ;------------------------------------------------------------------------------ SET2: 240 カケ 99, SC ; 2 42 スコア表示 250 900(PUTBLOCK) ヲヨベ ; 2 44 ブロックを配置 ;------------------------------------------------------------------------------ SET_TIMER: 260 タイマ 1 オン ; 1 45 ;------------------------------------------------------------------------------ KEYINPUT: 270 キイ 1 K1,K2 ; 2 47 キー入力分岐(メインルーチン) 280 モシ K2<>ZERO ナラバ 610(ROTATE) ニイケ ; 2 59 回転 290 モシ K1=7 ナラバ 550(LEFT) ニイケ ; 3 52 左移動 300 モシ K1=3 ナラバ 570(RIGHT) ニイケ ; 3 55 右移動 310 モシ タイマ1>40 ナラバ 330(DOWN) ニイケ ; 3 58 タイマ設定時間で自動的に落下 320 モシ K1<>5 ナラバ 270(KEYINPUT) ニイケ ; 3 61 下移動コマンドが入ってなければ戻る ;------------------------------------------------------------------------------ DOWN: 330 MOVE=WD ; 1 62 下に移動 340 850(MOVEBLOCK) ヲヨベ ; 2 64 350 モシ RET=ZERO ナラバ 590(RIGHT02) ニイケ ; 2 66 置けた場合は移動 360 オト ニオン ; 1 67 置けない場合は接着/接着時の音を出す ;------------------------------------------------------------------------------ CHECK_LINE: 370 マワレ 530 I=75 カラ 683 カンカク 32 ; 4 71 75はパネル左上座標-1(マワレが1スタートなので) 380 マワレ 410 J=1 カラ 10 ; 4 75 横に10回チェック 390 K=セル(I+J) ; 2 77 400 モシ K=ZERO ナラバ 530(CHECK_EXIT) ニイケ ; 2 79 セル内容が0なら空白なので脱出 410 トジル ; 1 80 420 オト シオン ; 1 81 ライン消去/ズラし時の音 ;------------------------------------------------------------------------------ 430 980(ERASE_LINE) ヲヨベ ; 2 83 ライン消去 440 SC=SC+1 ; 2 85 スコア加算 ;------------------------------------------------------------------------------ 450 J=I ; 1 86 全体をズラす DELETE_LINE: 460 マワレ 480 K=1 カラ 10 ; 4 90 470 セル(J+K)=セル(J+K-WD) ; 3 93 上のセルをコピーして下に持ってくる 480 トジル ; 1 94 490 J=J-WD ; 2 96 500 モシ J>76 ナラバ 460(DELETE_LINE) ニイケ ; 3 99 先頭行でなければ繰り返す 510 E=75 ; 2 101 パネル最上部のラインを初期化 520 990(ERASE_LINE01) ヲヨベ ; 2 103 ;------------------------------------------------------------------------------ CHECK_EXIT: 530 トジル ; 1 104 540 90(MAKE_NEW_BLOCK) ニイケ ; 2 106 ;------------------------------------------------------------------------------ LEFT: 550 MOVE=-1 ; 2 108 左に移動 560 580(RIGHT01) ニイケ ; 2 110 ;------------------------------------------------------------------------------ RIGHT: 570 MOVE=1 ; 2 112 右に移動 RIGHT01: 580 850(MOVEBLOCK) ヲヨベ ; 2 114 RIGHT02: 590 オト イチオン ; 1 115 移動時の音 600 260(SET_TIMER) ニイケ ; 2 117 ;------------------------------------------------------------------------------ ROTATE: 610 960(ERASEBLOCK) ヲヨベ ; 2 119 回転 620 TP1=TN ; 1 120 一時保存 630 TP2=RI ; 1 121 640 TN=セル(TN+475) ; 2 123 回転IDを進める 650 RI=(BC*WD)+(TN*4)+ST ; 4 127 再計算 660 760(IS_PUTTABLE) ヲヨベ ; 2 129 670 モシ RET=ZERO ナラバ 700(ROTATE01) ニイケ ; 2 131 回転可能 680 TN=TP1 ; 1 132 回転不可能なので戻す 690 RI=TP2 ; 1 133 ROTATE01: 700 オト サンオン ; 1 134 回転時の音つきでブロックを置く 710 240(SET2) ニイケ ; 2 136 ;------------------------------------------------------------------------------ GAMEOVER: 720 カケ 333, "GAMEOVER" ; 3 139 終了 RETRY: 730 キイ 1 K1,K2 ; 2 141 740 モシ K2=ZERO ナラバ 730(RETRY) ニイケ ; 2 143 750 50(RESTART) ニイケ ; 2 145 ;------------------------------------------------------------------------------ ; 以下、サブルーチン ;------------------------------------------------------------------------------ IS_PUTTABLE: in:Q/P out:R 760 RET=ZERO ; 1 146 ブロックを置けるか?(置ける場合はR=0, 置けない場合はR!=0が入る) 770 マワレ 830 J=1 カラ 4 ; 4 150 780 K=セル(RI+J) ; 2 152 K=補正位置 790 L=セル(POS+K) ; 2 154 L=チェックする位置のセルの内容 800 モシ L=ZERO ナラバ 830(IS_PUTTABLE01) ニイケ ; 2 156 810 RET=WD ; 1 157 820 840(IS_PUTTABLE02) ニイケ ; 2 159 なくても動くけどあったほうが速い IS_PUTTABLE01: 830 トジル ; 1 160 IS_PUTTABLE02: 840 カエレ ; 1 161 ;------------------------------------------------------------------------------ MOVEBLOCK: in:M/Q/P 850 960(ERASEBLOCK) ヲヨベ ; 2 163 ブロックを動かす 860 POS=POS+MOVE ; 2 165 870 760(IS_PUTTABLE) ヲヨベ ; 2 167 880 モシ RET=ZERO ナラバ 900(PUTBLOCK) ニイケ ; 2 169 置ける場合は移動 890 POS=POS-MOVE ; 2 171 置けない場合は戻す ;------------------------------------------------------------------------------ PUTBLOCK: in:B/P/Q 900 CHAR=BC+164 ; 2 173 ブロック表示 PUTBLOCK_CORE: 910 マワレ 940 I=1 カラ 4 ; 4 177 表示コアルーチン 920 K=セル(RI+I) ; 2 179 930 セル(POS+K)=セル(CHAR) ; 3 182 940 トジル ; 1 183 950 カエレ ; 1 184 ;------------------------------------------------------------------------------ ERASEBLOCK: 960 CHAR=163 ; 2 186 ブロック消去 970 910(PUTBLOCK_CORE) ニイケ ; 2 188 ;------------------------------------------------------------------------------ ERASE_LINE: in:I 980 E=I ; 1 189 ERASE_LINE01: 990 マワレ 1010 R=1 カラ 10 ; 4 193 ライン消去 1000 セル(E+R)=セル(163) ; 3 196 1010 トジル ; 1 197 1020 カエレ ; 1 198 ;------------------------------------------------------------------------------ 9999 オワリ ; 1 199 ;------------------------------------------------------------------------------ ; ブロック回転表示テスト用プログラム ;------------------------------------------------------------------------------ 10 B=0 ; ブロックID(0〜6) 20 T=B ; 回転ID(0〜4) 30 カケ 99, B 40 カケ 119, T 50 220 ヲヨベ ; ブロック表示 60 トマレ 70 200 ヲヨベ ; ブロック消去 80 モシ T<>3 ナラバ 140 ニイケ 90 T=セル(T+475) 100 B=B+1 110 モシ B<7 ナラバ 30 ニイケ 120 B=0 130 30 ニイケ 140 T=セル(T+475) 150 30 ニイケ ;------------------------------------------------------------------------------ 200 C=163 ; C=表示キャラクタ(消去) 210 230ニイケ 220 C=B+164 ; C=表示キャラクタ(ブロック表示) 230 J=(B*32)+(T*4)+248 240 マワレ 270 I=1 カラ 4 250 K=セル(I+J) 260 セル(79+K)=セル(C) 270 トジル 280 カエレ