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

2018/04/18 17:14:47

MixJuice GET URL : kidspod.club/mj/479

マインスイーパ

マインスイーパです

■ルール・画面説明
・初めに爆弾の個数を入力する、昔Windowsに搭載されていたマインスイーパの中級と同じ広さ(16x16)で40が標準
・数字は、そのマスの周りに何個の爆弾(Cマーク)があるかの数
・爆弾を開くとゲームオーバー
・ゲームオーバーになると、爆弾位置の表示&開いた爆弾位置(X)が表示される
・爆弾以外を全部開くとクリア
・クリアするとクリアまでにかかった時間が秒単位で表示される
・ここは爆弾だ!と思ったところに目印(+)を付けれる
・目印は取り消しできる
・目印を付けたところは開けない、開く場合は目印取り消ししてから開く
・画面右に残り爆弾予想数が表示される

■操作説明
矢印キー:カーソル移動
スペース:開く
その他:目印&目印取り消し

■注意事項
0の場所を開いたときに自動的に周りが開きますが、これは再帰ルーチンを使っています
ichigojamBASICは再帰出来ないので仮想的に再帰を実現しています
しかし、このプログラムの仕様上85回までしか深い階層に再帰できません
爆弾の数を少なくすると再帰の回数が増えるため正常に動作しなくなります
85回以上再帰した時にエラーがでるように作れませんでした(容量が足りなかった)ごめんなさい
異常動作をした場合は、RUNしなおせば直ります

■以下、プログラム説明と作成中に使った資料
・プログラム説明
1 初期設定、面作成
2~4 面作成、初期画面表示
5 カーソル移動、爆弾チェック処理(爆弾なら15へ)、空白判定(空白なら再帰ルーチンへ)
6 目印処理
7 クリア処理
8 目印残数表示、5へ戻る
9~13 再帰ルーチン
14 T,Uの座標にある数値をメモリから取り出してEに代入
15~16 ミスしたときの爆弾表示処理

・捜査方向パラメータ
dx dy
0 1  配列86,87
1 1  配列88,89
1 -1  配列90,91
0 -1  配列92,23
-1 1  配列94,95
-1 0  配列96,97
-1 -1  配列98,99
1 0  配列100,101

配列変数に再帰に必要な値を持たせる
X座標 0~15 4bit
Y座標 0~15 4bit
現在捜査方向 0~7 3bit

盤のデータはPCGエリアに持たせる
0~8 周囲の爆弾の数
15 爆弾
一カ所1byte 16x16で256カ所 256byte

A 面作成中だけのPUBLIC(爆弾位置作成)
B 爆弾個数
C #700固定
D めくる数(256-B)
E 14行の戻り値
F 爆弾をチェックした個数
G 15固定
H 16固定
I FORループ
J 面作成中だけのPUBLIC FORループ
K INKEY
L 再帰ロジックで使用(X)
M 再帰ロジックで使用(Y)
N 19固定
O
P 再帰ロジックで使用(方向)
Q SCR(X,Y)
R
S
T 14行の引数 X
U 14行の引数 Y
V
W
X カーソル位置X
Y カーソル位置Y
Z 再帰ロジックで使用(再帰回数)

  • 1
  • 1

SOURCE CODE

1 CLV:C=#700:Q=2:G=15:H=16:LET[87],1,1,1,1,-1,0,-1,-1,1,-1,0,-1,-1,1:N=19:INPUTB:D=256-B:FORI=CTO#7FF:POKEI,0:NEXT:FORI=1TOB
2 A=RND(256):IFPEEK(C+A)CONT
3 CLS:?I:POKEC+A,G:FORJ=0TO7:T=A%H+[86+J*2]:U=A/H+[87+J*2]:GSB14:IFT>=0&&T<H&&U>=0&&U<HIFE<>GPOKEC+T+U*H,PEEK(C+T+U*H)+1
4 NEXT:NEXT:FORI=0TO323:LCI%18,I/18:?CHR$(2-(I%18=0||I%18=17||I<18||I>305));:NEXT:CLT
5 LCX+1,Y+1:?CHR$(Q):K=INKEY():X=(X-(K=28)+(K=29))&G:Y=(Y-(K=30)+(K=31))&G:LCX+1,Y+1:Q=SCR():?CHR$(165,28);:IFK=32&&Q=2D=D-1:T=X:U=Y:GSB14:IF!EL=X:M=Y:GSB9:Q=32ELSEIFE<9Q=48+EELSEGOTO15
6 IFK>32IFQ=2||Q=147Q=2+(Q=2)*145:?CHR$(Q):F=F-(Q=2)+(Q=147)
7 IF!DLC0,N:?TICK()/60:END
8 LCN,1:?CHR$(22,58);B-F;" ":GOTO5
9 [Z]=L<<7+M<<3
10 P=[Z]&7:T=[Z]>>7+[86+P*2]:U=[Z]>>3&G+[87+P*2]:IFSCR(T+1,U+1)<>2GOTO12
11 LCT+1,U+1:D=D-1:GSB14:IFE?CHR$(48+E)ELSE?" ":Z=Z+1:L=T:M=U:GOTO9
12 IF[Z]&7=7IF!ZRTNELSEZ=Z-1:IF[Z]&7=7CONT
13 [Z]=[Z]+1:GOTO10
14 E=PEEK(C+T+U*H):RTN
15 FORI=0TO255:T=I%H:U=I/H:GSB14:LCT+1,U+1:IFE=GIFI=X+Y*H?"X"ELSE?CHR$(22)
16 NEXT:LC0,N:?"ミス"

COMMENT

Kidspod運営チーム
Kidspod運営チーム2018/04/20 11:31:05

こちらも見事なマインスイーパですね。プレイヤーが爆弾の数を決められるというところも素敵です。しかもタイムアタック付き! 遊びすぎに注意しなくては。