オセロを作りながらマクロVBAを学ぼう№8
ExcelマクロVBAでオセロ(リバーシ)を作っていきながらマクロVBAを学ぶ第8回です。
そろそろ、PC対戦の機能を入れたいところですが、
今回は、はPC対戦の機能を入れる前に、気になる細かい部分を変更しておきます。
・石を置ける場所の色を変更するかどうかを選択できるようにする
・対戦途中で、「対戦開始」をクリックすると、いきなり初期配置になってしまうので、
メッセージを出して確認するようにする。
・相手の石を自分の石に取り替える処理が速すぎて、ひっくり返している感じがないので、
少しゆっくり石を取り換えて、アニメーションっぽくする。
(オブジェクト名)
を
「chk置ける場所」
として下さい。
デザインモードで、チェックボックスをダブルクリックすると、空のイベントプロシージャーが作成されます。
Private Sub chk置ける場所_Click()
If TargetSheet Is Nothing Then
Exit Sub
End If
Unprotect
If chk置ける場所.Value Then
Call 置ける場所表示
Else
Range("盤面").Interior.Color = Range("ベース色").Interior.Color
End If
Protect
End Sub
チェックが付けられたときは、「置ける場所表示」をCallします。
チェックが外されたときは、盤面全体を初期色に設定します。
Option Explicit
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public TargetSheet As Worksheet
Public 置く石 As Range
Public 相手石 As Range
使う時は、
Sleep 200
ミリ秒で指定します。
Sub 対戦開始()
With TargetSheet
If WorksheetFunction.CountA(.Range("盤面")) > 4 Then
If MsgBox("対局途中です。" & vbLf & vbLf & _
"新規対局を開始してもよろしいですか?", _
vbYesNo, "確認") = vbNo Then
Exit Sub
End If
End If
.Range("先番石").Copy Destination:=.Range("手番石")
.Range("手番石").Offset(, 1) = "の番です。"
.Range("盤面").ClearContents
Call 共通変数設定
Call 石を置く(.Range("盤面").Cells(4, 4), 置く石)
Call 石を置く(.Range("盤面").Cells(5, 5), 置く石)
Call 石を置く(.Range("盤面").Cells(4, 5), 相手石)
Call 石を置く(.Range("盤面").Cells(5, 4), 相手石)
Call 置ける場所表示
End With
End Sub
WorksheetFunction.CountAで置かれている石の数を取得し、
4より多ければ確認メッセージを表示して確認しています。
Sub 置ける場所表示()
Dim myRng As Range
With TargetSheet
If Not Sheet1.chk置ける場所.Value Then
Exit Sub
End If
.Range("盤面").Interior.Color = .Range("ベース色").Interior.Color
For Each myRng In .Range("盤面")
If is置ける全方向(myRng, True) Then
myRng.Interior.Color = .Range("置ける場所色").Interior.Color
End If
Next
End With
End Sub
chk置ける場所のチェックがついていない時は、Subプロシージャーを抜けています。
Function is置ける1方向(ByVal Target As Range, _
ByVal i As Long, _
ByVal j As Long, _
ByVal isTry As Boolean) As Boolean
Dim r As Long
Dim c As Long
Dim is置く石 As Boolean
Dim is相手石 As Boolean
Dim myRng As Range
Dim myRng2 As Range
'石を置くセルの行列位置
r = Target.Row
c = Target.Column
Set myRng = Nothing
With TargetSheet
'空白or置く石と同じ石が出てくるまで判定
Do
r = r + i
c = c + j
'空白(石が置かれていない
If .Cells(r, c) = "" Then
Exit Do
End If
'自分の石が置かれている
If .Cells(r, c).Font.Color = 置く石.Font.Color Then
is置く石 = True
Exit Do
End If
'相手の石が置かれている
If .Cells(r, c).Font.Color <> 置く石.Font.Color Then
is相手石 = True
If myRng Is Nothing Then
Set myRng = .Cells(r, c)
Else
Set myRng = Union(myRng, .Cells(r, c))
End If
End If
Loop
End With
'自分の石が置かれていて終了した時、それまでに相手の石があるか
If is置く石 = True And is相手石 = True Then
is置ける1方向 = True
If Not isTry Then
Call 石を置く(Target, 置く石)
Sleep 200
For Each myRng2 In myRng
Sleep 100
Call 石を置く(myRng2, 置く石)
Next
End If
End If
End Function
手番の石を置いた後、200ミリ秒待ちます。
相手の石を取り換える時は、まとめてではなく、一つずつ取り替えます。
そしてその都度、100ミリ秒待ちます。
長すぎると遅く感じるし、短すぎると効果が分からなくなっしまいます。
いよいよ、次回からは、PC対戦を実現します。
まずは強さは考えずに、
とにかくPCが自動で打つ機能を実現していきます。
全体の目次
ここまでのサンプルファイルのダウンロード
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.条件分岐(Select Case)|VBA入門
9.メッセージボックス(MsgBox関数)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBAサンプル集
- オセロを作りながらマクロVBAを学ぼう№8
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。