開発記録 / 画像認識 × 将棋

将棋ゲームの画面から、
局面のSFENを取り出すアプリの作成記録

対局を振り返るとき、いま画面に出ている局面を、そのまま検討ソフトに貼りたいと思いました。ボタンを1つ押すと、将棋ゲームの画面を読み取り、局面をSFENの1行にしてコピーするアプリを作りました。

将棋ゲームの対局画面から切り出した盤。23手目の局面

この盤を読み取ると、次の1行がコピーされます。

1n1k2+P1l/lrs2g1+R1/pppp4p/4p1p2/5P3/2P6/PP1PP1P1P/1B7/LNSGKGSNL b BGSN2P 23

盤の外にある持ち駒(先手の角・金・銀・桂と歩2枚)も読み、手番と手数まで含めています。lishogi の盤面入力や棋譜解析に、そのまま貼り付けて使えます。

1 作りたかったもの

画面に出ている局面を、手で並べ直さずに検討ソフトへ移したいと考えました。

将棋ゲームで指したあと、感想戦の画面で局面をたどっていると、「この局面を検討ソフトで調べたい」と思うことがあります。そのたびに検討ソフトの盤へ駒を1枚ずつ並べ直すのは手間がかかり、並べ間違いも起きます。

局面を移すには、SFENという書き方を使います。局面を1行の文字で表すもので、多くの検討ソフトが読み込めます。平手の初期局面は次のように書きます。

lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1

盤を上の段から順に書き、大文字が先手の駒、小文字が後手の駒、数字は空いているマスの数です。そのあとに手番(b が先手、w が後手)、持ち駒(無ければ -)、手数が続きます。

機能は「いま画面に出ている局面のSFENを取る」ことだけに絞りました。対局を最初から記録する機能や、ファイルに保存する機能は付けていません。貼り付ければ用が済むので、ファイルも残しません。

2 仕組み

ゲームの画面を撮り、盤・持ち駒・手番・手数を読んで、局面として成り立つかを確かめてからコピーします。

アプリの操作窓。SFENをコピーのボタンと、コピー済み 23手目と出た結果の欄
操作窓。[SFENをコピー]を押すと、下の欄に結果が出ます。実際はこれより小さく、大きさは自由に変えられます。

ボタンを押してからコピーされるまでは、次の手順です。

  1. 将棋ゲームのウィンドウだけを撮ります。ほかのウィンドウの後ろに隠れていても撮れるので、ゲームの画面を前に出す必要はありません。
  2. 盤の81マスを1つずつ、駒の字の見本と照合します。字の向きで先手の駒か後手の駒かを、字の色で成っているかを見分けます。
  3. 盤の外にある持ち駒と、その枚数の数字を読みます。
  4. 手番は、直前に指された駒のマス(赤く光っています)から決めます。手数は、画面に出ている「○手目」の数字を読みます。
  5. 局面として成り立つかを確かめてから、クリップボードに入れます。

押してからコピーされるまでは、2秒ほどです。

3 注意したこと

読み違えたまま貼り付けると、違う局面を検討することになります。そこで、コピーする前に次のことを確かめ、ひとつでも合わなければコピーせずに、エラー音とともに理由を表示します。

  • 駒の数が、種類ごとに合っているか(歩は18枚、玉は2枚など。成駒は元の駒として数えます)
  • 二歩になっていないか
  • 手番と手数の偶数・奇数が食い違っていないか
  • 対局画面か感想戦の画面か(メニューなどの画面では「取得失敗」と出します)

4 テスト

以下の項目について確認・テストしました。

  • 駒:すべての種類の駒と成駒
  • 盤の向き
  • 対局画面と感想戦の画面
  • 画面の大きさ:1280×720 と 1920×1080

5 使い方

  1. 将棋ゲームで、対局画面か感想戦の画面を出す
  2. マウスのカーソルを盤の外に出してから、[SFENをコピー]を押す
  3. 「コピー済み ○手目」と出たら、検討ソフトに貼り付ける

カーソルや、カーソルを当てたときに光る駒が写ると、読み違えるおそれがあるためです。