新しく発言する  EXIT  インデックスへ

ライツアウト(LightsOut)をプログラムで解...


  ライツアウト(Lights Out)をプログラムで解く(PLAYモードを含む) 山中和義 2008/05/24 09:40:05 
ライツアウト(Lights Out)をプログラムで解く(PLAYモードを含む)  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/05/24 09:40:05
!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
  つづき 山中和義 2008/05/24 09:40:49 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。