VBAサンプル集
Excel将棋:棋譜ファイルの出力と読込自動再生(№14)

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

Excel将棋:棋譜ファイルの出力と読込自動再生(№14)


VBA マクロ Excel将棋

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


今回は、KIF形式の棋譜ファイルの出力と、KIF形式の棋譜ファイルを読み込んで初手から終局までを自動再生させます。
自動再生した後は、前回までの機能で好きな場面に移動したり、そこから指し継いだりできるようにします。

棋譜のKIFでの出力及び読込ができるようになることで、
各種の将棋ソフトの棋譜を取り込んだり、Excel将棋で指した棋譜を他の将棋ソフトに入れることができるようになります。

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

Excel将棋の動作

現時点の動作です。

VBA マクロ Excel将棋

VBAの修正箇所について

棋譜フォームのボタン「棋譜読込」「棋譜出力」についての機能追加になります。
これに伴い、以下のプロシージャーを修正しました。

cls将棋進行

Public Sub 自動着手
新規追加のプロシージャー

Public Sub 自動着手(ByVal arg駒 As String, _
          ByVal arg元位置 As g位置, _
          ByVal arg先位置 As g位置, _
          ByVal arg成 As String, _
          ByVal arg時間1手 As Date, _
          ByVal arg時間累計 As Date, _
          Optional ByVal argWait As Long = 100)
  Dim rng元 As Range
  Dim rng先 As Range
  
  If arg元位置.行 = 0 Then
    If obj将棋盤.先手 Then
      Set rng元 = p先手持駒.Find(arg駒)
    Else
      Set rng元 = p後手持駒.Find(arg駒)
    End If
  Else
    Set rng元 = p将棋盤.Cells(arg元位置.行, arg元位置.列)
  End If
  Set rng先 = p将棋盤.Cells(arg先位置.行, arg先位置.列)
  
  Call 着手(rng元, rng先, arg成, arg時間1手, arg時間累計)
  Sleep argWait
End Sub

Public Sub 着手
引数追加:arg成, arg時間1手, arg時間累計
この引数はcls将棋盤.着手に渡します。

Public Sub 着手(ByVal arg元選択 As Range, _
        ByVal arg先選択 As Range, _
        Optional ByVal arg成 As Variant, _
        Optional ByVal arg時間1手 As Date, _
        Optional ByVal arg時間累計 As Date)

  '着手してシートを更新
  Dim tmp駒台 As cls駒台
  Set tmp駒台 = IIf(obj将棋盤.先手, obj先手駒台, obj後手駒台)
  If arg先選択.Value <> "" Then
    '駒台へ
    Call tmp駒台.駒追加(obj将棋盤.駒(セル2位置(arg先選択)))
    '盤から削除
    Call obj将棋盤.着手(arg先選択.Value, セル2位置(arg先選択), g位置(0, 0), _
              obj将棋盤.先手, arg成, arg時間1手, arg時間累計)
  End If
  If 選択場所(arg元選択) = 将棋盤 Then
    '盤上で駒移動
    Call obj将棋盤.着手(arg元選択.Value, セル2位置(arg元選択), セル2位置(arg先選択), _
              obj将棋盤.先手, arg成, arg時間1手, arg時間累計)
  Else
    '盤上へ駒を打つ
    Call obj将棋盤.着手(arg元選択.Value, g位置(0, 0), セル2位置(arg先選択), _
              obj将棋盤.先手, arg成, arg時間1手, arg時間累計)
    '駒台から削除
    Call tmp駒台.駒削除(arg元選択.Value)
  End If
  
  '駒台の履歴作成
  Call obj先手駒台.履歴追加
  Call obj後手駒台.履歴追加
  
  'シートの表示
  Call 盤面表示
  Call 選択セルを手番に移動
  Call frm棋譜.棋譜表示(obj将棋盤.棋譜履歴, obj将棋盤.開始時刻, obj将棋盤.最終時刻)
End Sub

変数のxlAppとApplicationの使い方を統一
Public Property Get Application() As Excel.Application
  Set Application = xlApp
End Property


Public Sub ゲーム開始(Optional ByVal arg手合い As String, _
           Optional ByVal arg大橋流 As Boolean)
  '標準モジュールから呼ばれた場合、フォームが表示されていたらは処理しない
  If arg手合い = "" Then
    If frm棋譜.Visible Then Exit Sub
  End If
  
  'シート選択
  Dim flgNew As Boolean
  On Error Resume Next
  Set p開始位置 = ActiveSheet.Range("開始駒位置")
  If Err Then
    Err.Clear
    Set p開始位置 = Excel.Application.InputBox( _
            prompt:="将棋盤を作成するシートの作成開始左上をクリックしてください。" & vbLf & _
            "※シートは全消去されます。", _
            Title:="作成シート選択", _
            Type:=8)
    If Err Then Exit Sub
    flgNew = True
  Else
    flgNew = False
  End If
  On Error GoTo 0
  
  Set pWs = p開始位置.Worksheet
  Set xlApp = p開始位置.Application
  xlApp.Goto p開始位置
  xlApp.Cursor = xlWait
  xlApp.ScreenUpdating = False
  xlApp.EnableEvents = False

  
  If flgNew Then
    '新規シート
    pWs.Cells.Clear
    ActiveWindow.DisplayGridlines = False
    pWs.Names.Add Name:="開始駒位置", RefersToLocal:=p開始位置
    Call シート名前定義
    Call シート書式設定
  Else
    '既存シート
    Call シート名前定義
    Call シート消去
  End If
  
  Call Class_Initialize
  
  xlApp.ScreenUpdating = True
  Call 駒配置(arg手合い, arg大橋流)
  xlApp.Cursor = xlDefault
  
  With frm棋譜
    If .Visible = False Then .Show vbModeless
    Set .Parent = Me
  End With
  
  xlApp.Goto p先手時間.Offset(, -1)
  xlApp.EnableEvents = True
End Sub

cls将棋盤

Public Sub 着手
引数追加:arg成, arg時間1手, arg時間累計
「成り」判定(MsgBoxで確認)をせずに、引数のarg成を使用する。
この引数はobj棋譜.棋譜作成に渡します。

Public Sub 着手(ByVal arg駒名 As String, _
        ByVal arg元位置 As g位置, _
        ByVal arg先位置 As g位置, _
        ByVal arg先手 As Boolean, _
        Optional ByVal arg成 As Variant, _
        Optional ByVal arg時間1手 As Date, _
        Optional ByVal arg時間累計 As Date)

  '元位置:-1,-1は初期配置
  '位置:0,0は駒台の出し入れ
  Dim obj駒 As cls駒
  Dim is成り As Boolean
  Select Case True
    Case arg元位置 Is Nothing '初期配置
      Set obj駒 = New cls駒
      Set Me.駒(arg先位置) = obj駒.駒作成(arg駒名, arg先手, arg先位置)
      '棋譜は不要
      Exit Sub
    Case arg先位置.行 = 0 '駒台へ
      Set Me.駒(arg元位置) = Nothing
      '棋譜は不要
      Exit Sub
    Case arg元位置.行 = 0 '駒台から
      Set obj駒 = New cls駒
      Set Me.駒(arg先位置) = obj駒.駒作成(arg駒名, arg先手, arg先位置)
    Case Else '駒移動
      Set Me.駒(arg先位置) = Me.駒(arg元位置).Clone
      Set Me.駒(arg先位置).駒位置 = arg先位置
      '「is成り」はByRefで今回成ったかの情報が戻される
      If IsEmpty(arg成) Or IsMissing(arg成) Then
        Me.駒(arg先位置).成り = 成り判定(arg元位置, arg先位置, is成り)
      ElseIf arg成 = "成" Then
        Me.駒(arg先位置).成り = True
        is成り = True
      End If

      Set Me.駒(arg元位置) = Nothing
  End Select
  
  '棋譜履歴
  If arg元位置.行 = 0 Then
    Call obj棋譜.棋譜作成(g位置(0, 0), Me.駒(arg先位置), False, _
               arg時間1手, arg時間累計)
  Else
    Call obj棋譜.棋譜作成(arg元位置, Me.駒(arg先位置), is成り, _
               arg時間1手, arg時間累計)
  End If
  
  '盤面履歴
  Call 盤面履歴手数戻し
  pCol盤面.Add pAry駒
  
  Call 手番交代
End Sub

cls棋譜

棋譜作成
引数追加:arg時間1手, arg時間累計
棋譜作成時に時間を計測せずに、引数の時間を使用します。

'棋譜はKIF形式で作成
'###1 5ニ銀成(43) (mm:ss/hh:mm:ss)
Public Function 棋譜作成(ByVal arg元位置 As g位置, _
             ByVal arg駒先 As cls駒, _
             ByRef arg成り As Boolean, _
             Optional ByVal arg時間1手 As Date, _
             Optional ByVal arg時間累計 As Date
) As String
  Dim ary(1 To 15) As String
  Dim n4 As String * 3
  RSet n4 = Format(Me.手数 + 1, "0")
  ary(1) = n4
  ary(2) = " "
  ary(3) = IIf(p手数 Mod 2, "△", "▲") & StrConv(10 - arg駒先.駒位置.列, vbWide)
  ary(4) = WorksheetFunction.Text(arg駒先.駒位置.行, "[DBNum1]0")
  ary(5) = IIf(arg成り, arg駒先.通常名称, arg駒先.表示名称)
  If arg元位置.行 = 0 Then
    ary(6) = "打"
    ary(7) = ""
    ary(8) = ""
    ary(9) = ""
    ary(10) = "  "
  Else
    ary(6) = IIf(arg成り, "成", "")
    ary(7) = "("
    ary(8) = 10 - arg元位置.列
    ary(9) = arg元位置.行
    ary(10) = ")" & IIf(ary(6) = "", " ", "")
  End If
  ary(11) = " ("
  If arg時間累計 = 0 Then
    ary(12) = Format(Now() - p最終時刻, "h:mm:ss")
    ary(13) = "/"
    If Me.先手 Then
      p先手時間 = Format(p先手時間 + CDate(ary(12)), "h:mm:ss")
      ary(14) = Format(p先手時間, "h:mm:ss")
    Else
      p後手時間 = Format(p後手時間 + CDate(ary(12)), "h:mm:ss")
      ary(14) = Format(p後手時間, "h:mm:ss")
    End If
  Else
    ary(12) = Format(arg時間1手, "h:mm:ss")
    ary(13) = "/"
    ary(14) = Format(arg時間累計, "h:mm:ss")
  End If
  ary(12) = WorksheetFunction.Text(CDate(ary(12)), "[m]:ss")
    If ary(12) = "0:00" Then ary(12) = "0:01"
    If Len(ary(12)) = 4 Then ary(12) = " " & ary(12)
  ary(15) = ")"
  
  '棋譜履歴
  Call 棋譜履歴手数戻し
  pCol棋譜.Add Join(ary, "")
  p最終時刻 = Now()
End Function

frm棋譜:ユーザーフォーム

棋譜出力
'拡張子".kif"のShift-JISで出力
Private Sub btn棋譜出力_Click()
  If Me.lst棋譜.ListCount = 0 Then Exit Sub
  
  '保存ファイル選択
  Dim vFile As Variant
  vFile = Me.Parent.Application.GetSaveAsFilename( _
      InitialFileName:=ThisWorkbook.Path & "\ExcelShogi.kif", _
      FileFilter:="KIFファイル,*.kif")
  If vFile = False Then
    Exit Sub
  End If
  
  'KIFファイル保存
  Dim i As Long
  Dim intFree As Integer
  intFree = FreeFile
  Open vFile For Output As #intFree
  Print #1, "# --- Excel将棋 V1.0.0 棋譜ファイル ---"
  Print #1, "開始日時:" & Format(p開始時刻, "yyyy/mm/dd(aaa) hh:mm:ss")
  Print #1, "終了日時:" & Format(p最終時刻, "yyyy/mm/dd(aaa) hh:mm:ss")
  Print #1, "手合割:" & Me.cmb手合割
  Print #1, "先手:" & Me.txt先手.Value
  Print #1, "後手:" & Me.txt後手.Value
  Print #1, "手数----指手---------消費時間--"
  For i = 0 To Me.lst棋譜.ListCount - 1
    Print #intFree, Replace(Replace(Me.lst棋譜.List(i), "▲", ""), "△", "")
  Next
  Close intFree
  
  MsgBox "KIFファイルを出力しました。" & vbLf & vbLf & vFile
End Sub

棋譜読込自動再生

Private Type tKif
  手数 As Integer
  筋 As Integer
  段 As Integer
  駒 As String
  成 As String
  元筋 As Integer
  元段 As Integer
  時間1手 As Date
  時間累計 As Date
End Type

'拡張子".kif"のShift-JISのみ対応
Private Sub btn棋譜読込_Click()
  '保存ファイル選択
  Dim vFile As Variant
  vFile = Me.Parent.Application.GetOpenFilename(FileFilter:="KIFファイル,*.kif")
  If vFile = False Then
    Exit Sub
  End If
  
  'KIFファイルを読み込んで配列に
  Dim aryKif() As String
  aryKif = readKif(vFile)
  
  If Not KIF棋譜読込(aryKif) Then
    MsgBox "指定されたKIFファイルは処理できませんでした。"
  End If
End Sub

'KIF形式ファイルからの棋譜の配列を読み盤面を再現する
Public Function KIF棋譜読込(ByRef aryKif() As String) As Boolean
  Dim ary棋譜() As tKif
  Dim s手合割 As String, s先手 As String, s後手 As String
  Dim sSplit() As String
  Dim i As Long, j As Long
  
  j = 1
  For i = LBound(aryKif) To UBound(aryKif)
    Select Case True
      Case Left(aryKif(i), 1) = "#", Left(aryKif(i), 1) = "*"
        'コメント
      Case Left(aryKif(i), 3) = "先手:"
        s先手 = Trim(Mid(aryKif(i), 4))
      Case Left(aryKif(i), 3) = "後手:"
        s後手 = Trim(Mid(aryKif(i), 4))
      Case Left(aryKif(i), 4) = "手合割:"
        s手合割 = Trim(Mid(aryKif(i), 5))
      Case InStr(aryKif(i), " ") = 0
        '無視
      Case Else
        sSplit = Split(Trim(aryKif(i)), " ")
        If IsNumeric(sSplit(0)) Then
          ReDim Preserve ary棋譜(1 To j)
          ary棋譜(j) = parseKif(aryKif(i))
          If ary棋譜(j).手数 < 0 Then
            KIF棋譜読込 = False
            Exit Function
          End If
          j = j + 1
        End If
    End Select
  Next
  
  Me.txt先手.Value = s先手
  Me.txt後手.Value = s後手
  Me.cmb手合割.Value = s手合割
  
  Call Me.Parent.ゲーム開始(s手合割, False)
  Call KIF棋譜再現(ary棋譜)
  
  KIF棋譜読込 = True
End Function

Private Sub KIF棋譜再現(ByRef ary棋譜() As tKif)
  On Error GoTo ErrExit
  Dim i先行 As Integer, i元行 As Integer
  Dim i先列 As Integer, i元列 As Integer
  Dim 先位置 As g位置, 元位置 As g位置
  Dim i As Long
  
  Application.Cursor = xlWait
  Call ControlsEnable(False) '全コントロールを使用不可
  
  For i = LBound(ary棋譜) To UBound(ary棋譜)
    If ary棋譜(i).駒 <> "" And ary棋譜(i).筋 > 0 Then
      Set 先位置 = Me.Parent.棋譜位置(ary棋譜(i).筋, ary棋譜(i).段)
      Set 元位置 = Me.Parent.棋譜位置(ary棋譜(i).元筋, ary棋譜(i).元段)
      Call Me.Parent.自動着手(ary棋譜(i).駒, _
                  元位置, 先位置, ary棋譜(i).成, _
                  ary棋譜(i).時間1手, ary棋譜(i).時間累計, _
                  50) '最後は再生スピード(ミリセカンド)
      If Me.lst棋譜.ListCount <> i Then
        Stop 'KIF解析不足なので確認用
      End If
    Else
      Me.lst棋譜.AddItem Right("  " & ary棋譜(i).手数, 3) & " " & ary棋譜(i).駒
      Me.lst棋譜.ListIndex = Me.lst棋譜.ListCount - 1
      Me.Caption = ary棋譜(i).駒
    End If
  Next
  
  Call ControlsEnable(True) '全コントロールを使用可
  Application.Cursor = xlDefault
  Exit Sub
  
ErrExit:
  MsgBox "棋譜の再現に失敗しました。"
End Sub

Private Function parseKif(ByVal argKif As String) As tKif
  On Error GoTo ErrExit
  Const cns漢数字 = "一二三四五六七八九"
  Dim sSplit() As String
  argKif = Replace(argKif, "(", " ")
  argKif = Replace(argKif, ")", " ")
  argKif = Replace(argKif, "/", " ")
  argKif = WorksheetFunction.Trim(argKif)
  sSplit = Split(argKif, " ")
  
  parseKif.手数 = sSplit(0)
  If Not IsNumeric(sSplit(0)) Or _
    Left(sSplit(1), 1) < "1" Or Left(sSplit(1), 1) > "9" Then
    parseKif.駒 = sSplit(1)
    Exit Function
  End If
  
  parseKif.筋 = StrConv(Left(sSplit(1), 1), vbNarrow)
  parseKif.段 = InStr(cns漢数字, Mid(sSplit(1), 2, 1))
  If Mid(sSplit(1), 3, 1) = "成" Then
    parseKif.駒 = Mid(sSplit(1), 4, 1)
  Else
    parseKif.駒 = Mid(sSplit(1), 3, 1)
  End If
  If Right(sSplit(1), 1) = "成" Then
    parseKif.成 = "成"
  End If
  
  Select Case UBound(sSplit)
    Case 3
      parseKif.時間1手 = mmss2hhmmss(sSplit(2))
      parseKif.時間累計 = CDate(sSplit(3))
    Case Is >= 4
      parseKif.元筋 = Left(sSplit(2), 1)
      parseKif.元段 = Right(sSplit(2), 1)
      parseKif.時間1手 = mmss2hhmmss(sSplit(3))
      parseKif.時間累計 = CDate(sSplit(4))
    Case Else
      parseKif.手数 = -1
      Exit Function
  End Select
  Exit Function
  
ErrExit:
  parseKif.手数 = -1
End Function

Private Function mmss2hhmmss(ByVal mmss As String) As Date
  If Len(mmss) = Len(Replace(mmss, ":", "")) + 1 Then
    mmss = "0:" & mmss
  End If
  If IsDate(mmss) Then
    mmss2hhmmss = CDate(mmss)
  Else
    mmss2hhmmss = 0
  End If
End Function

Private Function readKif(ByVal argFile As String, _
             Optional ByVal CharSet As String = "SHIFT-JIS") As String()
  Dim strRec As String
  Dim aryRec() As String
  
  'SHIFT-JISで読んで"先手:"が無ければUTF-8で読み直す
  strRec = readStream(argFile, CharSet)
  If UCase(CharSet) = "SHIFT-JIS" And InStr(strRec, "先手:") = 0 Then
    strRec = readStream(argFile, "UTF-8")
  End If
  
  readKif = Split(Replace(strRec, vbCrLf, vbLf), vbLf)
End Function

Private Function readStream(ByVal argFile As String, _
              ByVal CharSet As String) As String
  With CreateObject("ADODB.Stream")
    .CharSet = CharSet
    .Open
    .LoadFromFile argFile
    readStream = .ReadText
    .Close
  End With
End Function

'Me.Enabledでは、VBA終了時にフォームが戻らない場合があったので対応
Private Sub ControlsEnable(ByVal argEnabled As Boolean)
  Dim ctl As Control
  For Each ctl In Me.Controls
    ctl.Enabled = argEnabled
  Next
End Sub

棋譜リストのクリック

Private Sub lst棋譜_Change()
  If EventStop Then Exit Sub
  
  '詰み、投了
  If Me.lst棋譜.ListIndex > 0 Then
    If Len(Me.lst棋譜.List(Me.lst棋譜.ListIndex)) < 10 Then
      Call Me.Parent.特定局面再現(Me.lst棋譜.ListIndex)
      Me.Caption = Me.lst棋譜.List(Me.lst棋譜.ListIndex)
      Exit Sub
    End If
  End If
  
  '指定手数の局面を再現
  Call Me.Parent.特定局面再現(Me.lst棋譜.ListIndex + 1)
  Call 先手後手表示
End Sub

Excel将棋のダウンロード

ここまでのVBAコードを組み込んだExcelファイルは以下からダウンロード出来ます。

エクセルのサンプルダウンロード

棋譜KIFファイルのサンプル

先手:
後手:
開始日時:2020/07/28 00:47:26
棋戦:
持ち時間:10分
手合割:平手
手数----指手---------消費時間--
   1 5六歩(57)   (00:01/00:00:01)
   2 8四歩(83)   (00:04/00:00:04)
*△備考:居飛車
   3 5八飛(28)   (00:02/00:00:03)
*▲備考:振り飛車
   4 8五歩(84)   (00:00/00:00:04)
   5 7八金(69)   (00:01/00:00:04)
   6 3四歩(33)   (00:11/00:00:15)
   7 6八銀(79)   (00:01/00:00:05)
   8 6二銀(71)   (00:05/00:00:20)
   9 5七銀(68)   (00:02/00:00:07)
  10 4二玉(51)   (00:01/00:00:21)
  11 4六銀(57)   (00:05/00:00:12)
  12 3二銀(31)   (00:04/00:00:25)
  13 4五銀(46)   (00:04/00:00:16)
  14 3三銀(32)   (00:01/00:00:26)
  15 5五歩(56)   (00:02/00:00:18)
*▲戦型:原始中飛車
  16 4四歩(43)   (00:11/00:00:37)
  17 5六銀(45)   (00:01/00:00:19)
  18 1四歩(13)   (00:11/00:00:48)
  19 7九角(88)   (00:02/00:00:21)
  20 6四歩(63)   (00:05/00:00:53)
  21 4八玉(59)   (00:03/00:00:24)
  22 1五歩(14)   (00:03/00:00:56)
  23 3八玉(48)   (00:03/00:00:27)
  24 7四歩(73)   (00:06/00:01:02)
  25 2八玉(38)   (00:02/00:00:29)
  26 7三桂(81)   (00:01/00:01:03)
  27 7六歩(77)   (00:06/00:00:35)
  28 8六歩(85)   (00:20/00:01:23)
  29 8六歩(87)   (00:02/00:00:37)
  30 8六飛(82)   (00:02/00:01:25)
  31 8七歩打     (00:01/00:00:38)
  32 7六飛(86)   (00:11/00:01:36)
  33 6六歩(67)   (00:02/00:00:40)
  34 7五飛(76)   (00:10/00:01:46)
  35 9六歩(97)   (00:01/00:00:41)
  36 8五飛(75)   (00:03/00:01:49)
  37 7七桂(89)   (00:09/00:00:50)
  38 8四飛(85)   (00:15/00:02:04)
  39 9七角(79)   (00:02/00:00:52)
  40 6三銀(62)   (00:03/00:02:07)
  41 6五歩(66)   (00:01/00:00:53)
  42 7五歩(74)   (00:25/00:02:32)
  43 7五角(97)   (00:02/00:00:55)
  44 7四飛(84)   (00:06/00:02:38)
  45 8六角(75)   (00:01/00:00:56)
  46 7六歩打     (00:09/00:02:47)
  47 7五歩打     (00:05/00:01:01)
  48 8四飛(74)   (00:04/00:02:51)
  49 9五角(86)   (00:02/00:01:03)
  50 8三飛(84)   (00:07/00:02:58)
  51 6四歩(65)   (00:01/00:01:04)
  52 5二銀(63)   (00:21/00:03:19)
  53 7四歩(75)   (00:02/00:01:06)
  54 7七歩成(76) (00:15/00:03:34)
  55 7三歩成(74) (00:02/00:01:08)
  56 6六桂打     (00:18/00:03:52)
*△手筋:ふんどしの桂
  57 3八飛(58)   (00:13/00:01:21)
  58 7八と(77)   (00:37/00:04:29)
  59 8三と(73)   (00:01/00:01:22)
  60 5七金打     (00:04/00:04:33)
  61 6三歩成(64) (00:02/00:01:24)
  62 5六金(57)   (00:04/00:04:37)
  63 5二と(63)   (00:02/00:01:26)
  64 5二金(61)   (00:00/00:04:37)
  65 6四桂打     (00:01/00:01:27)
  66 6三銀打     (00:26/00:05:03)
*△手筋:桂頭の銀
  67 5二桂成(64) (00:11/00:01:38)
  68 5二銀(63)   (00:02/00:05:05)
  69 8二飛打     (00:01/00:01:39)
  70 4七金(56)   (00:08/00:05:13)
  71 6三銀打     (00:02/00:01:41)
  72 4六桂打     (00:10/00:05:23)
  73 5二銀成(63) (00:01/00:01:42)
  74 5二金(41)   (00:01/00:05:24)
  75 4三歩打     (00:01/00:01:43)
  76 4三玉(42)   (00:06/00:05:30)
  77 3二銀打     (00:05/00:01:48)
  78 3二玉(43)   (00:18/00:05:48)
  79 5二飛成(82) (00:01/00:01:49)
  80 4二銀打     (00:08/00:05:56)
  81 4三金打     (00:02/00:01:51)
  82 3一玉(32)   (00:01/00:05:57)
  83 4二金(43)   (00:01/00:01:52)
  84 4二銀(33)   (00:02/00:05:59)
  85 4一金打     (00:01/00:01:53)
  86 3二玉(31)   (00:04/00:06:03)
  87 4二龍(52)   (00:04/00:01:57)
  88 詰み
まで87手で先手の勝ち

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」をお願いいたします。
本文下部へ