[ TOP | BACK | NEXT ]

VisualBasic6.0を使う     2000.1.24(月)、25(火),27(木)

第8回 板ならべパズル


Option Explicit

Rem 瀬戸

Dim hx As Integer, hy As Integer  '空き位置のパネルの位置

Dim Cx(10) As Integer, Cy(10) As Integer  'パネルの行、列の位置

Private Sub Form_Load()

Visible = True

AutoRedraw = True

Dim i As Integer

ScaleMode = 3



'********** パネル初期化 *********

For i = 0 To 7

    Cx(i) = i Mod 3

    Cy(i) = i \ 3

Next i

hx = 2: hy = 2

Randomize         '乱数を発生させる

For i = 0 To 500

    label_mousedown Int(8 * Rnd), 0, 0, 120, 120

Next i

End Sub



'*********マウスダウンでパネルを移動させる*******

Private Sub label_mousedown(index As Integer, button As Integer, _

    shift As Integer, X As Single, Y As Single)

    Dim d As Integer

    If (Cy(index) = hy And (Cx(index) = hx - 1 Or Cx(index) = hx + 1)) Or _

   (Cx(index) = hx And (Cy(index) = hy - 1 Or Cy(index) = hy + 1)) Then

        Label(index).Move Label(0).Width * hx, Label(0).Height * hy

        d = Cx(index): Cx(index) = hx: hx = d

        d = Cy(index): Cy(index) = hy: hy = d

    End If

End Sub

作業

  1. フォームへラベルコントロールを配置する。
  2. プロパティの設定

    コントロールプロパティ
    Label1(オブジェクト名)Label
    Index0
    Caption1
    Font サイズ24
    Height975
    Width975

    コントロールプロパティ
    Label2(オブジェクト名)Label
    Index1
    Caption2
    Font サイズ24
    Height975
    Width975

    以下同様に Label8 まで Index と Caption を1ずつ増やしていく。

  3. プログラムを入力し実行。
  4. プログラムを保存する。
    1. プロジェクト名 Prjpanel など、フォーム名 frmpanelなどにする.
    2. 1時間で入力しきれない時は、途中保存となる。
  5. エラーが出たときは、実行を終了させてから、ファイル(F),印刷(P)をクリックしてプログラムリストを出力する。さらにエラーを訂正して再実行する。
  6. プログラムリストの提出。

ポイント

  1. Rndは0〜1未満の乱数を計算する関数です。0≦Int(8*Rnd)≦7
  2. Randomizeはプログラム実行のたびに異なる乱数を発生させる命令。
  3. i Mod 3 は i を3で割った余りを計算する。(0,1,2のどれかの値をとる)
  4. i \ 3 は i を3で割った商(0,1,2の値をとる)
  5. Private Sub label_mousedown(index As Integer
    ラベル上でマウスダウンされるとIndex引数にラベルの番号(0〜7)が渡される。
  6. 空き位置の判定  空き位置は(hx,hy)、マウスダウンしたラベルを Label(Index) とする。その Label(Index) の列位置は Cy(Index)、行位置は Cx(Index) にある。
      空きが左にあるかは、Cy(Index) = hy かつ Cx(Index) = hx+1
      空きが右にあるかは、Cy(Index) = hy かつ Cx(Index) = hx-1
      空きが上にあるかは、Cx(Index) = hx かつ Cy(Index) = hy+1
      空きが下にあるかは、Cx(Index) = hx かつ Cy(Index) = hy-1
    が真か偽かで判定できる。

注意

  1. 「'」(半角のアポストロフィー)以下はコメントである。(プログラムを分かりやすくするために入れる。)
  2. 1行が長くなりすぎるときは 「 _」半角のスペースとアンダーラインで次の行に継続させる。

発展

  1. この例は8枚の板であるが、パネルを15枚に増やす。
  2. 少し難しいが、プログラムでパズルの完成をチェックする。
  3. 開始から終了までの時間を計測する。
  4. 繰り返しゲームが出来るようにする。

[ TOP | BACK | NEXT ]