Tips

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

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

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

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

Excelでオセロを作ろう⑨


オセロを作って楽しくプログラミングを学ぼう!
第9回からは石を置くことによって変わる石が存在するかどうかの判定をしていきます。
今回は左方向です。

石が変わる条件

オセロで黒石と黒石の間に白石が置かれていた場合に白石が黒石の変わります。
石を置くと変わる石が存在するかどうか確かめるには、縦・横・斜めの方向に見ていけばわかりそうです。
わかりやすく図で示すと、赤いセルに白石を置く場合に、確認していかなければならないセルは、黄色のセルになります。

確認方向1

この縦・横・斜めの方向に見ていく中で、チェックを途中でやめても問題ない場合があります。
それが下記の場合になります。

  • 石がない方向
  • 一個目の石が置こうとしている石と同色だった方向
  • 同色の石が出ない間に石がなくなった方向(同色の石で別色の石を間にいれていない)
  • 置こうとしている位置が盤の際から3マス目より外側の場合

よって、実際に確認する範囲は下記のようになります。

確認方向2

まとめると以下のようになります。

成功

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

失敗

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

これらのルールでプログラムに書いていきます。

マクロの内容追記

先ほど考えた石が変わる条件をプログラムで実現して、変わる石が存在するかどうかのチェックをしていきましょう。
今回は左方向のチェックを実装します。

左方向の確認メソッドを作成

まずは左方向に石が変わるか確認していくメソッドを実装します。
左方向に変える石があるかどうかを返すメソッドを標準モジュールの「othello」に準備します。
それと変わるかどうかの返り値も用意します。

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

メソッドとして受け取る値は、以下の通りです。

置く石の行:cell_row
置く石の列:cell_column
置こうとしている石:stone
ひっくり返す対象になる石:reverse_stone

を引数として受け取ります。
左方向のチェックなので、列を1ずつ減らしていき、盤からはみ出る前に石が変わる条件を満たすかどうかを確かめていきます。

まず、盤を抜ける前に石を変える(石を挟む)ためには、置く場所が盤の左から3マス目より大きくなければなりません。
そのチェックを加えます。

Function left_change_check(cell_row, cell_column, stone, reverse_stone)
  Dim check_result As Boolean
  check_result = False
 
  If cell_column - 2 >= LEFT_TOP_COLUMN Then
  End If
 
  left_change_check = check_result
End Function

次に、左側に置かれている石が置こうとしている石の逆の石であることを確かめます。
つまり、同色の石、または置かれていない場合は石を変えられないのでそのチェックをします。

Function left_change_check(cell_row, cell_column, stone, reverse_stone)
  Dim check_result As Boolean
  check_result = False
 
  If cell_column - 2 >= LEFT_TOP_COLUMN Then
    If Cells(cell_row, cell_column - 1).Value = reverse_stone Then
    End If
  End If 
  left_change_check = check_result 
End Function

この二つがチェック後にループを使ってその先に同色の石があるかどうかを見ていきます。
今回はループ文として「Do while」を使用します。

Function left_change_check(cell_row, cell_column, stone, reverse_stone)
  Dim check_result As Boolean
  check_result = False
 
  If cell_column - 2 >= LEFT_TOP_COLUMN Then
    If Cells(cell_row, cell_column - 1).Value = reverse_stone Then
      i = cell_column - 2

      Do While i >= LEFT_TOP_COLUMN
        
        i = i - 1
      Loop
    End If
  End If 
  left_change_check = check_result 
End Function

これで盤の終わりまで左側のセルを見ていくことができます。
では、まずは同色の石が出てきて、石が変更可能と判明したときにループを抜ける条件を記述します。

Function left_change_check(cell_row, cell_column, stone, reverse_stone)
  Dim check_result As Boolean
  check_result = False
 
  If cell_column - 2 >= LEFT_TOP_COLUMN Then
    If Cells(cell_row, cell_column - 1).Value = reverse_stone Then
      i = cell_column - 2

      Do While i >= LEFT_TOP_COLUMN
         If Cells(cell_row, i).Value = stone Then
           check_result = True
           Exit Do
         End If
        i = i - 1
      Loop
    End If
  End If 
  left_change_check = check_result 
End Function

そして、同色の石が出てくる前に何も石が置かれていない箇所が出てきたときに変更不可でループを抜ける条件を記述します。

Function left_change_check(cell_row, cell_column, stone, reverse_stone)
  Dim check_result As Boolean
  check_result = False
 
  If cell_column - 2 >= LEFT_TOP_COLUMN Then
    If Cells(cell_row, cell_column - 1).Value = reverse_stone Then
      i = cell_column - 2

      Do While i >= LEFT_TOP_COLUMN
        If Cells(cell_row, i).Value = stone Then
          check_result = True
          Exit Do
        End If

        If Cells(cell_row, i).Value = "" Then
          Exit Do
        End If
        i = i - 1
      Loop
    End If
  End If 
  left_change_check = check_result
End Function

以上で左側チェックメソッドが完成しました。

%e3%83%9e%e3%82%af%e3%83%ad_left_change_check

動作確認

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

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

準備

まずは、黒石と白石の定数を準備します。

Const BLACK_STONE As String = "●"
Const WHITE_STONE As String = "○"

置く石だけでなく、変わる石の変数も準備します。

'置く石の色を選択
If stone_count Mod 2 = 1 Then
  '奇数の場合
  stone = WHITE_STONE
  reverse_stone = BLACK_STONE
Else
  '偶数の場合
  stone = BLACK_STONE
  reverse_stone = WHITE_STONE
End If

メソッドを記述

セルがクリックされたときに呼び出されるメソッド「cell_DoubleClick」の中で石を置いたあとにチェックしてメッセージボックスを出すようにします。

If left_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

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

次回の予定

次回は、右方向へ石が変わるかチェックをしていきます。

記事一覧


【プログラミング入門】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