将棋ウォーズで遊ぶ -2ページ目

将棋ウォーズで遊ぶ

将棋ウォーズの棋譜を解析する

将棋クラブ24でも少し指しているのですが,自分の棋譜を後から振り返りたいときがありますよね.
将棋クラブ24には,自分の棋譜の一括ダウンロードできる機能がありますが,
実際はリンクのリストが表示されてだけなので,自分でダウンローダーに追加してやらないといけなくて面倒です.
そこで,もっと手軽に棋譜をダウンロードしたいので,pythonでスクリプトを書きました.
python3がインストールしてあれば,一番下の main("my_username", "password") のとこを
ユーザー名とパスワードを適当なものに書きかえて実行すれば,.\kifu フォルダに自動で保存していきます.
python2だとurllibが多分違うので,動かないと思います.

import re, sys, os, time import urllib import http import http.cookiejar import html.parser class MyHTMLParser(html.parser.HTMLParser): def __init__(self): self.links = [] self.anchor = None html.parser.HTMLParser.__init__(self) def handle_starttag(self, tag, attrs): if tag == "a": self.anchor = dict(attrs)["href"] def handle_data(self, data): if self.anchor: self.links.append((data, self.anchor)) def handle_endtag(self, tag): if tag == "a": self.anchor = None class KifuFetcher: def __init__(self, name, pwd): self.name = name self.pwd = pwd self.cj = http.cookiejar.CookieJar() self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cj)) def login(self): url = "http://web.shogidojo.net/kifu/srv/login" params = urllib.parse.urlencode({"name": self.name, "pwd": self.pwd}) res = self.opener.open("%s?%s" % (url, params)) #print(res.status, res.reason) data = res.read() def search(self): url = "http://web.shogidojo.net/kifu/srv/search" one_day = 24 * 60 * 60 from_date = time.strftime("%Y-%m-%d", time.localtime(time.time() - 90 * one_day)) to_date = time.strftime("%Y-%m-%d", time.localtime(time.time() + one_day)) params = urllib.parse.urlencode({"from_date": from_date, "to_date": to_date, "linkchar": "on", "submit": "検索"}) res = self.opener.open("%s?%s" % (url, params)) #print(res.status, res.reason) data = res.read() #print(data.decode(encoding="utf-8")) parser = MyHTMLParser() parser.feed(data.decode(encoding="utf-8")) return parser.links def get(self, url): res = self.opener.open(url) # print(url, res.status, res.reason) data = res.read() return data.decode(encoding="shift-jis") def main(name, pwd, save_dir="kifu"): kf = KifuFetcher(name, pwd) kf.login() if not os.path.exists(save_dir): os.makedirs(save_dir) for i, (id, url) in enumerate(kf.search()): path = "%s/%s.kif" % (save_dir, id) if os.path.exists(path): print("skip %s %s" % (id, url)) else: data = kf.get(url) with open(path, "w") as f: f.write(data) print("ok %s %s" % (id, url)) time.sleep(1) main("my_username", "password")
下のURLで紹介していた棋神を使用しているかどうかを判定できる方法はもう使えなくなりました.
http://ameblo.jp/nomap/entry-11582784537.html

ということで,棋神かどうかを検証するすべがなくなってしまいました.
検証できないのが当たり前の状態ではあるのですが,若干残念な気がします.

ということで,棋神に関する検証はおそらくこれで最後になるかもですが,
第2回棋神戦,上位25名の対策前の一局当たりの棋神が指した手数に関して調べてみました.
一局当たりの平均を降順ソートしています.

36.05, 32.85, 30.17, 28.21, 13.23,
13.17, 10.83,  8.15,  7.45,  6.59,
 5.61,  5.37,  4.66,  4.18,  3.54,
 3.51,  3.27,  3.10,  2.98,  2.22,
 1.67,  1.65,  0.58,  0.33,  0.00

無尽蔵に棋神を使っているという評判が立っってしまった某社長は25位以内には
入ってないですけどこのリストに入れるとしたら真ん中よりも使用頻度は少ないです.
また,棋神を使いまくっているという注目のユーザは意外なことにほとんど棋神を使っていないようです.
http://images.pona.heroz.jp/senpou/hidechan.png
解説
5筋つかないタイプの中飛車。5筋をつかないことで急戦に対して迅速に対応できるようになることが狙い。

発生条件と局面図
先手番(21手以内)

※ トリガーは,▲5八飛(28).
※ 先後ともに,持ち駒は持っていないことも必要.

後手番(21手以内)

※ トリガーは,△5二飛(82).
※ 先後ともに,持ち駒は持っていないことも必要.