プログラムリスト
1 PRINT " ↑← Mr.T →↓",A;:$="*****[ ♦↑→↓←↑→↓"
2 FOR B=4 TO 15:A$(B)=MID(B,1):I(B)=0:GOTO 14
3 $=MID(1,B-1)+MID(B+U)
4 PRINT CSR 0;MID(6,10);:FOR B=6 TO 13:IF M$(S)=MID(B,EXP SGN T) THEN 3
5 NEXT B:Q=LEN($)-15:U=1:FOR B=5 TO Q+4
6 IF MID(B,1)=MID(B+U,1);D=D+1:U=U+1:GOTO 6
7 IF U>1;PRINT CSR B-6;MID(1,U);CSR 8;D;:V=V+10↑D:GOTO 3
8 NEXT B:W=W+EXP D:IF W≦1;X=X+1:PRINT CSR 0;X;V;:W=π↑π/SQR X:GOTO 4
9 S=INT Y:Y=RAN#*4:T=Z:Z=INT (RAN#*4:F$=M$(Y)+I$(Y*SGN Z+Z)
10 FOR B=-1 TO 7-Q:FOR C=X TO 4:IF KEY="4";IF X<5;S=S+3-4*SGN S
11 IF KEY="6";IF X<5;S=(S+1)*SGN (3-S
12 R$=M$(S)+I$(S*SGN T+T):PRINT CSR 7-B;R$;F$(EXP SGN B);
13 IF KEY≠"Q";W=W-1:NEXT C
14 NEXT B:D=0:$=MID(1,Q+5)+R$+" ":IF Q<9 THEN 4
15 FOR B=9 TO 0 STEP -.2:PRINT CSR B;E$;:NEXT B:IF A≦V;A=V:PRINT "Hi!";
16 PRINT V:GOTO 1
14 行目のスペースは 10 個です.
PB-100 の初期出荷バージョンの一部で正しく動作しないケースがあります.その際はPB-100初期出荷バージョンの異常動作についてを参照してリストを変更してください.
8行目に掲載ミスがあったのを修正しました.(2017年4月23日)
PRINT CSR 0;X;K;
↓
PRINT CSR 0;X;V;
技術情報
変数表
変数 | 大域変数 | ブロック消滅とスコア表示(3~8行) | NEXT ブロックの設定とブロック落下(9~14行) |
---|---|---|---|
A | ✓ | ハイスコア | |
B | FOR~NEXT、消えるブロックの位置 | FOR~NEXT | |
C | FOR~NEXT | ||
D | ランク(連鎖で消したブロックの数) | キー入力判定 | |
E$ | ✓ | "*" | |
F$ | NEXT ブロック | ||
G$ | ✓ | "[" | |
H$ | ✓ | " " (スペース) | |
I$~P$ | ✓ | ブロックキャラクタ | |
Q | ✓ | 積もったブロックの高さ | |
R$ | 落下中のブロック | ||
S,T | ✓ | ブロック左、右 | |
U | 消えるブロックの数 | ||
V | ✓ | スコア | |
W | ✓ | レベルアップのカウンター | |
X | ✓ | レベル(落下速度) | |
Y,Z | ✓ | NEXT ブロック左、右 | |
$ | ✓ | "*****" + 積もったブロック + スペース10個 |
行番号マップ
行 | 処理 |
---|---|
1 | タイトル表示他 |
2 | 変数の初期化、ブロックキャラ設定 |
3 | ブロック抜き出し |
4~5 | 画面表示、特殊ブロック用 |
5~8 | ブロック消滅 |
8 | レベルアップ |
9 | ブロックのセット |
10~14 | ブロック落下の表示、キー入力他 |
14 | ゲームオーバー判定他 |
15~16 | エンディング、スコア表示他 |
サブルーチンは 1~9 行に
ゲームの流れはブロックの落下→ブロックの消滅となりますが、プログラムでは前半(3~7行)にブロックの消滅処理、後半(9~14)にブロックの落下処理を置いています.
これは GOTO
と THEN
を多用する消滅処理を行番号の小さい(1桁の)ところに置くためです. こうしてなるべく GOTO
の跳び先に2桁の行番号がこないようにしました.
PB-100 では GOTO
、GOSUB
の後にくる行番号はその字数分だけステップを使うので、こうすることで数ステップ稼いでいます.
EXP SGN
で1ステップを稼ぐ
IF M$(S)=MID(B,EXP SGN T) THEN 3
EXP 0 = 1
EXP 1 = 2.718281828
4行目と12行目に使われている EXP SGN
は、ここでは 1+SGN
を1ステップ圧縮したものといえます.
MID
関数のパラメータや配列変数の指定、CSR
など小数部があっても無視して実行してくれる命令に有効な場合があります.
MID
の罠
開発当初には、MID
関数の扱いに苦労したのを憶えています.
$ には積もったブロックが入っていて、ブロックの消滅処理は MID
関数から $ 内部を参照したり操作します.この際にエラーが頻発しました.
原因は(はっきり憶えていないので推測ですが)、$ が空文字列になっていたり、MID
のパラメータが0だったりオーバーしたためでした.
『パニッカーST』を解析して空読み(といえばいいのでしょうか?)が必要なことが分かり、解決しました.
幻の『ぽあぽあ 544ステップ版』
8 o 8 ° o o 8 o ° °
以上は同時進行で制作していた『ぽあぽあ 544ステップ版』に生かされました.
制作の骨子は、オリジナルでは積もったブロックを配列変数(O$(1)~O$(12))に格納し処理していたのを $ のみで行うようにするというものでした.
現在544ステップ版は再現性95%、544ステップに収まりかなり余裕もあります.
ただゲームシステムに根本的な欠陥があるように思えるので発表は見合わせております. というのも僕は一度、ゲーム開始から o° が連続して何もできないままゲームオーバーになってしまったことがあるのです. ブロックがポコポコと消える辺りなどかなり快感なので、残念です.
解消するいいアイデアがあるという方、いいからさっさと発表しろという方、一報下されば発表したいと思います. 2023年4月14日にようやく公開しました.