8パズル
DXRuby用の8パズルがだいたいコードが整理できてきたから、サンプルのひとつとしてここに書いておこう。
ファイルはDirectXがサポートしてるもの(bmp、png、jpgなど)で、サイズはなんでもOK。
そこそこ大きくて、できれば正方形が遊びやすい。
右クリックでシャッフル、左クリックで移動。
やればわかると思う。
VisualuRuby計画もインストールされていないと動かないが、Windows用バイナリをインストールしてるならまず入ってるんじゃないかなあ。
# DXRuby0.0.2用サンプル 8パズル # ライブラリの取り込み require 'dxruby' require 'vr/vruby' # ここだけVisualuRuby計画のお世話に。 filename = SWin::CommonDialog::openFilename(nil, [["スベテノファイル(*.*)","*.*" ]],nil,"パズル用の画像を選択", "") IMAGE_piece = Image.load(filename, 3, 3) # 窓設定 Window.width = IMAGE_piece[0].width * 3 Window.height = IMAGE_piece[0].height * 3 Window.caption = "8パズル" # パズルの情報 piece_arr = [0,1,2,3,4,5,6,7,8] oldl = false oldr = false # クリック時の処理 def click(x, y, piece_arr) i = piece_arr.index(8) if (((i % 3) - x).abs == 1 and (i / 3) == y) or (((i / 3) - y).abs == 1 and (i % 3) == x) then temp = piece_arr[i] piece_arr[i] = piece_arr[x + y * 3] piece_arr[x + y * 3] = temp end end # メインループ Window.loop do # 右クリックでシャッフル(ランダムで1000回ほどクリックしてもらってます^^;) if Input.mouseButton(M_RBUTTON) and !oldr then for i in 0..999 click(rand(3), rand(3), piece_arr) end end # 左クリック処理 if Input.mouseButton(M_LBUTTON) and !oldl then x,y = Input.mousePos click(x / IMAGE_piece[0].width, y / IMAGE_piece[0].height, piece_arr) end # 完了判定と描画 for i in 0..8 if piece_arr[i] != 8 or piece_arr == [0,1,2,3,4,5,6,7,8] then Window.draw(i % 3 * IMAGE_piece[0].width , i / 3 * IMAGE_piece[0].height, 0, IMAGE_piece[piece_arr[i]]) end end # エスケープキーでも終了 if Input.key(K_ESCAPE) == true then break end oldl = Input.mouseButton(M_LBUTTON) oldr = Input.mouseButton(M_RBUTTON) end
スクリーンショットはこんな感じ
手元にあった画像をテキトーに突っ込んでみた。