VBA로 오셀로 작성 #5 스코어보드 표시·승패 판정·패스 버튼을 실장해 완성!

19017 단어 VBA오셀로
본고에서는 할애하고 있습니다만 전회의 뒤집어 판정에 미비가 있어, 디버그 해 정비해, 뒤집을 수 있는 위치 이외에 돌을 두지 않게 개수했습니다. 그리고, 돌의 수를 표시하는 스코어 보드와 패스 버튼, 한층 더 승패 판정도 실장해, 드디어 완성했습니다.

⒈ 뒤집기 판정 개수


Function Stone_Reverse_Right(ByVal Target As Range)
    Dim i As Integer                            '反対の色の石探索用のカウンタ
    i = 1
    Dim a_row, a_col As Integer     '座標変換用変数
    a_row = Target.Row - 3      '選択セルの行を配列上の座標に変換して代入
    a_col = Target.Column - 3       '選択セルの列を配列上の座標に変換して代入
    Dim r As Integer      'ひっくり返す用カウンタ
    If 3 <= Target.Column And Target.Column <= 8 Then     '選択セルの列がエクセル上の座標で3~8の間だったら
        Do While 0 < a_col + i And a_col + i < 7  '左右端を除いた範囲で繰り返す
            If stone_arr(a_row, a_col + i) = "" Then '一つ右の石が空白ならループ抜ける
                Exit Do
            End If
            If stone_arr(a_row, a_col + i) = reverse_stone Then '一つ右の石が反対色の石か?
                If stone_arr(a_row, a_col + i + 1) = stone Then 'さらにもう一つ右の石が同じ色か?
                    r = a_col + i                          'ひっくり返す用カウンタに一個前の列座標を入れる
                    Do While r > a_col                    '石置いた列までひっくり返しループ
                        If stone = BLACK_STONE Then        '置いた石が黒石だったら
                            stone_arr(a_row, r) = BLACK_STONE    '一個前の配列データを●にひっくり返す
                            stone_arr(a_row, a_col) = BLACK_STONE       '置いた黒石の座標を配列へ代入
                        ElseIf stone = WHITE_STONE Then    '置いた石が白石だったら
                            stone_arr(a_row, r) = WHITE_STONE     '一個前の配列データを◯にひっくり返す
                            stone_arr(a_row, a_col) = WHITE_STONE       '置いた白石の座標を配列へ代入
                        End If
                        r = r - 1       'ひっくり返す用カウンタ変数をデクリメント(置いた位置まで戻る)
                    Loop
                End If
            Else    '一つ右の石が同じ色ならループ抜ける
                Exit Do
            End If
            i = i + 1
        Loop
    End If
End Function

개수한 오른쪽 방향의 뒤집기 판정입니다. 이전에는 뒤집기 판정을 하기 전에 셀에 돌을 대입하고 있었습니다만, 뒤집기 판정 함수 안에 둔 돌을 배열 내에 격납하는 것으로, 후에 배열 내의 데이터를 반면에 반영시켰다 때때로 돌이 표시되도록 변경하고 있습니다.
이것에 의해 뒤집히지 않는 위치에 돌을 둘 수 없도록 할 수 있었습니다.

⒉ 스코어 보드


Public blackCount, whiteCount As Long   '黒石と白石カウント変数
    '黒石、白石カウント変数初期化
    blackCount = 2
    whiteCount = 2
    'スコアボード初期化
    Cells(2, 6) = "黒:" & blackCount
    Cells(2, 9) = "白:" & whiteCount
Function ScoreBoard()   '黒石白石数えるよう関数
    Dim i As Long: i = 0
    Dim j As Long: j = 0
    '黒石白石カウント変数初期化
    blackCount = 0
    whiteCount = 0

    For i = 0 To 7  'stone_arr配列の中の黒石と白石の数を数える
        For j = 0 To 7
            If stone_arr(i, j) = BLACK_STONE Then
                blackCount = blackCount + 1
            ElseIf stone_arr(i, j) = WHITE_STONE Then
                whiteCount = whiteCount + 1
            End If
        Next
    Next
End Function
        '石が既にあるかの判定
        If Cells(cell_click_row, cell_click_column).Value = "" Then

            '盤面情報保存する
            Call Stone_Map

            '8方向にひっくり返す判定
            Call Stone_Reverse_Right(Target)      '右ひっくり返す判定
            Call Stone_Reverse_Left(Target)     '左ひっくり返す判定
            Call Stone_Reverse_Up(Target)       '上ひっくり返す判定
            Call Stone_Reverse_Down(Target)     '下ひっくり返す判定
            Call Stone_Reverse_UpRight(Target)  '右上ひっくり返す判定
            Call Stone_Reverse_UpLeft(Target)   '左上ひっくり返す判定
            Call Stone_Reverse_DownRight(Target)    '右下ひっくり返す判定
            Call Stone_Reverse_DownLeft(Target)     '左下ひっくり返す判定

            '配列データを盤面に反映
            Call ApplyArrayData

            'stone_arr配列内の石をカウントしてスコアボード表示
            Call ScoreBoard

            'スコアボード更新
            Cells(2, 6) = "黒:" & blackCount
            Cells(2, 9) = "白:" & whiteCount

스코어보드는 전역 변수에 흑석과 백석을 세는 숫자를 넣습니다.
처음에는 검정도 흰색도 2개이므로 2로 초기화한 후 스코어보드를 표시하고 싶은 셀에 대입하고 있습니다.
그리고, 반면 정보를 보존하고 있는 배열내의 돌을 세는 함수를 뒤집어 판정 후에 호출해 스코어 보드가 뒤집을 때마다 갱신되도록 하고 있습니다.

⒊ 패스 버튼


Sub passBottun()    'パスボタン
    stone_count = stone_count + 1   '手数を進めるためインクリメント

    '次の手番黒か白か判定
    If stone_count Mod 2 = 1 Then   'ターン数が偶数回か奇数回かのIf文

        '置き終わったら「黒の番です」と表示
        Cells(2, 1) = "「黒の番です」"
        '偶数の場合
        stone = BLACK_STONE     '置く石は黒
        reverse_stone = WHITE_STONE     'ひっくり返す石は白
    Else

        '置き終わったら「白の番です」と表示
        Cells(2, 1) = "「白の番です」"
        '奇数の場合
        stone = WHITE_STONE     '置く石は白
        reverse_stone = BLACK_STONE     'ひっくり返す石は黒
    End If
End Sub

패스 버튼은 수수 카운터를 인크리먼트 하는 것으로 돌을 두지 않고 상대의 차례에 스킵 할 수 있도록 하고 있습니다.

⒋ 승패 판정


Sub OtheloJudgement()  '勝敗判定用関数
    If blackCount > whiteCount Then '黒石の数が白石より多かったら黒の勝ち
        MsgBox "黒の勝ちです!", vbInformation
    ElseIf blackCount < whiteCount Then '白石の数が黒石より多かったら白の勝ち
        MsgBox "白の勝ちです!", vbInformation
    ElseIf blackCount = whiteCount Then '黒石と白石の数が互角だったら引き分け
        MsgBox "引き分けです!", vbInformation
    End If
    MsgBox "最初からする場合はゲームスタートボタンを押して下さい。"
End Sub

    '黒石と白石の数が盤面を埋め尽くしたら勝敗判定プロシージャを呼び出す
    If blackCount + whiteCount = UBound(stone_arr) * UBound(stone_arr, 2) Then
        Call OtheloJudgement
    End If

승패 판정은 흑석·시라이시 카운트의 수를 비교하는 함수를 깁업 버튼에 묶어 실장하고 있습니다.
깁업 버튼을 누르지 않아도, 반면상 모두에 돌이 놓인 상태가 되면 승패 판정 프로시저를 호출하도록 하고 있습니다.
승패 판정 후에는 자동으로 재시작하지 않기 때문에, "처음부터 하는 경우는 게임 스타트 버튼을 눌러 주세요."의 일문을 MsgBox로 표시시키고 있습니다.







요약



처음 만들기 시작했을 때는 아직 VBA에도 익숙하지 않아 정말로 만들 수 있는지 불안했습니다만, 일에서도 VBA에 접하고 있기 때문에, 서서히 되어 가서 어떻게든 완성까지 착용했습니다.
VBA는 실제로 만질 때까지는 약간의 매크로 밖에 만들 수 없다. 라는 인식이었지만 이런 게임을 만들거나 좀 더 정교한 내용으로 하면 그 밖에도 재미있는 게임에서 편리한 매크로까지 폭넓은 프로그램이 짜여 안쪽이 깊다고 느꼈습니다.
직장에서는 쭉 사귀어가는 언어가 될 것 같기 때문에 더 빠르고 낭비가 없는 프로그램이 짜낼 수 있도록 정진하고 싶습니다.
초보자이기 때문에, Qiita의 기사로는 잡은 내용이었습니다만, 여기까지 읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기