Tips

【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑭
2016.10.26

【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑭

「プログラミングに興味があるけど…」
「VBAを使って作業を効率化できたらなぁ」
「プログラミング勉強したけどわからん(´・ω・)」

等々、プログラミングって結構敷居が高い!
気持ちはわかります。私は、最初にJavaを触りましたが、わからなくて何も面白くなかったです。。
でも!普段使っているExcelならわかりやすいはず!
というわけで、Excelでオセロを作ってプログラミングを楽しく学んでいきましょう。

Excelでオセロを作ろう⑭

オセロを作って楽しくプログラミングを学ぼう!
第9回から石を置くことによって変わる石が存在するかどうかの判定を作っています。
前回から斜め方向へのチェックを実装し、前回は左下を実装しました。
今回は、右上と右下へのチェックを実装していきます。

石が変わる条件のおさらい

第9回でまとめた条件をおさらいします。

成功

  • チェック方向に置いた石と反対の色の石が出てきた後に同色の石が出てきた場合

失敗

  • 置いた石からチェック方向には自分の石と色が反対の石がない場合
  • 置いた石、置いた石と色が反対の石、置いた石と色が同じ石の順が最短の変更なので、チェックする方向に盤の際から3マス目以内においてない場合
  • チェックの途中で石が置かれていないマスが出てきた場合
  • 盤の外側に出てしまう場合

これをプログラムで実現していきます。

左上と右上とのチェックの差

前回の左上と左下と同じように左上と右上とのチェック差を考えていきます。
左上へのチェックと右上へのチェックでの違いに関しても下記の二つがあります。

  • チェック方向の差
  • 盤外に出た時の判定

チェック方向の差

左上へと右上ではチェックする方向が違うので、右上のチェックでは列を「-1」ではなく「+1」していきます。

盤外に出た時の判定

盤外に出た時の判定は、上方向へは共通ですが、横方向に違いがあります。
左上へのチェックでは左方向に、右上へのチェックでは右方向になります。

【右上方向チェック】マクロ内容追記

右上へのチェックとの差を理解したところで、右上方向に変わる石があるかどうかのチェックを実装していきましょう。
左上と同様に行と列両方の変更を同時に行っていきます。

右上方向の確認メソッドの作成

前回までに作ってきたメソッドと同様に「othello」に「right_up_change_check」メソッドを作成していきます。
まずは初期位置が右上から横方向と縦方向ともに2マス以上離れていること(①)と右上の石が置いた石と反対の石であることのチェック(②)します。

Function right_up_change_check(cell_row, cell_column, stone, reverse_stone)
    Dim check_result As Boolean
    check_result = False

    //① 
    If cell_column + 2 <= LEFT_TOP_COLUMN + 7 And cell_row - 2 >= LEFT_TOP_ROW Then
        //②
        If Cells(cell_row - 1, cell_column + 1).Value = reverse_stone Then
            //中身にチェック処理を記述
        End If
    End If
    right_up_change_check = check_result
End Function

次にチェック処理を記載していきます。
二つの変数iとj(行と列のそれぞれの動きを管理する変数)を用意していきます(①)。
そして、その変数をwhile文の中で列は「+1」、行は「-1」していきます(②)。
while文を続ける条件は、用意したiとjの値が盤の右上の座標よりも外の場合は、処理を続けていきます(③)。

Function right_up_change_check(cell_row, cell_column, stone, reverse_stone)
    Dim check_result As Boolean
    check_result = False

    If cell_column + 2 <= LEFT_TOP_COLUMN + 7 And cell_row - 2 >= LEFT_TOP_ROW Then
        If Cells(cell_row - 1, cell_column + 1).Value = reverse_stone Then
            //①
            i = cell_column + 2
            j = cell_row - 2
 
            //③
            Do While i <= LEFT_TOP_COLUMN + 7 And j >= LEFT_TOP_ROW
                //②
                i = i + 1
                j = j - 1
            Loop
        End If
    End If
    right_up_change_check = check_result
End Function

最後に、ループを抜ける条件をループ内に記載していきます。
自分と同じ色の石が置いてある場合はチェックをtrueとしてループを抜けます(①)。
チェック先に石が置かれていない場合はループを抜けます。(②)

Function right_up_change_check(cell_row, cell_column, stone, reverse_stone)
    Dim check_result As Boolean
    check_result = False

    If cell_column + 2 <= LEFT_TOP_COLUMN + 7 And cell_row - 2 >= LEFT_TOP_ROW Then
        If Cells(cell_row - 1, cell_column + 1).Value = reverse_stone Then
            i = cell_column + 2
            j = cell_row - 2
 
            Do While i <= LEFT_TOP_COLUMN + 7 And j >= LEFT_TOP_ROW
                //①
                If Cells(j, i).Value = stone Then
                    check_result = True
                    Exit Do
                End If
 
                //②
                If Cells(j, i).Value = "" Then
                    Exit Do
                End If

                i = i + 1
                j = j - 1
            Loop
        End If
    End If
    right_up_change_check = check_result
End Function

これで右上方向へのチェックメソッドの完成です。

%e5%8f%b3%e4%b8%8a%e6%96%b9%e5%90%91%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e5%ae%9f%e8%a3%85

【右上方向チェック】動作確認

右上方向へのチェックがうまくできるか確かめる

上で作成したメソッドを石を置く前に呼び出してしっかりと動くか確認していきます。

メソッドを記述

セルがクリックされたときに呼び出されるメソッド「cell_DoubleClick」の中で石を置いたあとにチェックしてメッセージボックスを出すようにします。
左下方向のチェックを動かしているのでそれを編集して右上方向に修正しましょう。

If right_up_change_check(cell_click_row, cell_click_column, stone, reverse_stone) = True Then
    MsgBox "右上側に裏返す石があります"
Else
    MsgBox "右上側に裏返す石がありません。"
End If

「cell_DoubleClick」メソッド全体を見ると以下のようになっています。

%e3%83%9e%e3%82%af%e3%83%ad_cell_doubleclick

メソッドの動作確認

右上に裏返せる石がある状態とない状態で試してしっかりと動作する確認します。

裏返せる石がある場合

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d2

裏返せる石がない場合

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d3

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d4

問題なく右上側に裏返す石があるかどうかのチェックができています。

【右下方向チェック】マクロ内容追記

同様の要領で右下のチェックを実装していきます。
右下のチェックのメソッドは下記のようになります。

Function right_down_change_check(cell_row, cell_column, stone, reverse_stone)
    Dim check_result As Boolean
    check_result = False

    If cell_column + 2 <= LEFT_TOP_COLUMN + 7 And cell_row + 2 <= LEFT_TOP_ROW + 7 Then
        If Cells(cell_row + 1, cell_column + 1).Value = reverse_stone Then
            i = cell_column + 2
            j = cell_row + 2

            Do While i <= LEFT_TOP_COLUMN + 7 And j <= LEFT_TOP_ROW + 7
                If Cells(j, i).Value = stone Then
                    check_result = True
                    Exit Do
                End If

                If Cells(j, i).Value = "" Then
                    Exit Do
                End If

                i = i + 1
                j = j + 1
            Loop
        End If
    End If

    right_down_change_check = check_result
End Function

【右下方向チェック】動作確認

右下方向へのチェックがうまくできるか確かめる

上で作成したメソッドを石を置く前に呼び出してしっかりと動くか確認していきます。

メソッドを記述

セルがクリックされたときに呼び出されるメソッド「cell_DoubleClick」の中で石を置いたあとにチェックしてメッセージボックスを出すようにします。
右上方向のチェックを動かしているのでそれを編集して右下方向に修正しましょう。

If right_down_change_check(cell_click_row, cell_click_column, stone, reverse_stone) = True Then
    MsgBox "右下側に裏返す石があります"
Else
    MsgBox "右下側に裏返す石がありません。"
End If

「cell_DoubleClick」メソッド全体を見ると以下のようになっています。

%e3%83%9e%e3%82%af%e3%83%ad_cell_doubleclick2

メソッドの動作確認

右下に裏返せる石がある状態とない状態で試してしっかりと動作する確認します。

裏返せる石がある場合

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d5

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d6

裏返せる石がない場合

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d7

%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89%e5%8b%95%e4%bd%9c%e7%a2%ba%e8%aa%8d8

問題なく右下側に裏返す石があるかどうかのチェックができています。

次回の予定

次回は、今まで作ってきたチェック処理をまとめていきます。

記事一覧


【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!①
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!②
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!③
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!④
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑤
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑥
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑦
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑧
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑨
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑩
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑪
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑫
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑬
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑭
【プログラミング入門】Excelでオセロを作って楽しくプログラミングを学ぼう!⑮

excel_VBAを学んで業務効率化!

excel-vba入門 連載

Recent News

Recent Tips

Tag Search