• タイトル
    おそ杉さんゲーム (電子工作マガジン2016年SPRING号掲載)

  • 開発環境
    IchigoJamBASIC1.0.1
    IchigoJamBASIC1.1.1
    IchigoJamBASIC1.2.1

  • 内容
    「おそ杉さん」は6つ子の兄弟。
    そろいも揃って全員ニート。
    今日も仕事をサボって街に逃げ出してしまいました。
    あなたは人ごみの中から、おそ杉さん兄弟にバレないよう目撃証言を得て、おそ杉さん兄弟(6人)を特定しなくてはなりません。
    (Windowsゲームのマインスイーパーと同じルールです)

  • 遊び方
    タテ軸(0~7)とヨコ軸(0~7)を入力し、おそ杉さん兄弟以外の人(目撃者)を指名します。
    おそ杉さん兄弟が隣接する8マスにいる場合は、目撃者はその人数表示になります。
    おそ杉さん兄弟が隣接していない場合は、目撃者は空白表示になり、さらに隣接するマスについて目撃証言を繰り返して得られます。
    おそ杉さん兄弟を除く全ての目撃者を空白にしたらあなたの勝ちです。
    間違っておそ杉さん兄弟を指名してしまうと、あなたの負けです。

  • プログラムのしくみ
    隣接マスの判定に再帰処理をしています。
    IchigoJamBASICにはローカル変数が無いため、配列変数をスタック、変数Sをスタックポインタとして使用しています。
各行の処理
1行
2行
3~4行
5行
6行
7行
8行
9行
10行
11行
12行
13行
14~21行
22行
コメント(ファイル名)
初期画面表示
おそ杉さんを配置
Y座標、X座標入力:座標値がおそ杉さんか判定
スタックポインタを加算し、スタックに判定するV-RAMアドレスを積んで再起処理を呼び出し
クリア判定
おそ杉さん表示
プログラム終了
隣接マスのおそ杉さんの数を数える
隣接マスにおそ杉さんがいたら、マスにその数を表示して再起処理から戻る
隣接マスにおそ杉さんがいないので、マスを空白にする
途中終了の再起処理の続けるため、再度、再起処理を呼び出す
指定したマスに隣接する8マスを調べ、人型のキャラクタならば、そのアドレスを基点として再起処理を呼び出す
上下左右を調べ終えたのでスタックポインタを減算して再起処理から戻る

変数表
I,J
S
[1]~
C
A
X
Y
Z
ループ用
スタックポインタ
スタックとして使用
隣接マスにいるおそ杉さんの数
調べるマスのV-RAMアドレス
x座標
y座標
再起処理を再開するアドレス

  • プログラムの制約による不具合
    IchigoJamBASICは、GOSUB文のネスティング(GOSUBからRETURNで戻る前にGOSUBを呼ぶこと)が10回までとなっています。(v1.2以後は30回まで)
    ところが、おそ杉さんの配置によっては、それ以上のネスティングになってしまうことがあります。
    回避策として13行にある処理をしています。
    GOSUB文の10回目のネスティングが発生した(=スタックに9つ(v1.2以後は29)以上のアドレスが積まれた)時点で、そのアドレスを変数Zに保存し、再起処理を終了させます。
    その後、6行の後半にあるIF文でGOSUB文の10回目(v1.2以後は30回目)のネスティング(=変数Zが0か否か)をチェックし、変数Zが0以外ならば、そのアドレスを基点として再起処理を再開します。
    しかし、メモリの制約上、ネスティングのチェックは1度しかできなかったため、まれにチェック残りが発生します。
    これは既知のバグです。

    また、クリアの判定は入力ごとに画面の2行目~10行目のV-RAMをチェックしています。
    メモリ不足により無関係のアドレスもチェックするような無駄な処理になっています。
    よって、クリアに近づくと、座標入力後に少し待たされるようになってしまいます。
    上の行からチェックしているので、待たされるのが嫌な場合は、下の方から解いていった方がチェック時間が短いです。

  • プログラムの改造
    3行目のFOR~NEXT文の変数Iが、おそ杉さんの数です。
    これを増減させると、おそ杉さんの発生数が増減します。

    おそ杉さんと目撃者の区別は、同じキャラクタでキャラクタコードが異なるキャラクタを使用しています。(おそ杉=7、目撃者=#F9)
    (v1.2以後ではキャラクタジェネレータを使用し、#F8を#F9と同じキャラクタにしています)

    テーマが「おそ杉さん」のため人型のキャラクタを使用していますが、マインスイーパー風にするには、
    3行、5行、8行、10行のPOKEやPEEKの「5」を「1」に、
    14行~21行のPEEKの「#F9」を「#8F」に、
    8行のPOKEの「6」を「#E9」などに変更します。(~v1.1まで)
    ただし、キャラクタ間に隙間が無いので見づらくなってしまいます。

おそ杉さんゲーム(Ichigojam v1.0,v1.1)
1 'OSOSUGI
2 CLS:CLV:LC2,0:?"01234567":?:FORI=0TO7:?I;"大大大大大大大大":NEXT
3 FORI=1TO6:A=#942+RND(8)*32+RND(8):IFPEEK(A)=7I=I-1ELSEPOKEA,5
4 NEXT
5 LC0,12:?CHR$(12):INPUT"タテ(0~7)",Y:Y=Y%8:INPUT"ヨコ(0~7)",X:X=X%8:A=#942+Y*32+X:IFPEEK(A)=5?"ゲームオーバー":GOTO8
6 S=S+1:[S]=A:GOSUB10:IFZ>0THENS=S+1:[S]=Z:GOSUB10
7 Z=0:FORI=#942TO#A29:IFPEEK(I)=#F9I=#B00:NEXT:GOTO5ELSENEXT:?"アナタ ノ カチ!"
8 FORI=#942TO#A29:IFPEEK(I)=5POKEI,6
9 NEXT:END
10 A=[S]:C=(PEEK(A-33)=5)+(PEEK(A-32)=5)+(PEEK(A-31)=5)+(PEEK(A-1)=5)+(PEEK(A+1)=5)+(PEEK(A+31)=5)+(PEEK(A+32)=5)+(PEEK(A+33)=5)
11 IFC>0[S]=0:S=S-1:POKEA,C+48:A=[S]:RETURN
12 POKE A,0
13 IFS>9Z=[S]:[S]=0:S=S-1:A=[S]:RETURN
14 IFPEEK(A-33)=#F9S=S+1:[S]=A-33:GOSUB10
15 IFPEEK(A-32)=#F9S=S+1:[S]=A-32:GOSUB10
16 IFPEEK(A-31)=#F9S=S+1:[S]=A-31:GOSUB10
17 IFPEEK(A-1)=#F9S=S+1:[S]=A-1:GOSUB10
18 IFPEEK(A+1)=#F9S=S+1:[S]=A+1:GOSUB10
19 IFPEEK(A+31)=#F9S=S+1:[S]=A+31:GOSUB10
20 IFPEEK(A+32)=#F9S=S+1:[S]=A+32:GOSUB10
21 IFPEEK(A+33)=#F9S=S+1:[S]=A+33:GOSUB10
22 [S]=0:S=S-1:A=[S]:RETURN
注)2行の"大大大大大大大大"は、キャラクコード「#F9」の人型キャラクタx8個です。
(「左Alt+P」キーで入力できます)


おそ杉さんゲーム(Ichigojam v1.2)
1 'OSOSUGI v1.2
2 CLS:CLV:CLP:V=#942:W=#F9:U=#F8:LC2,0:?"01234567":?:FORI=0TO7:?I;" 大大大大大大大大":POKE#7C0+I,PEEK(#7C8+I):NEXT
3 FORI=1TO6:A=V+RND(8)*32+RND(8):IFPEEK(A)=7I=I-1ELSEPOKEA,U
4 NEXT
5 LC0,12:?CHR$(12):INPUT"タテ(0~7)",Y:Y=Y%8:INPUT"ヨコ(0~7)",X:X=X%8:A=V+Y*32+X:IFPEEK(A)=U?"ゲームオーバー":GOTO8
6 S=S+1:[S]=A:GSB10:IFZ>0THENS=S+1:[S]=Z:GSB10
7 Z=0:FORI=VTO#A29:IFPEEK(I)=WI=#B00:NEXT:GOTO5ELSENEXT:?"アナタ ノ カチ!"
8 FORI=VTO#A29:IFU=PEEK(I)POKEI,#FA
9 NEXT:END
10 A=[S]:C=(PEEK(A-33)=U)+(PEEK(A-32)=U)+(PEEK(A-31)=U)+(PEEK(A-1)=U)+(PEEK(A+1)=U)+(PEEK(A+31)=U)+(PEEK(A+32)=U)+(PEEK(A+33)=U)
11 IFC>0[S]=0:S=S-1:POKEA,C+48:A=[S]:RTN
12 POKE A,0
13 IFS>29Z=[S]:[S]=0:S=S-1:A=[S]:RTN
14 IFPEEK(A-33)=WS=S+1:[S]=A-33:GSB10
15 IFPEEK(A-32)=WS=S+1:[S]=A-32:GSB10
16 IFPEEK(A-31)=WS=S+1:[S]=A-31:GSB10
17 IFPEEK(A-1)=WS=S+1:[S]=A-1:GSB10
18 IFPEEK(A+1)=WS=S+1:[S]=A+1:GSB10
19 IFPEEK(A+31)=WS=S+1:[S]=A+31:GSB10
20 IFPEEK(A+32)=WS=S+1:[S]=A+32:GSB10
21 IFPEEK(A+33)=WS=S+1:[S]=A+33:GSB10
22 [S]=0:S=S-1:A=[S]:RTN
注)2行の"大大大大大大大大"は、キャラクコード「#F9」の人型キャラクタx8個です。
(「左Alt+P」キーで入力できます)


MixJuiceでのダウンロードURLは下記になります。

おそ杉さんゲーム(Ichigojam v1.0,v1.1) http://tagiyasoft.blog.jp/ososugi1.bin
おそ杉さんゲーム(Ichigojam v1.2) http://tagiyasoft.blog.jp/ososugi2.bin

以下のように入力してD/Lしてください。
NEW
? MJ GET tagiyasoft.blog.jp/ososugi1.bin


ブラウザでD/LしてIchigoJamに転送する場合は、通信ソフトでバイナリ送信をしてください。
(例:TeraTermの場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)