VBAサンプル集
Excel将棋:将棋進行クラスの作成(№8)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2020-08-31

Excel将棋:将棋進行クラスの作成(№8)


VBA マクロ Excel将棋

Excelで将棋を作ってみましょう。
人vs人で動かしてゲームとして成立するところまでが当面の目標です。


今回は、シートとやり取りする将棋進行クラスを作成します。
ここまでは、作成したクラスのテスト実行用のVBAを別途作成し、
結果をイミディエイト ウィンドウに表示して確認していました。
単体テストとして、このような過程は必要なものですが、いかんせんテストが大変です。
今回作成する将棋進行クラスが出来上がれば、今後はシート操作で実行結果を確認できるようになります。
作成するクラス全体の設計は、№2. Excel将棋:クラスの設計、こちらを参照してください。
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、VBAクラスの設計になります。設計といっても、どのようなプロパティ・メソッドをもたせるかといった概要だけです。

※クラス名、プロシージャー名、変数名に日本語を使用しています。

将棋進行クラス

将棋進行クラスの設計

種別 名称 説明
プロパティ 将棋盤 シートのRange
プロパティ 先手持駒 シートのRange
プロパティ 後手持駒 シートのRange
プロパティ 先手消費時間 シートのRange
プロパティ 後手消費時間 シートのRange
プロパティ 手数 シートのRange
プロパティ 棋譜 シートのRange
プロパティ 将棋盤色 シートのRange
プロパティ 駒選択色 シートのRange
メソッド 駒配置 駒を並べる
「大橋流」でアニメーションさせたい
メソッド 駒選択 選択駒の移動可能セルの協調表示
既に選択されている場合は解除
メソッド 着手 引数(元位置, 先位置, 駒名)
元位置:-1,-1は初期配置
元位置:0,0は駒台から
反則(禁じ手)等の判定を行い、禁じ手の場合はFalseを返す
相手の駒を取る場合は駒台へ追加
駒台から打った場合は駒台から削除
シート全体の更新
メソッド 盤面表示 盤面の2次元配列をシートに表示する
2次元配列はcls将棋盤の現在盤面で取得する
メソッド 終局判定 これは結構難しい・・・
持駒を含めた全ての駒を使って受けがないかの判定

このような計画でいましたが、標準モジュールから呼び出すプロシージャーとして、
「ゲーム開始」
これをPublicで作成し、他は全てPrivateで作成することにしました。
してがって、プロパティも特に必要なくなったので、上記プロパティはPrivate変数にします。

また、初回の Excel将棋:マクロVBAの学習用、こちらで作成したシート作成も、このクラスに入れてしまいます。
Excelで将棋を作ってみましょう。今やコンピューター将棋はプロをしのぐ強さです。しかし、Excelでそのようなソフトを作ろうと言うのではありません。と言いますか、残念ながら私には作れません、、、ExcelマクロVBAの学習素材として将棋を作ってみましょう。
これにより、標準モジュールでは、
・cls将棋進行のインスタンス作成
・ゲーム開始 メソッドのCall
これだけになります。

将棋進行クラスのVBA

クラス名称:cls将棋進行

Option Explicit

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'イベント用
Private WithEvents xlApp As Excel.Application
Private p前回選択 As Range
Private p今回選択 As Range

'Excel将棋の書くオブジェクト
Private obj将棋盤 As cls将棋盤
Private obj先手駒台 As cls駒台
Private obj後手駒台 As cls駒台

'シートおよび名前定義の設定
Private pWs As Worksheet
Private p開始位置 As Range
Private p将棋盤 As Range
Private p先手持駒 As Range
Private p後手持駒 As Range
Private p先手消費時間 As Range
Private p後手消費時間 As Range
Private p手数 As Range
Private p棋譜 As Range
Private p将棋盤色 As Range
Private p駒選択色 As Range

'先手後手の定数
Private Const c先手 As Boolean = True
Private Const c後手 As Boolean = False

'**********************************************************************
' 公開メソッド:起動するゲーム開始だけ、他はイベントで処理
'**********************************************************************

Public Sub ゲーム開始()
  Dim flgNew As Boolean
  On Error Resume Next
  Set p開始位置 = ActiveSheet.Range("開始駒位置")
  If Err Then
    Err.Clear
    Set p開始位置 = Application.InputBox(prompt:="将棋盤を作成するシートの作成開始左上をクリックしてください。" & vbLf & _
                     "※シートは全消去されます。", _
                     Title:="作成シート選択", _
                     Type:=8)
    If Err Then
      Exit Sub
    End If
    flgNew = True
  Else
    flgNew = False
  End If
  On Error GoTo 0

  Application.Cursor = xlWait
  Set xlApp = Nothing
  Application.Goto p開始位置
  Set pWs = p開始位置.Worksheet
  
  Application.ScreenUpdating = False
  If flgNew Then
    pWs.Cells.Clear
    ActiveWindow.DisplayGridlines = False
    pWs.Names.Add Name:="開始駒位置", RefersToLocal:=p開始位置
    Call シート名前定義
    Call シート書式設定
  Else
    Call シート名前定義
    p将棋盤.ClearContents
    p先手持駒.ClearContents
    p後手持駒.ClearContents
    p先手消費時間.ClearContents
    p後手消費時間.ClearContents
    p手数.ClearContents
    p棋譜.ClearContents
    p将棋盤.Interior.Color = p将棋盤色.Interior.Color
  End If
  Application.ScreenUpdating = True
  
  Call 駒配置
  Set xlApp = p開始位置.Application
  Application.Cursor = xlDefault
End Sub

'**********************************************************************
' イベント
'**********************************************************************

Private Sub Class_Initialize()
  Set obj将棋盤 = New cls将棋盤
  Set obj先手駒台 = New cls駒台
  Set obj後手駒台 = New cls駒台
End Sub

Private Sub Class_Terminate()
  Set xlApp = Nothing
  Set obj将棋盤 = Nothing
  Set obj先手駒台 = Nothing
  Set obj後手駒台 = Nothing
End Sub

'WithEventsのxlAppのイベント
Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  On Error Resume Next 'VBA作成中に意図せず出るエラー対応
  If p将棋盤 Is Nothing Then Exit Sub
  If Not Sh Is p将棋盤.Worksheet Then Exit Sub
  If Intersect(p将棋盤, Target.Item(1)) Is Nothing Then Exit Sub
  If Err Then Exit Sub
  
  xlApp.EnableEvents = False
  xlApp.Goto p手数
  xlApp.EnableEvents = True
  
  Set p前回選択 = p今回選択
  Set p今回選択 = Target.Item(1)
  
  If Not (p前回選択 Is Nothing Or p今回選択 Is Nothing) Then
    If p前回選択.Address = p今回選択.Address Then
      Call 駒選択(p今回選択, False)
      Exit Sub
    End If
  End If
  Call 駒選択(p今回選択, True)
  
  Call 着手(p前回選択, p今回選択)
End Sub

'**********************************************************************
' 非公開メソッド
'**********************************************************************

'大橋流でゆっくり駒を並べます。
Private Sub 駒配置()
  Dim ary駒配置
  ary駒配置 = Array( _
        Array(5, 9, "玉", c先手), Array(5, 1, "玉", c後手), _
        Array(6, 9, "金", c先手), Array(4, 1, "金", c後手), _
        Array(4, 9, "金", c先手), Array(6, 1, "金", c後手), _
        Array(7, 9, "銀", c先手), Array(3, 1, "銀", c後手), _
        Array(3, 9, "銀", c先手), Array(7, 1, "銀", c後手), _
        Array(8, 9, "桂", c先手), Array(2, 1, "桂", c後手), _
        Array(2, 9, "桂", c先手), Array(8, 1, "桂", c後手), _
        Array(9, 9, "香", c先手), Array(1, 1, "香", c後手), _
        Array(1, 9, "香", c先手), Array(9, 1, "香", c後手), _
        Array(8, 8, "角", c先手), Array(2, 2, "角", c後手), _
        Array(2, 8, "飛", c先手), Array(8, 2, "飛", c後手), _
        Array(5, 7, "歩", c先手), Array(5, 3, "歩", c後手), _
        Array(6, 7, "歩", c先手), Array(4, 3, "歩", c後手), _
        Array(4, 7, "歩", c先手), Array(6, 3, "歩", c後手), _
        Array(7, 7, "歩", c先手), Array(3, 3, "歩", c後手), _
        Array(3, 7, "歩", c先手), Array(7, 3, "歩", c後手), _
        Array(8, 7, "歩", c先手), Array(2, 3, "歩", c後手), _
        Array(2, 7, "歩", c先手), Array(8, 3, "歩", c後手), _
        Array(9, 7, "歩", c先手), Array(1, 3, "歩", c後手), _
        Array(1, 7, "歩", c先手), Array(9, 3, "歩", c後手))
  DoEvents
  Sleep 500
  
  Dim i As Long, j As Long
  With obj将棋盤
    For i = LBound(ary駒配置) To UBound(ary駒配置)
      .着手 ary駒配置(i)(2), Nothing, 棋譜位置(ary駒配置(i)(0), ary駒配置(i)(1)), ary駒配置(i)(3)
      Call 盤面表示(obj将棋盤.現在盤面, obj先手駒台.駒台一覧, obj後手駒台.駒台一覧)
      DoEvents
      Sleep 100
    Next
  End With
End Sub

'棋譜の筋・段を配列の行・列に変換
Private Function 棋譜位置(ByVal arg列 As Integer, ByVal arg行 As Integer) As g位置
  Set 棋譜位置 = g位置(arg行, 10 - arg列)
End Function

'盤内を選択した時に駒選択と移動可能位置の色設定を行う
Private Sub 駒選択(ByVal argRng As Range, _
         ByVal is選択 As Boolean)
  If argRng Is Nothing Then Exit Sub
  
  p将棋盤.Interior.Color = p将棋盤色.Interior.Color
  
  If Not is選択 Then Exit Sub
  If argRng.Value = "" Then Exit Sub
  
  argRng.Interior.Color = p駒選択色.Interior.Color
  
  'クリックセル → 盤面配列位置 → 移動可能位置取得 → シートに色設定
  Call 駒移動可能位置色変更(obj将棋盤.駒移動可能位置(セル2配列位置(argRng)))
End Sub

'セル選択位置を配列の位置に変換
Private Function セル2配列位置(ByVal argRng As Range) As g位置
  Dim r As Long, c As Long
  r = argRng.Row - p将棋盤.Row + 1
  c = argRng.Column - p将棋盤.Column + 1
  Set セル2配列位置 = g位置(r, c)
End Function

'駒を選択した時に駒の移動可能位置の色設定を行う
Private Sub 駒移動可能位置色変更(ByVal argCol As Collection)
  If argCol Is Nothing Then Exit Sub
  Dim tmp位置 As g位置
  For Each tmp位置 In argCol
    p将棋盤.Resize(1, 1).Offset(tmp位置.行 - 1, tmp位置.列 - 1).Interior.Color = p駒選択色.Interior.Color
  Next
End Sub

'盤面配列をシートに表示する
Private Sub 盤面表示(ByRef arg盤面() As String, _
           ByRef arg先手駒台() As Variant, _
           ByRef arg後手駒台() As Variant)
  Dim i As Long, j As Long
  
  '将棋盤
  For i = 1 To 9
    For j = 1 To 9
      If p将棋盤(i, j) <> Left(arg盤面(i, j), 1) Then
        If p将棋盤(i, j).Value <> Trim(Left(arg盤面(i, j), 1)) Then
          p将棋盤(i, j).Value = Trim(Left(arg盤面(i, j), 1))
        End If
      End If
      If IIf(p将棋盤(i, j).Orientation = xlUpward, "↓", "↑") <> Right(arg盤面(i, j), 1) Then
        If p将棋盤(i, j).Orientation <> IIf(Right(arg盤面(i, j), 1) = "↓", xlUpward, xlHorizontal) Then
          p将棋盤(i, j).Orientation = IIf(Right(arg盤面(i, j), 1) = "↓", xlUpward, xlHorizontal)
        End If
      End If
    Next
  Next
  
  '先手持駒 ※駒を取る機能と合わせて実装※
  
  '後手持駒 ※駒を取る機能と合わせて実装※
  
End Sub

'駒選択後に移動可能位置を選択したら着手します
Private Sub 着手(元位置, 先位置)
  '※次回作成※
End Sub

'玉の詰み判定し、詰んでいれば終局
Private Function 終局判定() As Boolean
  '※※※これは難しいので後回し※※※
  'cls将棋盤の終局判定を使用する
End Function

'**********************************************************************
' シート設定:名前定義と書式設定
'**********************************************************************

Private Sub シート名前定義()
  With pWs
    .Names.Add Name:="将棋盤", RefersToLocal:=p開始位置.Offset(4, 5).Resize(9, 9)
    .Names.Add Name:="先手持駒", RefersToLocal:=p開始位置.Offset(6, 16).Resize(7, 2)
    .Names.Add Name:="先手消費時間", RefersToLocal:=p開始位置.Offset(15, 12).Resize(1, 2)
    .Names.Add Name:="後手持駒", RefersToLocal:=p開始位置.Offset(4, 1).Resize(7, 2)
    .Names.Add Name:="後手消費時間", RefersToLocal:=p開始位置.Offset(1, 6).Resize(1, 2)
    .Names.Add Name:="手数", RefersToLocal:=p開始位置.Offset(15, 5)
    .Names.Add Name:="棋譜", RefersToLocal:=p開始位置.Offset(15, 6).Resize(1, 3)
    .Names.Add Name:="将棋盤色", RefersToLocal:=p開始位置.Offset(0, 18)
    .Names.Add Name:="駒選択色", RefersToLocal:=p開始位置.Offset(1, 18)
    Set p将棋盤 = .Range("将棋盤")
    Set p先手持駒 = .Range("先手持駒")
    Set p先手消費時間 = .Range("先手消費時間")
    Set p後手持駒 = .Range("後手持駒")
    Set p後手消費時間 = .Range("後手消費時間")
    Set p手数 = .Range("手数")
    Set p棋譜 = .Range("棋譜")
    Set p将棋盤色 = .Range("将棋盤色")
    Set p駒選択色 = .Range("駒選択色")
  End With
End Sub

Private Sub シート書式設定()
  '列幅行高設定()
  With p開始位置.EntireColumn
    .Offset(, 0).ColumnWidth = 2.4
    .Offset(, 1).ColumnWidth = 2.4
    .Offset(, 2).ColumnWidth = 4
    .Offset(, 3).ColumnWidth = 0.47
    .Offset(, 4).ColumnWidth = 1.6
    .Offset(, 5).Resize(, 9).ColumnWidth = 4
    .Offset(, 14).ColumnWidth = 1.6
    .Offset(, 15).ColumnWidth = 0.47
    .Offset(, 16).ColumnWidth = 4
    .Offset(, 17).ColumnWidth = 2.4
    .Offset(, 18).ColumnWidth = 2.4
  End With
  With p開始位置.EntireRow
    .Offset(0).Resize(17).RowHeight = 18
    .Offset(2).RowHeight = 4.8
    .Offset(3).RowHeight = 13.8
    .Offset(4).Resize(9).RowHeight = 28.2
    .Offset(13).RowHeight = 13.8
    .Offset(14).RowHeight = 4.8
  End With

  'セル結合設定()
  With pWs
    .Range("後手消費時間").Merge
    .Range("先手消費時間").Merge
    .Range("棋譜").Merge
  End With

  'セル書式設定()
  With p将棋盤色
    .Interior.Color = RGB(255, 222, 117)
    .BorderAround LineStyle:=xlContinuous
  End With
  With p駒選択色
    .Interior.Color = RGB(252, 228, 217)
    .BorderAround LineStyle:=xlContinuous
  End With
  With p開始位置
    .Resize(17, 19).BorderAround LineStyle:=xlContinuous
  End With
  With p将棋盤
    .Offset(-1, -1).Resize(11, 11).BorderAround LineStyle:=xlContinuous, Weight:=xlThick
    .Offset(-1, -1).Resize(11, 11).Interior.Color = p将棋盤色.Interior.Color
    .Borders.LineStyle = xlContinuous
    .Font.Name = "AR教科書体M"
    .Font.Size = 20
    .Font.Bold = True
    .HorizontalAlignment = xlCenter
    .Resize(3).Font.Name = "@AR教科書体M" '後手陣のみ
    .Resize(3).Orientation = xlUpward '後手陣のみ
    .Offset(-1).Resize(1).Font.Name = "MS Pゴシック"
    .Offset(-1).Resize(1).Font.Size = 8
    .Offset(-1).Resize(1).HorizontalAlignment = xlCenter
    .Offset(-1).Resize(1).VerticalAlignment = xlCenter
    .Offset(, 9).Resize(, 1).Font.Name = "MS Pゴシック"
    .Offset(, 9).Resize(, 1).Font.Size = 8
    .Offset(, 9).Resize(, 1).HorizontalAlignment = xlCenter
    .Offset(, 9).Resize(, 1).VerticalAlignment = xlCenter
  End With
  With p先手持駒
    .BorderAround LineStyle:=xlContinuous
    .Interior.Color = p将棋盤色.Interior.Color
    .Offset(, 0).Resize(, 1).Font.Name = "AR教科書体M"
    .Offset(, 0).Resize(, 1).Font.Size = 20
    .Offset(, 0).Resize(, 1).Font.Bold = True
    .Offset(, 0).Resize(, 1).HorizontalAlignment = xlCenter
    .Offset(, 1).Resize(, 1).Font.Name = "MS Pゴシック"
    .Offset(, 1).Resize(, 1).Font.Size = 11
    .Offset(, 1).Resize(, 1).Font.Bold = True
    .Offset(, 1).Resize(, 1).HorizontalAlignment = xlLeft
  End With
  With p後手持駒
    .BorderAround LineStyle:=xlContinuous
    .Interior.Color = p将棋盤色.Interior.Color
    .Offset(, 1).Resize(, 1).Font.Name = "@AR教科書体M"
    .Offset(, 1).Resize(, 1).Orientation = xlUpward
    .Offset(, 1).Resize(, 1).Font.Size = 20
    .Offset(, 1).Resize(, 1).Font.Bold = True
    .Offset(, 1).Resize(, 1).HorizontalAlignment = xlCenter
    .Offset(, 0).Resize(, 1).Font.Name = "MS Pゴシック"
    .Offset(, 0).Resize(, 1).Font.Size = 11
    .Offset(, 0).Resize(, 1).Font.Bold = True
    .Offset(, 0).Resize(, 1).HorizontalAlignment = xlRight
  End With
  With p先手消費時間
    .Offset(, -1).Resize(, 3).BorderAround LineStyle:=xlContinuous
    .Offset(, -1).Resize(, 3).Interior.Color = vbBlack
    .Offset(, -1).Resize(, 3).Font.Name = "MS Pゴシック"
    .Offset(, -1).Resize(, 3).Font.Size = 11
    .Offset(, -1).Resize(, 3).Font.Bold = True
    .Offset(, -1).Resize(, 3).Font.Color = vbWhite
    .HorizontalAlignment = xlCenter
    .NumberFormatLocal = "h:mm:ss"
  End With
  With p後手消費時間
    .Offset(, -1).Resize(, 3).BorderAround LineStyle:=xlContinuous
    .Offset(, -1).Resize(, 3).Interior.Color = vbWhite
    .Offset(, -1).Resize(, 3).Font.Name = "MS Pゴシック"
    .Offset(, -1).Resize(, 3).Font.Size = 11
    .Offset(, -1).Resize(, 3).Font.Bold = True
    .HorizontalAlignment = xlCenter
    .NumberFormatLocal = "h:mm:ss"
  End With
  With p手数
    .Resize(, 4).Borders.LineStyle = xlContinuous
    .Resize(, 4).Interior.Color = p駒選択色.Interior.Color
    .Resize(, 4).Font.Name = "MS Pゴシック"
    .Resize(, 4).Font.Size = 11
  End With

  '文字設定()
  p将棋盤.Offset(-1).Resize(1).Value = Array(9, 8, 7, 6, 5, 4, 3, 2, 1)
  p将棋盤.Offset(, 9).Resize(, 1).Value = WorksheetFunction.Transpose(Array("一", "二", "三", "四", "五", "六", "七", "八", "九"))
  p先手消費時間.Offset(, -1).Resize(, 1).Value = "先手"
  p後手消費時間.Offset(, -1).Resize(, 1).Value = "後手"
  p将棋盤色.Offset(, -2).Value = "将棋盤色"
  p駒選択色.Offset(, -2).Value = "駒選択色"
End Sub

将棋進行クラスVBAの解説

まだまた足らないのですが、結構なコード量になってしまいました。
ただし後半は、シート設定のVBAコードなのでだらだらと長くなっているだけです。
シート設定のVBAコードは、初回の Excel将棋:マクロVBAの学習用 から変更しています。
Excelで将棋を作ってみましょう。今やコンピューター将棋はプロをしのぐ強さです。しかし、Excelでそのようなソフトを作ろうと言うのではありません。と言いますか、残念ながら私には作れません、、、ExcelマクロVBAの学習素材として将棋を作ってみましょう。
プロシージャーをまとめたり、空行を削除したり、記述をクラスで使うように変更しています。

全体の構造としては、

・ゲーム開始が呼ばれる
・ブック・シートを選択してもらう(他ブックも可、ブック・シートは問いません)
・アクティブシートに名前定義"開始駒位置"が無い場合は、シートに名前定義および書式設定する。
・WithEvents xlApp As Excel.ApplicationにApplicationを設定
・駒を並べる(大橋流)

ここでマクロVBAは一旦終了します。

・セル選択で、SheetSelectionChangeが起動される
・駒選択を呼ぶ
・選択セルの該当位置から配列インデックスを求めcls駒のオブジェクトを特定
・cls駒のオブジェクトの駒移動可能位置を取得
・シートの該当セルの色を設定する

しっかり見て欲しいのは、WithEventsを使ったイベント処理です。
これを使う事で、シートモジュールにイベントを記述せずに済むようになっています。
SheetSelectionChangeは選択セルが動く必要があるので、イベントの中で盤外にアクティブセルを移動しています。

WithEvents、SheetSelectionChange

VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)
VBAクラスを使う事で、ユーザー定義イベントを作成したり、動的にイベントを割り当てる事が出来ます。ユーザー独自のイベントを作成したり、フォームに動的に追加したコントロールにイベントを設定することができます。EventステートメントとRaiseEventステートメントを使う事で、ユーザー定義イベントつまりユーザー独自のイベントを作成できます。
関連するものとしては、
イベントプロシージャーの共通化|ユーザーフォーム入門
ユーザーフォームに部品コントロールを配置していくとき、同種のコントロールを繰り返し何個も配置することは良くあります。コピペしながらようやく配置し終わったと思ったら、今度はVBAで同じイベントプロシージャーを何個も作成しなければならなくなります。
イベントプロシージャーの共通化(Enter,Exit)
ユーザーフォームのVBAでは、同じイベントプロシージャーを何個も作成することが多々あります。テキストボックスを複数個配置して同じイベント処理を実装する時、全く同じイベントプロシージャーをコピペで何個も作るといったことが必要になります。その解決方法として前回、第23回.イベントプロシージャーの共通化 WithEventを使った方法を紹介しましたが、

駒台クラス

オブジェクト変数の定義だけで、まだ何も実装しています。

※次回作成※

着手
最初のクリックで選択し、駒の移動可能位置のクリックで駒を移動します。
駒の選択状態の判定と次のクリックが移動可能な場所かを判定し、配列のオブジェクトを移動して、シートの表示も変更します。

※駒を取る機能と合わせて実装※

盤面表示の先手持駒と後手持駒
cls駒台の駒台一覧から持駒の種類と枚数の一覧を配列で受け取りシートに表示します。

将棋進行クラスの起動方法

標準モジュールに以下を作成します。

Option Explicit

Private obj将棋 As cls将棋進行

Sub ゲーム開始()
  Set obj将棋 = New cls将棋進行
  obj将棋.ゲーム開始
End Sub

シートにボタンを作ってマクロを登録するか、開発タブのマクロから起動してください。
ブック・シートはどれでも構いませんが、選択したシートは全て消去されるので注意下ください。

将棋盤クラスのテストVBAの結果

VBA マクロ 将棋 ゲーム

Excel将棋の目次

№1. Excel将棋:マクロVBAの学習用
Excelで将棋を作ってみましょう。今やコンピューター将棋はプロをしのぐ強さです。しかし、Excelでそのようなソフトを作ろうと言うのではありません。と言いますか、残念ながら私には作れません、、、ExcelマクロVBAの学習素材として将棋を作ってみましょう。
№2. Excel将棋:クラスの設計
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、VBAクラスの設計になります。設計といっても、どのようなプロパティ・メソッドをもたせるかといった概要だけです。
№3. Excel将棋:駒クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒クラスの作成になります。駒クラスに必要な部品クラスとして、位置クラスと移動クラスを先に作成してから駒クラスの作成に進みます。
№4. Excel将棋:駒クラスの単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の№3.Excel将棋:駒クラスの作成、この単体テストになります。駒クラスは、今後作成していく駒台クラス、将棋盤クラスで使用するものです。
№5. Excel将棋:駒台クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒台クラスの作成と単体テストになります。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№6. Excel将棋:位置クラスをデフォルトインスタンスに変更
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前に作った位置クラスをデフォルトインスタンスに変更します。作成するクラス全体の設計は、№2.Excel将棋:クラスの設計、こちらを参照してください。
№7. Excel将棋:将棋盤クラスの作成&単体テスト
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、いよいよ将棋盤クラスを作成します。駒クラスを2次元配列(1To9,1To9)に入れて将棋盤全体を管理します。
№8. Excel将棋:将棋進行クラスの作成
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、シートとやり取りする将棋進行クラスを作成します。ここまでは、作成したクラスのテスト実行用のVBAを別途作成し、結果をイミディエイトウィンドウに表示して確認していました。
№9. Excel将棋:駒を動かす
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を動かします。駒を動かせるように将棋進行クラスを拡張します。将棋進行クラスの完成はまだまだこれからですが、駒を動かせるようになるとゲームらしくなってきます。
№10. Excel将棋:相手の駒を取る、持ち駒を打つ
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、相手の駒を取ったり、持駒を打ったりできるようにします。取った駒は駒台へ移し、駒台から駒を選んで打てるようにします。
№11. Excel将棋:駒を成る
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、駒を成れるようにします。ただし、将棋では成らない選択も出来ますので、成れるタイミングで成るか成らないかを選択できるようにします。
№12. Excel将棋:棋譜をユーザーフォームに表示する
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、ユーザーフォームを作成し、初手からの棋譜を表示できるようにします。シート操作ができるように、ユーザーフォームはモードレスで表示します。
№13. Excel将棋:棋譜選択でその時点の盤面に戻す
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、棋譜フォームの棋譜を選択することで、その時点の盤面に戻す機能を実装します。さらに、その時点から指し継ぐこともできるようにします。
№14. Excel将棋:棋譜ファイルの出力と読込自動再生
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、KIF形式の棋譜ファイルの出力と、KIF形式の棋譜ファイルを読み込んで初手から終局までを自動再生させます。
№15. Excel将棋:反則(禁じ手)判定
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、反則(禁じ手)の判定を入れます。禁じ手は指し手そのものが出来ないようにします。※クラス名、プロシージャー名、変数名に日本語を使用しています。
№16. Excel将棋:終局(詰み)判定と打ち歩詰め
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、前回の反則(禁じ手)の続きで「打ち歩詰め」を実装します。打ち歩詰めを判定するには、そもそも「詰み」の判定が必要です。
№17. Excel将棋:千日手と連続王手の千日手
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。今回は、千日手と反則の「連続王手の千日手」を実装します。千日手は、他とは違ってある局面だけでは判定できません。
№18 Excel将棋:ひとまず完成、これまでとこれから
Excelで将棋を作ってみましょう。人vs人で動かしてゲームとして成立するところまでが当面の目標です。前回でひとまず当初目標の人vs人で動かしてゲームとして成立するところまでできました。連載の途中で、急遽棋譜の出力と読み込んで自動再生も作成しました。
№19 Excel将棋:棋譜ファイルから対局一覧作成
Excelで将棋を作るシリーズの当初目標の、人vs人で動かしてゲームとして成立するところまでは完成しました。今回は機能拡張として、棋譜ファイルを読み込み対局一覧を作成します。複数の棋譜ファイルも一度に処理できるようにしています。



新着記事NEW ・・・新着記事一覧を見る

import文(パッケージ・モジュールのインポート)|Python入門(9月24日)
例外処理(try文)とexception一覧|Python入門(9月23日)
リスト内包表記|Python入門(9月22日)
Pythonの引数は参照渡しだが・・・|Python入門(9月21日)
lambda(ラムダ式、無名関数)と三項演算子|Python入門(9月20日)
関数内関数(関数のネスト)とスコープ|Python入門(9月18日)
関数の定義(def文)と引数|Python入門(9月18日)
組み込み関数一覧|Python入門(9月17日)
辞書(dict型)|Python入門(9月16日)
入力規則への貼り付けを禁止する|VBA技術解説(9月16日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ