つづき
LET clr$=REPEAT$("0",M*N)
PRINT "履歴" DO CALL PrintOut(M,N,ptn$) !盤面の表示 IF ptn$=clr$ THEN !ゲームクリアなら PRINT "完成!" STOP END IF MOUSE POLL x,y,left,right IF left=1 THEN !左クリックなら LET id=(INT(y)-1)*N+INT(x) !連番での位置 PRINT id !履歴 CALL action(ptn$, sw$(id)) !スイッチ操作 WAIT DELAY 0.3 !間隔をとる END IF LOOP UNTIL right=1 !右クリックなら
PRINT "盤面:";ptn$ !現在の盤面の表示
PRINT "解答 ※順番は関係なし"
LET t0=TIME
!攻略法 !・上段の行から順に消して行く ! 次の行の消し方は、上の行に依存している。 ! 5×5の場合、上段の行の消し方、2^5=32通りを確認すればよい。
FOR p=2^N-1 TO 0 STEP -1 !1行目のスイッチの組合せ LET c$=ptn$ LET bit$=right$(REPEAT$("0",N)&BSTR$(p,2),N) !2進法表記で生成する FOR i=1 TO N IF bit$(i:i)="1" THEN CALL action(c$, sw$(i)) !その操作 NEXT i LET op$=bit$ !記録 ※1:押下 FOR i=2 TO M !2行から最下行まで LET t=(i-2)*N !1つ上の行をクリアする LET op$=op$&c$(t+1:t+N) !記録 FOR j=1 TO N IF c$(t+j:t+j)="1" THEN CALL action(c$, sw$(t+j+N)) !その操作 NEXT j NEXT i IF c$=clr$ THEN !順にクリアして、偶然にもクリアしたら FOR i=1 TO M*N !解答の表示 IF op$(i:i)="1" THEN PRINT i; NEXT i PRINT END IF NEXT p
PRINT "計算時間=";TIME-t0
END
EXTERNAL SUB action(p$, sw$) !スイッチ操作 FOR i=1 TO LEN(p$) !ビット単位の排他的論理和 LET p$(i:i)=STR$(MOD(VAL(p$(i:i))+VAL(sw$(i:i)),2)) NEXT i END SUB
|