投稿者 デフォルト  (社会人) 投稿日時 2009/3/28 04:45:59
黒と白のコマを交互に置く「くるくるバトル」というゲームです
置いた位置から縦、横、斜めにコマを調べて、自分の持ちコマではさんだときに裏返すことができます。
SearchPieceとChangePieceメソッドの中にあるFor i = 1 To PIECE - 1の部分が
どうしても理解できません。
オセロと同じ物だとおもうのですが、管理人様の作られたオセロと違うようなので
何ともお手上げです。helpをお願いします。

 Private PBox(35) As PictureBox    'PictureBoxの配列
  Private PBox2(5, 5) As PictureBox 'PictureBoxの二次元配列
  Private dw(7) As Integer    '横方向移動量
  Private dh(7) As Integer    '縦方向移動量
   Const PIECE As Integer = 6     '1辺のコマの数


  '-----------------
  '起動時
     'PictureBoxの配列を作成
     '二次元配列を作成
     '移動量を設定
    dh = New Integer() {-1, -1, -1, 0, 1, 1, 1, 0}
    dw = New Integer() {-1, 0, 1, 1, 1, 0, -1, -1}

    '盤面のドラッグ/ドロップを設定
    'コマを表示
    sender.Image = e.Data.GetData(DataFormats.Bitmap)

    '周囲のピクチャボックスを調べる
    Call CheckPiece(sender.Tag)


------------------------------
  '周囲のピクチャボックスを調べる
  '
  Private Sub CheckPiece(ByVal index As Integer)
    Dim i As Integer    'カウンタ
    Dim pos As Integer  'チェック対象の番号
    Dim flg As Boolean  '裏返すかどうか

    For i = 0 To 7

      'ピクチャボックスの番号を調べる
      pos = GetIndex(index, i)

      'ピクチャボックスの番号が正しいかどうか
      If pos < 0 Then
        '
      Else
        'コマが置いてあるかどうか
        If PBox(pos).Image Is Nothing Then
          '
        Else
          'ドラッグしたコマと同じ色かどうか
          If PBox(index).Image Is PBox(pos).Image Then
            '
          Else
            'コマを裏返す
            flg = SearchPiece(index, i)
            If flg = True Then
              Call ChangePiece(index, i)
            End If
    中略

  '-----------------------------
  'インデックスを取得する
  '
  Private Function GetIndex(ByVal index As Integer, ByVal n As Integer) As Integer
    Dim h As Integer    '行番号
    Dim w As Integer    '列番号
    Dim hh As Integer   'チェック対象の行番号
    Dim ww As Integer   'チェック対象の列番号

    '行・列番号の取得
    h = index \ PIECE
    w = index Mod PIECE

    'チェック対象の行・列番号
    hh = h + dh(n)
    ww = w + dw(n)

    'インデックスの取得
    If (hh < 0) Or (hh > PIECE - 1) Then
      GetIndex = -1
    ElseIf (ww < 0) Or (ww > PIECE - 1) Then
      GetIndex = -1
    Else
      GetIndex = PBox2(hh, ww).Tag
    End If
  End Function


  '-----------------------------
  'コマを調べる
  '
  Private Function SearchPiece(ByVal index As Integer, ByVal n As Integer) As Boolean
    Dim tmp As Integer  '仮の基準位置
    Dim pos As Integer  'チェック対象の番号
    Dim i As Integer    'カウンタ
    Dim flg As Boolean  '裏返すかどうか

    '初期化
    tmp = index

    '一方向の繰り返し
    For i = 1 To PIECE - 1

      'インデックスの取得
      pos = GetIndex(tmp, n)

      'インデックスが正しいかどうか
      If pos < 0 Then
        Exit For

      Else
        'コマが置いてあるかどうか
        If PBox(pos).Image Is Nothing Then
          Exit For

        Else
          '裏返す必要があるかどうか
          If PBox(index).Image Is PBox(pos).Image Then
            flg = True
            Exit For
          End If
        End If
      End If

      '基準の位置を更新
      tmp = pos
    Next i

    '結果を返す
    SearchPiece = flg
  End Function


  '--------------------------
  'コマを裏返す
  '
  Private Sub ChangePiece(ByVal index As Integer, ByVal n As Integer)
    Dim tmp As Integer    '仮の基準位置
    Dim pos As Integer    'チェック対象の番号
    Dim i As Integer      'カウンタ

    '初期化
    tmp = index

    '一方向の繰り返し
    For i = 1 To PIECE - 1

      'インデックスの取得
      pos = GetIndex(tmp, n)

      'インデックスが正しいかどうか
      If pos < 0 Then
        Exit For

      Else
        'イメージがあるかどうか
        If PBox(pos).Image Is Nothing Then
          Exit For

        Else
          'ドロップしたコマと同じ色かどうか
          If PBox(index).Image Is PBox(pos).Image Then
            Exit For
          Else
            'コマを裏返す
            PBox(pos).Image = PBox(index).Image

                '基準の位置を更新
      tmp = pos
    Next i
  End Sub