8パズル

DXRuby用の8パズルがだいたいコードが整理できてきたから、サンプルのひとつとしてここに書いておこう。
ファイルはDirectXがサポートしてるもの(bmppng、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

スクリーンショットはこんな感じ
手元にあった画像をテキトーに突っ込んでみた。