『ハノイの塔』は、棒に刺さっている円盤を別の棒に移し替えるパズルゲームです。
【ルール】
三本の棒があり、左の棒に円盤が大きさの順に刺さっています。
これらの左の棒の全ての円盤を、右の棒へ移し替えて下さい。
円盤は 1 枚ずつ移動させることができ、
小さな円盤の上に大きな円盤を移動させることはできません。
【操作】
1 : 左の棒を選択
2 : 中央の棒を選択
3 : 右の棒を選択
【更新履歴】
2018/02/18 初版公開
2018/02/28 コード最適化
【ソースコード解説】
《変数》
C : Character, 選択状態を示すキャラクタ
K : Key, キー入力値
S : Select, 円盤の移動元の選択状態(-1:選択していない, 0:左, 1:中央, 2:右)
T : Target, 円盤の移動先の選択状態(0:左, 1:中央, 2:右)
U : 円盤の移動元の一番上にある円盤の位置( 0 ~ 11 )
V : 円盤の移動先の一番上にある円盤の位置( 0 ~ 11 )
W : Write, 描画する円盤の位置( 0 ~ 11 )
Z : 一時変数(円盤の描画に利用)
I,J : Iterator, ループ変数
《配列》
[0] ~ [3] : 左の棒の円盤
[4] ~ [7] : 中央の棒の円盤
[8] ~ [11] : 右の棒の円盤
《コード》
5 : タイトル
10 : 初期化
20 ~ 40 : 棒の描画
50 : 円盤の初期化
60 : 選択状態の初期化
70 : キー入力受付
80 : 移動元が選択された際の処理
90 : 移動先が選択された際の処理
100 ~ 110 : U の算出
120 ~ 130 : V の算出
140 : 円盤を移動できるかどうかの判定
150 ~ 160 : 円盤の移動
170 : ゲームクリア判定
180 : 選択状態の消去
190 : 無効な選択状態を示す「x」の描画
200 : 選択状態の描画
210 : 円盤の描画または消去
5 'Tower of Hanoi 10 CLS:CLV:CLP 20 FOR I=0 TO 30:LC I,17:?CHR$(1);:NEXT 30 FOR I=0 TO 2:FOR J=1 TO 5:LC 5+10*I,17-J:?CHR$(1);:NEXT:NEXT 40 FOR I=0 TO 2:LC 5+10*I,19:?I+1;:NEXT 50 FOR W=0 TO 3:[W]=4-W:GSB 210:NEXT 60 CLK:S=-1 70 K=INKEY():IF K<#31||K>#33 GOTO 70 80 IF S=-1 S=K-#31:C=#E2:GSB 200:IF [S<<2] GOTO 70 ELSE GOTO 190 90 T=K-#31:IF S=T GOTO 180 ELSE C=#E3:GSB 200 100 U=S<<2|3 110 IF ![U]&&U&3>0 U=U-1:GOTO 110 120 V=T<<2|3 130 IF ![V]&&V&3>0 V=V-1:GOTO 130 140 IF [U]>[V]&&[V]!=0 GOTO 190 150 IF [V] V=V+1 160 [V]=[U]:[U]=0:W=U:GSB 210:W=V:GSB 210 170 IF [11]=1 LC 13,21:?"CLEAR!":END 180 C=0:FOR K=#31 TO #33:GSB 200:NEXT:GOTO 60 190 WAIT 15:LC 5+(K-#31)*10,10:?"x";:WAIT 45:?CHR$(28,0);:GOTO 180 200 LC 5+(K-#31)*10,9:?CHR$(C);:RTN 210 Z=[W]:FOR I=0 TO Z+(Z=0)*4:FOR J=0 TO 1:LC 5+W>>2*10+(J*2-1)*I,16-(W&3):?CHR$((Z!=0)*2+(Z=0)&(I=0));:NEXT:NEXT:RTN