!1色ライツアウト(Lights Out)を解く(PLAYモードを含む)
!プログラムを実行すると、プレイモードになる。 !左クリックで、マスを反転する。 !右クリックで、現在の盤面からの解答を表示して、プログラムが終了する。
!●技術メモ !3×3の場合、各マスの位置を左上からの連番で表すと ! 123 ! 456 ! 789 !となる。 ! !スイッチ1の箇所すなわち位置(1,1)をクリックすると ! 12- ! 4-- ! --- !の位置が変化する。 !これを、作用sw$(1)="110100000"と表すことにする。 !排他的論理和(XOR)に対応させるために、変化するビットを1とする。
LET M=5 !行 ※盤の大きさ LET N=5 !列
DATA 1,1,1,1,1 !初期の盤面 ※1:点灯、0:消灯 DATA 1,1,1,1,1 DATA 1,1,1,1,1 DATA 1,1,1,1,1 DATA 1,1,1,1,1 !------------------------------ ここまでがデータ
SET WINDOW 1,N+1,M+1,1 !表示領域 SET TEXT JUSTIFY "center","half" !配置基準
SUB PrintOut(M,N,ptn$) !盤面を表示する SET DRAW mode hidden !ちらつき防止開始 FOR id=1 TO M*N LET x=MOD((id-1),N)+1 !マスの座標 LET y=INT((id-1)/N)+1 SELECT CASE ptn$(id:id) CASE "0" SET AREA COLOR 2 CASE "1" SET AREA COLOR 6 CASE ELSE END SELECT PLOT AREA: x,y; x+1,y; x+1,y+1; x,y+1 !矩形 PLOT TEXT ,AT x+0.5,y+0.5: STR$(id) !スイッチ番号 NEXT id DRAW grid !格子 SET DRAW mode explicit !ちらつき防止終了 END SUB
LET ptn$="" !盤面
FOR i=1 TO M*N !盤面を設定する READ t LET ptn$=ptn$&STR$(t) NEXT i !!!PRINT ptn$
DIM sw$(M*N) !スイッチ
DIM f$(M) FOR i=1 TO M !位置(i,j)を押すことで変化するマスを求める FOR j=1 TO N FOR k=1 TO M LET f$(k)=REPEAT$("0",N) NEXT k LET f$(i)(j:j)="1" !中央 IF i>1 THEN LET f$(i-1)(j:j)="1" !上 IF i<M THEN LET f$(i+1)(j:j)="1" !下 IF j>1 THEN LET f$(i)(j-1:j-1)="1" !左 IF j<N THEN LET f$(i)(j+1:j+1)="1" !右 LET t=(i-1)*N+j !連番での位置 LET sw$(t)="" !ビット列を得る FOR k=1 TO M LET sw$(t)=sw$(t)&f$(k) NEXT k NEXT j NEXT i !FOR i=1 TO M*N !debug ! PRINT sw$(i) !NEXT i
|