Skip to content

Instantly share code, notes, and snippets.

@p-nix
Created January 26, 2012 10:07
Show Gist options
  • Save p-nix/1682065 to your computer and use it in GitHub Desktop.
Save p-nix/1682065 to your computer and use it in GitHub Desktop.
将棋の棋譜をチャート形式で表示する
# encoding: utf-8
# coding: utf-8
# 棋譜ファイルをチャート形式で表示する
# 一手分を登録するクラス枝分かれして連なる
class KifuNode
attr_accessor :step # 手数
attr_accessor :parent # 親のオブジェクト
attr_accessor :next # 次の手 配列として登録
attr_accessor :te # 手の内容
attr_accessor :comment #コメント
def initialize(a)
@te = a # 手の内容
self.step = 0
@next = [] # 次の手。KifuNode クラスの配列
end
#手を追加する。追加したオブジェクトを返す
def add(b)
@next << b
b.parent = self
b.step = @step + 1
return b
end
#指定した手数のオブジェクトを返す
def search(n)
if n > step
#指定した手数が現在の手数より大きければ不正な値なので終了
return nil
elsif n == step
return self
else
#親をたどる
return parent.search(n)
end
end
end
#棋譜ファイルを読み込んで整形
file = File.open("C:/temp/test.kif", "r:Windows-31J:UTF-8")
nowKifuNode = KifuNode.new("") # ダミーで開始分のオブジェクト作成
kifuNodeList = nowKifuNode
file.each_line do |line|
line.chomp!
# 書式: 1 7六歩(77) ( 0:00/00:00:00)+
case line
when /[\d]+(.*)\(.*\(/ then
obj = KifuNode.new(line.slice(/[\d]+(.*)\(.*\(/, 1).strip)
nowKifuNode = nowKifuNode.add(obj)
#駒を打った場合。前の位置を示す領域がない
when /[\d]+(.*)\(/ then
obj = KifuNode.new(line.slice(/[\d]+(.*)\(/, 1).strip)
nowKifuNode = nowKifuNode.add(obj)
# 「変化:○○手」
when /変化:/ then
nowCnt = line.slice(/変化:(\d+)手/, 1)
nowKifuNode = nowKifuNode.search(nowCnt.to_i - 1)
# コメント
when /^\*/ then
nowKifuNode.comment = line.slice(/^\*(.*)/, 1)
else
end
end
file.close
#結果表示
def makeGraph(obj, level = 0)
#表示
if (obj.step != 0)
if (obj.step % 2) == 0
print "△#{obj.te}"
else
print "▲#{obj.te}"
end
end
obj.next.each_with_index do |x, idx|
if obj.next.count > 1
print "\r\n"
print "  " * level
if idx == obj.next.count - 1
print "└"
else
print "├"
end
serial = 0
makeGraph(x, level + 1)
else
makeGraph(x, level)
end
end
end
makeGraph(kifuNodeList)
#KIF version=2.0 encoding=Shift_JIS
# ---- Kifu for Windows V7 V7.01 棋譜ファイル ----
開始日時:2011/12/28 16:46:26
手合割:平手  
先手:
後手:
手数----指手---------消費時間--
1 7六歩(77) ( 0:00/00:00:00)
2 3四歩(33) ( 0:00/00:00:00)
3 2六歩(27) ( 0:00/00:00:00)
4 5四歩(53) ( 0:00/00:00:00)
5 2五歩(26) ( 0:00/00:00:00)
6 5二飛(82) ( 0:00/00:00:00)
*基本図
7 5八金(49) ( 0:00/00:00:00)
8 5五歩(54) ( 0:00/00:00:00)
9 2四歩(25) ( 0:00/00:00:00)
10 同 歩(23) ( 0:00/00:00:00)
11 同 飛(28) ( 0:00/00:00:00)
12 5六歩(55) ( 0:00/00:00:00)
13 同 歩(57) ( 0:00/00:00:00)
14 8八角成(22) ( 0:00/00:00:00)
15 同 銀(79) ( 0:00/00:00:00)
16 3三角打 ( 0:00/00:00:00)
17 2一飛成(24) ( 0:00/00:00:00)
18 8八角成(33) ( 0:00/00:00:00)
19 5五桂打 ( 0:00/00:00:00)
20 6二玉(51) ( 0:00/00:00:00)
21 1一龍(21) ( 0:00/00:00:00)
22 9九馬(88) ( 0:00/00:00:00)+
23 6六香打 ( 0:00/00:00:00)
*この香車が手ごわい
24 5四銀打 ( 0:00/00:00:00)+
25 2二歩打 ( 0:00/00:00:00)
*と金作りを見せながら、△9九馬の効きを止める。
26 5五銀(54) ( 0:00/00:00:00)+
*疑問手
27 同 歩(56) ( 0:00/00:00:00)
28 同 飛(52) ( 0:00/00:00:00)
29 4六銀打 ( 0:00/00:00:00)
*先手十分
変化:26手
26 同 飛(52) ( 0:00/00:00:00)
*疑問手
27 同 龍(11) ( 0:00/00:00:00)
28 同 銀(31) ( 0:00/00:00:00)
29 3六角打 ( 0:00/00:00:00)
*先手優勢。6三の地点を守りきれない
変化:24手
24 7二銀(71) ( 0:00/00:00:00)
*疑問手
25 8二角打 ( 0:00/00:00:00)
*次に香車を取って先手優勢
変化:22手
22 8九馬(88) ( 0:00/00:00:00)
23 4三桂成(55) ( 0:00/00:00:00)+
*角道がそれたので
24 5六飛(52) ( 0:00/00:00:00)
25 5七香打 ( 0:00/00:00:00)
26 同 飛成(56) ( 0:00/00:00:00)
27 同 金(58) ( 0:00/00:00:00)
28 5六歩打 ( 0:00/00:00:00)
29 5八金(57) ( 0:00/00:00:00)
30 5七香打 ( 0:00/00:00:00)
31 5三角打 ( 0:00/00:00:00)
32 7二玉(62) ( 0:00/00:00:00)
33 3一角成(53) ( 0:00/00:00:00)
34 6七馬(89) ( 0:00/00:00:00)
*詰めろではない
35 4一馬(31) ( 0:00/00:00:00)
36 5八香成(57) ( 0:00/00:00:00)
37 同 金(69) ( 0:00/00:00:00)
38 5七歩成(56) ( 0:00/00:00:00)
*先手玉受けなしだが
39 6三馬(41) ( 0:00/00:00:00)
40 8二玉(72) ( 0:00/00:00:00)
41 7二金打 ( 0:00/00:00:00)
*先手勝ち
42 9二玉(82) ( 0:00/00:00:00)
43 8二飛打 ( 0:00/00:00:00)
44 同 銀(71) ( 0:00/00:00:00)
45 同 金(72) ( 0:00/00:00:00)
46 同 玉(92) ( 0:00/00:00:00)
47 7一銀打 ( 0:00/00:00:00)
48 同 金(61) ( 0:00/00:00:00)
49 同 龍(11) ( 0:00/00:00:00)
50 同 玉(82) ( 0:00/00:00:00)
51 7二金打 ( 0:00/00:00:00)
変化:23手
23 6六香打 ( 0:00/00:00:00)
*この香車が成立するようでは△8九馬とした意味がない
24 5一桂打 ( 0:00/00:00:00)
*これで受けきれる
@p-nix
Copy link
Author

p-nix commented Jan 26, 2012

動作環境
 ruby 1.9.2p290 (2011-07-09) [i386-mingw32]
 で動作確認。1.9.3は改行コード怪しいので使わないほうがよい(改行がCRLFではなくLFになる)。1.8.xだとおそらく動作しない。

実行の仕方

  1. ダウンロードして解凍、またはソースコードをコピーしてUTF-8形式(BOMなし)で保存。ファイル名はkifviz.rbとする。
     ※ダウンロードする場合はファイル形式がtar.gzなのでWinowsでは7-Zipを使うと解凍できた。(tar.gz→tar→と2回解凍しないといけない) ダウンロードしたファイル(gist○○.tar.gz ファイルを直接 kifviz.rbと名前変更しても動かない。解凍しましょう)
     保存先は日本語フォルダがあると面倒なので英語フォルダの下に置くのが楽。Cドライブにtempフォルダを作ってそこに置こう。
    エクスプローラーからCドライブの下に temp フォルダを新規作成。tempフォルダの中にkifviz.rbを置く。
  2. コマンドプロンプトを起動する。
     スタートメニュー → すべてのプログラム → アクセサリ → コマンドプロンプト
     でコマンドプロンプト(黒い画面)が立ち上がる。
  3. tempフォルダに移動する
     コマンドプロンプトで cd \temp [Enter]
     と入力。(「\」は円マーク。キーボード右上のやつ。[Enter]はEnteキーのこと)「C:\temp>」 と表示された?
  4. kifviz.rbがあるか確認
     コマンドプロンプトで dir [Enter]
     そのフォルダにあるファイルが列挙される。kifviz.rb があればOK。
  5. プログラムの実行
     コマンドプロンプトから ruby kifviz.rb > out.txt
     で out.txt に結果が保存されます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment