リバース Game の制作 VB6
 (3) 駒を打つ 前へ 目次へ 次へ 

 2. はさめるかの判定処理

 駒を置くときは、マウスでフィールド(picField)をクリックする。クリックするとpicField_Clickプロシージャが呼び出される。では、64個あるフィールドの何番目がクリックされたのか。プロシージャの定義を見ると次のようになっている。

    Private Sub picField_Click(Index As Integer)

 引数Indexにクリックしたフィールドの番号、すなわちコントロール配列の番号が記憶されている。引数Indexは0〜63の整数であり、配列Fieldから状態を調べるには8×8のx,y座標に変換する必要がある。

 図のように白駒(白輪)をクリックしたとき、その場所を基準に8方向について調べる必要がある。例えば、@の方向を調べるとき、y座標だけを1ずつ減じていけば調べることができる。各方向と座標の増減は次のようになる。

x-1,y-1 x,y-1 x+1,y-1
x-1,y x,y x+1,y
x-1,y+1 x,y+1 x+1,y+1

 はさめるかどうかは8方向を調べていき、「黒、・・・、黒、白」であればはさめると判断できる。黒は1つ以上である。
 図の場合、Dの方向だけがはさめるので、置こうとした場所は置けると判断できる。

 はさめる方向と個数を記憶しておくために配列HoukouFと各方向の座標増減値を記憶しておく配列Hx, Hyを用意する。また、座標増減値のデータをForm_Loadプロシージャで初期化しておく。

・プログラムリスト

Option Explicit
Const BLANK = 0
Const WHITE = 1
Const BLACK = 2
Dim Field(7, 7) As Integer  'フィールド状態記憶用
Dim Junban As Integer       '順番用
Dim JunbanMsg(2) As String  '順番メッセージ用
Dim HoukouF(7) As Integer   'はさめる方向記憶用
Dim Hx(7) As Integer, Hy(7) As Integer  '方向データ用

Private Sub Form_Load()
    'データ設定
    Junban = WHITE          '順番設定
    JunbanMsg(1) = "白の番です。"
    JunbanMsg(2) = "黒の番です。"
    Hx(0) = 0: Hy(0) = -1   '上
    Hx(1) = 0: Hy(1) = 1    '下
    Hx(2) = -1: Hy(2) = 0   '左
    Hx(3) = 1: Hy(3) = 0    '右
    Hx(4) = -1: Hy(4) = -1  '左上
    Hx(5) = 1: Hy(5) = -1   '右上
    Hx(6) = -1: Hy(6) = 1   '左下
    Hx(7) = 1: Hy(7) = 1    '右下
    'ゲーム初期化
    InitField       'オブジェクト作成と配置初期化
    InitGame        'フィールド初期化
End Sub

 クリックした場所がはさめるかどうかをlblMsg2に表示することにする。

Private Sub picField_Click(Index As Integer)
'プレイヤーが置き場所をクリック
    If isHasamu(Index) = True Then     'はさめる
        lblMsg2.Caption = "置けます。"
    Else
        lblMsg2.Caption = "そこには置けません。"
    End If
End Sub

 はさめるかどうかを判定する処理(関数)はisHasamuとして作成する。はさめるとTrue、はさめないとFalseを返却する。

Private Function isHasamu(ban As Integer) As Boolean
'ban(0〜63)の位置にJunban(WHITE or BLACK)の駒がおけるか判定
    Dim n As Integer, x As Integer, y As Integer
    Dim aite As Integer         '相手駒用

    If Junban = WHITE Then  '#1 相手駒設定
        aite = BLACK
    Else
        aite = WHITE
    End If
    For n = 0 To 7
        HoukouF(n) = 0      '#2 はさめる方向(方向フラグ)の初期化
    Next n
    For n = 0 To 7      '#3 8方向調べる
        x = (ban Mod 8)     'x座標
        y = Int(ban / 8)    'y座標
        If Field(x, y) <> BLANK Then    '#4 置く場所が空ではない
            Exit For
        End If
        Do              '#5
            x = x + Hx(n)   'x方向移動
            y = y + Hy(n)   'y方向移動
            If x < 0 Or x > 7 Or y < 0 Or y > 7 Then    '#5a フィールド外
                HoukouF(n) = 0
                Exit Do
            End If
            If Field(x, y) = aite Then        '#5b 相手駒
                HoukouF(n) = HoukouF(n) + 1       '方向フラグ1加算
            ElseIf Field(x, y) = Junban Then  '#5c 自分の駒
                Exit Do
            Else                              '#5d 空き
                HoukouF(n) = 0
                Exit Do
            End If
        Loop
    Next n
    isHasamu = False    '#6 はさめない
    For n = 0 To 7
        If HoukouF(n) <> 0 Then
            isHasamu = True     'はさめる
            Exit For
        End If
    Next n
End Function

#1 自分の駒は変数Junbanに記憶されているので、ここで相手の駒を調べ変数aiteに記憶しておく。はさめるかどうかを判定するために使用する。

#2 はさめる方向と個数を記憶する配列HoukouFを0で初期化しておく。すなわち、HoukouFが0であればはさめないということである。

#3 For文で8方向について調べる。最初に置く場所banをx,yの座標に変換する。

#4 置く場所banが空きでなければ置けないので、調べるのを中止(Exit For)して終える。

#5 相手の駒がいくつあるかわからないので、Do〜Loopで永久ループとしている。このループから抜け出すためにはExit Doを実行する。
 n番目の方向を調べるため座標を計算し、#5aフィールドをはみ出した場合ははさめないのでHoukouF(n)を0にして永久ループを抜け出す。#5b相手の駒であればHoukouF(n)を1加算する。これがはさめる個数となる。#5c自分の駒であれば単に永久ループを抜け出す。抜け出すまでに相手駒があればHoukouF(n)にはさめる個数が入っているからである。#5d空きであればはさめていないことになるのでHoukouF(n)を0にして永久ループを抜け出す。

#6 返却値を設定する。配列HoukouFのどれかが1以上であればはさめるのでisHasamuにTrueを設定する。


 実行してフィールドをクリックすると、ウィンドウ下部にメッセージが表示される。白駒が置ける所では「置けます。」、それ以外の所では「そこには置けません。」と表示される。


 (3) 駒を打つ 前へ 目次へ 次へ 
Copyright © 2002 Hiroshi Masuda 

 

 

inserted by FC2 system