将棋の棋譜ファイル(kif)一覧表示用PHP
天下一将棋会2のひとり感想戦用に、ネットに上げた棋譜ファイルを
ブラウザ上で一覧表示してくれるPHPを作ってみました。
ディレクトリに、SJISで保存したkifファイルと一緒に入れておけばOKです。
※2012/2/1追記
将棋倶楽部24の棋譜に対応するよう修正しました。
引き分けの棋譜に対応していないので、対応させたい…
ようやくe-AMUSEMENT GATEがオープンしたんで、
先週引き分けた時の棋譜取ってきて、修正します~。
// プレイヤー名を設定してね
$player_name = "ばね";
$lst = ".";
$linkStrArray = array();
$lastPlayDate = '';
$date_line_hash = array();
$drc=dir($lst);
while ($fl=$drc->read()) {
$lfl = $lst."/".$fl;
$din = pathinfo($lfl);
if(!is_dir($lfl) && ($fl!=".." && $fl!=".")) {
$playDate = getPlayDate($fl);
if (strlen($playDate) > 0) {
$date_line_hash[getPlayDate($fl)] = $fl;
}
}
}
krsort($date_line_hash);
foreach ($date_line_hash as $playDate => $fl) {
$nowPlayDate = substr($playDate, 0, 10);
if (strcmp($lastPlayDate, $nowPlayDate) != 0) {
array_push($linkStrArray, day2HeadStr($nowPlayDate));
$lastPlayDate = $nowPlayDate;
}
$lfl = $lst."/".$fl;
$din = pathinfo($lfl);
$fn = filemtime($lfl);
array_push($linkStrArray, pass2LinkStr($fl, $player_name));
}
function getPlayDate($pass) {
$play_date = '';
$contents = @file($pass);
foreach($contents as $line){
$line = mb_convert_encoding($line, 'utf8', 'sjis-win');
chop($line);
if (preg_match("/".preg_quote("開始日時","/")."/", $line)){
if (preg_match("/20[0-9]{2}\/[0-9]{2}\/[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}/", $line, $match)) {
$play_date = $match[0];
}
}
}
return $play_date;
}
function pass2LinkStr($pass, $player_name) {
$play_date = '';
$vs = '';
$turn = '';
$teban = '';
$result = '';
$contents = @file($pass);
foreach($contents as $line){
$line = mb_convert_encoding($line, 'utf8', 'sjis-win');
chop($line);
if (preg_match("/".preg_quote("開始日時","/")."/", $line)){
if (preg_match("/20[0-9]{2}\/[0-9]{2}\/[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}/", $line, $match)) {
$play_date = $match[0];
}
}
if (preg_match("/".preg_quote("先手:","/")."(.+)/", $line, $match)){
$player = $match[1];
if (preg_match("/".preg_quote($player_name,"/")."/", $line)) {
$teban = "先手";
}
else {
$vs = $player;
}
}
if (preg_match("/".preg_quote("後手:","/")."(.+)/", $line, $match)){
$player = $match[1];
if (preg_match("/".preg_quote($player_name,"/")."/", $line)) {
$teban = "後手";
}
else {
$vs = $player;
}
}
if (preg_match("/".preg_quote("詰み","/")."/", $line)){
if (preg_match("/^\s*([0-9]+)\s/", $line, $match)){
$turn = $match[1];
if (($turn % 2 == 0 && $teban === "先手") ||
($turn % 2 != 0 && $teban === "後手")) {
$result = "勝ち";
}
else {
$result = "負け";
}
}
}
if (preg_match("/".preg_quote("投了","/")."/", $line)){
if (preg_match("/^\s*([0-9]+)\s/", $line, $match)){
$turn = $match[1];
if (($turn % 2 == 0 && $teban === "先手") ||
($turn % 2 != 0 && $teban === "後手")) {
$result = "勝ち";
}
else {
$result = "負け";
}
}
}
}
$resultStr = sprintf("%s vs %s %s (%s %d手)", $play_date, $vs, $result, $teban, ($turn - 1));
$lineStr = "<br / ><a href=\"".$pass."\" charset=\"Shift_JIS\">".$resultStr."</a>";
return $lineStr;
}
function day2HeadStr($dayStr) {
return sprintf("<hr><font size="+2"><b>%s</b></font>", $dayStr);
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>棋譜一覧</title>
</head>
<body>
<?php
foreach ($linkStrArray as $linkStr) {
print $linkStr;
}
?>
</body>
</html>