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

2018/02/12 15:12:02

MixJuice GET URL : kidspod.club/mj/462

15パズル

『15パズル』は、駒を移動させて目的の配置まで持っていくパズルゲームです。

【ルール】
縦 4 x 横 4 の 16 マスのスペースに、 1 ~ 15 の数字が書かれた 15 個の駒が配置されています。
1 マスの空白を利用して駒をスライドさせ、駒を移動することができます。
駒が下記の配置となればゲームクリアです。

  1 2 3 4
  5 6 7 8
  9 10 11 12
  13 14 15

【操作】
矢印 : 現在位置を移動させる(現在位置は "*" で示されています)
SPACE : 駒をスライドして移動させる

【更新履歴】
2018/02/12 初版公開
2018/02/15 駒の初期配置がゲームクリア不可能な配置にならないよう修正(Thanks to IchigoJam-FAN の皆様)
2018/02/28 初期化時にビデオ出力をオフにしないよう修正(Thanks to Kidspod運営チーム様)

【ソースコード解説】
《変数》
C : Character, 現在位置を示すキャラクタ
P : Position, 現在位置( 0 ~ 15 )
S : Space, 空白位置( 0 ~ 15 )
K : Key, キー入力値
R : Random, 一時変数(駒の配置を崩すために利用)
T : Temporary, 一時変数(駒の移動に利用)
U,V : 一時変数(駒を移動できるかどうかの判定に利用)
Z : 一時変数(ゲームクリアの判定に利用)
I,J,L : Iterator, ループ変数

《配列》
[0] ~ [15] : 駒の配置

《コード》
5 : タイトル
10 : 初期化
20 : 駒の枠の定義
30 : 空白の定義
40 : 駒の初期配置
50 ~ 70 : 駒の配置を崩す
80 : ゲーム開始時の初期設定
90 : キー入力受付
100 : SPACEキー押下時の処理
110 : 矢印キー押下時の処理
120 ~ 150 : 駒を移動できるかどうかの判定
160 : 駒の移動
170 ~ 180 : 駒の描画
190 : 現在位置の描画
200 : ゲームクリア判定

  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

SOURCE CODE

5 '15 Puzzle
10 CLS:CLV
20 POKE#700,#86,#83,#83,#84,31,28,28,28,28,#85,#80,#80,#85,31,28,28,28,28,#85,#80,#80,#85,31,28,28,28,28,#82,#83,#83,#80,0
30 FOR I=0 TO 3:POKE#730+I*9,#80,#80,#80,#80,31,28,28,28,28:NEXT:POKE#750,0
40 S=15:FOR I=0 TO 14:[I]=I+1:NEXT
50 FOR I=0 TO 150
60 R=RND(4):IF RND(2) P=S&3+R<<2 ELSE P=S&12+R
70 IF P=S GOTO60 ELSE GSB120:NEXT
80 P=0:C=#2A:GSB170
90 K=INKEY():IF K<28||K>32 GOTO90
100 IF K=32 GSB120:GSB170:GSB200:GOTO90
110 C=0:GSB190:P=P-(K=28)+(K=29)-(K=30)*4+(K=31)*4+(P&3=0&&K=28)*4-(P&3=3&&K=29)*4+(P<4&&K=30)*16-(P>11&&K=31)*16:C=#2A:GSB190:GOTO90
120 IF P=S RTN ELSE U=(P>S)*2-1:V=ABS(P-S)
130 IF (P>>2)=(S>>2) FOR J=1 TOV:P=S+U:GSB160:NEXT:P=S:RTN
140 IF (P&3)=(S&3) FOR J=1 TOV>>2:P=S+U<<2:GSB160:NEXT:P=S
150 RTN
160 T=S:S=P:P=T:[P]=[S]:[S]=0:RTN
170 FOR I=0 TO3:FOR J=0 TO3:L=[I*4+J]:LC J*4,I*4:?STR$(#700+#30*(L=0));:IF L LC J*4-(L>9)+2,I*4+1:?L;
180 NEXT:NEXT
190 LC(P&3)*4+2,(P>>2)*4+2:?CHR$(C);:RTN
200 Z=0:FOR I=0 TO15:Z=Z+([I]=I+1):NEXT:IF Z=15 LC 5,18:?"CLEAR!":END ELSE RTN

COMMENT

Kidspod運営チーム
Kidspod運営チーム2018/02/23 17:57:18

最初のパズル生成のところで画面がしばらく映らなくなるのが注意点でしょうか(私はうっかり、IchigoJamを再起動してしまいました)。クリア不可能にならないようにするという工夫も見事です! これは延々と時間を取られてしまいそうですね。