SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

3D迷路-CK

先日発売された「IchigoCake BASIC」
hello002.stores.jp
を使って、3D迷路ゲームを作ってみました。
以前作った3D迷路の移植・拡張です。
2画面で遊ぶと、NINTENDO 3dsで遊んでいる気分になります(^_^)

f:id:shiro0922:20190415234225j:plain

遊び方

  • プログラム実行後に数秒待つと、Cake画面に迷路の3Dビュー、Jam画面に迷路のマップが表示されます。マップの左上からスタートして、右下のゴール「G」を目指してください。

f:id:shiro0922:20190416000509p:plain

  • 移動操作は、カーソルキー↑=前進、←=左を向く、→=右を向く、↓=後ろを向く、です。
  • マップは、自分が一度歩いた場所しか表示されません。まずは歩き回って迷路を探索しましょう。

f:id:shiro0922:20190416000446p:plain

  • ゴールした後は、何かキーを押すとリプレイします。やめる時はESCキーでプログラムを止めてください。

f:id:shiro0922:20190416000528p:plain

プログラム

コード容量が4Kバイトに増えたお陰でプログラムが1スロットに収まり、配列変数の個数が増えたので迷路エリアが1.5倍になりました。
※4/17修正:「UART 0」を指定して、PCコマンドのエラーを解決

1 '*3D-Maze CK
2 CLV:UART 0:VIDEO 0
3 [0]=9:FOR X=1 TO 13:[X]=1:NEXT:[14]=3
4 FOR Y=1 TO 9:[Y*15]=8:[Y*15+14]=2:NEXT
5 [150]=12:FOR X=1 TO 13:[150+X]=4:NEXT:[164]=6
6 [200]=226:[201]=225:[202]=227:[203]=224
7 SRND ANA()+TICK()
8 FOR Y=0 TO 9
9 PC.SOUND1 0,4,Y
10 FOR X=0 TO 13
11 @DIR
12 D=RND(4):IF D=0 && Y>0 GOTO @DIR
13 Z=X+Y*15
14 IF D=0 GSB @UP
15 IF D=1 GSB @RIGHT:IF D=-1 GOTO @DIR
16 IF D=2 GSB @DOWN:IF D=-1 GOTO @DIR
17 IF D=3 GSB @LEFT:IF D=-1 GOTO @DIR
18 NEXT:NEXT
19 PC.SOUND1 0,4,#FF
20 P=0:Q=0:D=1:[0]=[0]|16
21 VIDEO 1:GSB @3DV:GSB @MAP:GSB @PLAYER:CLT
22 @GLOOP
23 LC 25,23:?TICK()/60;
24 K=INKEY()
25 IF K<28 || K>31 GOTO @GLOOP
26 IF K=28 GSB @PLEFT
27 IF K=29 GSB @PRIGHT
28 IF K=30 GSB @PUP
29 IF K=31 GSB @PDOWN
30 GSB @3DV
31 GSB @PLAYER
32 WAIT 20:CLK
33 IF P<>14 || Q<>10 GOTO @GLOOP
34 LC 9,11:?"*** GOAL ***"
35 PC.SOUND 4,0,4,2,4,4,4,#FF:WAIT 30
36 PC.SOUND 4,6,4,1,4,4,4,#FF:WAIT 30
37 PC.SOUND 4,0,4,2,4,4,4,#FF:WAIT 30
38 PC.SOUND 4,#FF,4,#FF,4,#FF,4,#FF
39 CLK
40 IF !INKEY() CONT
41 RUN
42 @UP
43 [Z]=[Z]+2:[Z+1]=[Z+1]+8:RTN
44 @RIGHT
45 [Z+1]=[Z+1]+4:[Z+16]=[Z+16]+1:RTN
46 @DOWN
47 [Z+15]=[Z+15]+2:[Z+16]=[Z+16]+8:RTN
48 @LEFT
49 IF [Z]&4>0 D=-1:RTN
50 [Z]=[Z]+4:[Z+15]=[Z+15]+1:RTN
51 @PUP
52 H=P+Q*15:S=([H]>>D)%2:IF S RTN
53 LC P*2+1,Q*2+1:?CHR$(0)
54 P=P-(D=3)+(D=1):Q=Q-(D=0)+(D=2)
55 H=P+Q*15:[H]=[H]|16
56 U=P*2+1:V=Q*2+1
57 LC U,V:?CHR$(0)
58 N=[H]
59 IF N&1=0 LC U,V-1:?CHR$(0)
60 IF N&2=0 LC U+1,V:?CHR$(0)
61 IF N&4=0 LC U,V+1:?CHR$(0)
62 IF N&8=0 LC U-1,V:?CHR$(0)
63 RTN
64 @PLEFT
65 D=D-1:IF D<0 D=3
66 RTN
67 @PRIGHT
68 D=D+1:IF D>3 D=0
69 RTN
70 @PDOWN
71 D=D+2:IF D>3 D=D-4
72 RTN
73 @3DV
74 PC.CLEAR 11
75 PC.SOUND1 0,4,0
76 U=P:V=Q:E=21:F=15
77 GSB @CHECK:IF S GOTO @VEND
78 E=14:F=9:GSB @LWALL:GSB @RWALL
79 U=U-(D=3)+(D=1):V=V-(D=0)+(D=2):E=8:F=4
80 GSB @CHECK:IF S GOTO @VEND
81 PC.LINE 38,18,46,26,1
82 PC.LINE 46,18,38,26,1
83 @VEND
84 PC.SOUND1 0,4,#FF
85 RTN
86 @CHECK
87 N=[U+V*15]:S=(N>>D)%2
88 L=D-1:IF L<0 L=L+4
89 IF (N>>L)%2 THEN GSB @LWALL ELSE GSB @LROAD
90 R=D+1:IF R>3 R=R-4
91 IF (N>>R)%2 THEN GSB @RWALL ELSE GSB @RROAD
92 IF S GSB @WALL
93 RTN
94 @LWALL
95 IF S PC.LINE 42-F,22-F,42-F,22+F,1
96 PC.LINE 42-E,22-E,42-F,22-F,1
97 PC.LINE 42-E,22+E,42-F,22+F,1
98 RTN
99 @RWALL
100 IF S PC.LINE 42+F,22-F,42+F,22+F,1
101 PC.LINE 42+F,22-F,42+E,22-E,1
102 PC.LINE 42+F,22+F,42+E,22+E,1
103 RTN
104 @LROAD
105 IF !S PC.LINE 42-F,22-F,42-F,22+F,1
106 PC.LINE 42-E,22-F,42-F,22-F,1
107 PC.LINE 42-E,22+F,42-F,22+F,1
108 IF P=U && Q=V RTN
109 PC.LINE 42-E,22-E,42-E,22+E,1
110 RTN
111 @RROAD
112 IF !S PC.LINE 42+F,22-F,42+F,22+F,1
113 PC.LINE 42+F,22-F,42+E,22-F,1
114 PC.LINE 42+F,22+F,42+E,22+F,1
115 IF P=U && Q=V RTN
116 PC.LINE 42+E,22-E,42+E,22+E,1
117 RTN
118 @WALL
119 PC.LINE 42-F,22-F,42+F,22-F,1
120 PC.LINE 42-F,22+F,42+F,22+F,1
121 RTN
122 @MAP
123 CLS
124 FOR Y=0 TO 22
125 FOR X=0 TO 30:?CHR$(1);:NEXT:?
126 NEXT
127 FOR Y=0 TO 10:FOR X=0 TO 14
128 N=[X+Y*15]:W=(N>>4)%2
129 IF !W GOTO @NOWALK
130 U=X*2+1:V=Y*2+1
131 LC U,V:?CHR$(0)
132 IF N&2=0 LC U+1,V:?CHR$(0)
133 IF N&4=0 LC U,V+1:?CHR$(0)
134 @NOWALK
135 NEXT:NEXT
136 LC 29,21:?"G"
137 LC 20,23:?"TIME=";
138 RTN
139 @PLAYER
140 LC P*2+1,Q*2+1:?CHR$([200+D])
141 LC 0,23:?"X,Y=";P;",";Q;" ";
142 RTN