no-image

KIFをSfenに変換する

KIF

KIF形式とは “2六歩(27)” みたいな指し手の表現方法のこと。

いろいろあるが、主に以下の五つが主流である。

形式指し手
KIF2六歩(27)
Sfen2g2f
伝統形式(KI2)2六歩
ユニバーサルP-26
CSA+2726FU

ただし、このうち伝統形式は基本的に使われることがない。

一意な指し手の解釈が困難だからだ。馬が二枚とも利いている場合などどっちが左の馬なのかということになってしまう。

コンピュータが理解し難いのだから普及しないというわけである。

さて、このうちコンピュータ将棋で広く使われているのはCSA, KIF, Sfenの三つである。

といっても内部情報を扱うのCSAかSfenが主流である、マルチバイトを使っているKIFはやはり扱いにくいのである。

KIFをSfenに変換する

さて、なぜKIFをSfenに変換しようかと思ったかというとこれはかなり昔に遡る。

簡単に言えば、棋戦の現在の局面をツイッターに自動投稿したいということである。

放送権の兼ね合いもあるので堂々とやるのはアレかもしれないが、個人でこっそりやる分には大丈夫でしょう。

何より、中継サイトはロストテクノロジーであるFLASHを採用しているのでiPhoneなどのスマートフォンではブラウザから視聴できないという最大の欠点があります。

それがツイッターに局面画像がポンポン自動で投稿されるならまあそれは便利じゃないですか。

棋譜中継サイトは基本的にKIFファイルで中継しているので、以下のフローチャートで上手いこと実装できるはずです。

  1. 中継サイトのKIFを局面情報のSfenに変換
    • 検討ソフトにSfenを渡す
    • 返ってきた評価値を取得
  2. Sfenから局面画像を作成
    • 局面ジェネレータで対応済み
  3. 作成された画像を投稿
    • 先日ツイッターAPIを利用して対応済み

というわけで、評価値云々をおいておけば与えられたKIF形式のデータから最新局面のSfenが出力できればあとは完成なのである。

完成したもの

どうせユーザもそんなに多くないのであんまり解説する気はないですが、紹介します。

<?php
require_once "kif2sfen.php";

$board = new Board();
$board->loadKif(KIF URL);
$board->export(TURN);
?>

こんな感じで記述すれば現在の局面情報をSfen形式で返してくれます。

手番(TURN)は指定しなければ256手目を返すので、基本的には最も新しい局面(最新)のものが返ってくるはずです。