sunfish-shogi / electron-shogi Goto Github PK
View Code? Open in Web Editor NEWElectron で作られた将棋の GUI
Home Page: https://sunfish-shogi.github.io/electron-shogi/
License: MIT License
Electron で作られた将棋の GUI
Home Page: https://sunfish-shogi.github.io/electron-shogi/
License: MIT License
USI プロトコルの Ponder をサポートする。
bestmove <move1> ponder <move2>
の形式でエンジンが予想手を送ってくることエンジンから以下の順でコマンドが送られる。
予想が外れたにも関わらず、エンジンは stop 受信後に bestmove を送らなければならない。
エンジンの予想手が外れた場合
この場合、GUIはエンジンにstopを送ります。
>stop
エンジンはこれに対し、思考中ならすぐに思考を打ち切って、現時点で最善と考えている手をbestmoveで返します。既に思考が終わっていたなら、探索済みの指し手をbestmoveで返します。(bestmoveのあとにponderで相手の予想手を追加しても構いませんが、いずれにしろ無視されます。)
何のためにあるのか何度読み返してもわからない。
なお、 Sunfish は bestmove resign
を送っている。(どうせ無視されるので局面に応じで変わる値を送るのが面倒)
なお、先読みをする時に、予想手を一つではなく複数考えたいということがあるかもしれません。そのような場合は、USIの本来の使い方からは外れますが、bestmove ponder ではなく、単にbestmove だけを返し、相手の手番中に勝手に先読みするようにして下さい。
エンジンが bestmove に ponder を付けてこなかった場合、 info で送られてきた pv は現在の局面からのものと解釈し、 ponder を付けてきた場合には予想手を指したあとの局面からのものと解釈するのが正しいと思われる。
USI_Ponder オプションはエンジン側が使用していなくても、将棋所では常に設定画面に表示され、エンジンに値が送られるとされている。
なお、 USI_Hash も同様である。
将棋所はもともと対局開始のダイアログの中に USI_Ponder と USI_Hash の設定を表示していた。
しかし、現在はエンジンの設定画面の中に追いやっている。
USI_PonderとUSI_Hashに関しては、将棋所4.0.2までは対局ダイアログ内に設定項目がありましたが、将棋所4.1.0からは、エンジン設定ダイアログを開いた時に上部に表示される「相手の手番中に先読み(USI_Ponder)」と「ハッシュメモリ(USI_Hash)」で設定するようになりました。
この二つに関しては、エンジンが起動時にoptionコマンドで返さなくても、将棋所で対局を開始するときに必ず送るようにしてあります。
おそらく、以前との互換性のために必ず送るようにしているのだと思う。
2022/6/14 現在、 USI_Ponder と USI_Hash を明示的していないが送られてきたら使うというエンジンは発見できていない。
したがって、将棋所と同じ実装を Electron 将棋がする必要性は無いと思う。
ただ、 USI_Ponder と USI_Hash が無ければ追加するというのは簡単に実装できるのでやっても良いかもしれない。
USI_Ponder が false の場合に将棋所は go ponder コマンドを送らない。
つまり、 go ponder
が送られるのは、 USI_Ponder が true でありなおかつ bestmove で ponder が指定された場合だけである。
やねうら王系は Stochastic Ponder 設定を有効にすると予想手を送った上で前の局面から思考しているらしい。
https://yaneuraou.yaneu.com/2021/05/04/the-function-of-stochastic-ponder-in-shogi-ai/
ただ、この場合は PV の表示や評価値の表示に問題が出る。
一方で白ビールは予想手自体を送っていない。
USIエンジンは手番側から見た評価値を返すので、後手番では反転しなければならない。
Mac で複数の Window を出す方法が無い。また、 Window を閉じてからメニューを操作すると例外が発生する。
KIF形式では、OS標準の改行コードを使用するとされている。
http://kakinoki.o.oo7.jp/kif_format.html
process.platform の値に応じて改行コードを選択する。
なお、 CSA 形式も同様。
http://www2.computer-shogi.org/protocol/record_v22.html
CSA標準棋譜ファイル形式 第6版 バージョン2.2
http://www2.computer-shogi.org/protocol/record_v22.html
npm run license:report
を実行した際に devDependencies を除外しているが、PCアプリに使われる electron や electron-builder が入ってこないので、成果物を公開する前に生成フローを改善する。
二歩や王手放置など、反則手を含めて記録されている棋譜もあるため、厳密な合法手チェックは画面入力だけとし、それ以外は反則手を許容する。
エンジン管理画面でエンジン設定を複製できるようにする。
持ち時間の Hours の入力値の 10 倍で対局が開始してしまう。
MultiPVを有効にすると、最後に送信された評価値をグラフに表示してしまっている。
MultiPVの順位が指定されている場合は第1位の値を表示しなければならない。
リモートのリソースは利用しないものの、念のため
https://www.electronjs.org/ja/docs/latest/tutorial/security
を読み返して全て最新の推奨設定に合わせる。
以下の操作時に確認ダイアログを出す。
プレイヤーには人の場合と USI エンジンの場合があり、今後その他(CSA プロトコル、Javascript 簡易 AIなど)を増やす可能性がある。
現在は store にプレイヤー種別ごとの処理が直接実装されているが、これを抽象化して対局開始時にインスタンスを差し込むようにする。
また、プレイヤーは全て URI で識別する。
どのような方法で出力するか検討する。
レンダラーで console.log に出すのは避けたい。(Chromium の開発者ツールが重すぎる。)
エンジンのログを見るのは基本的にエンジニアなので、テキストファイルに出力して tail コマンドで見てもらえば問題ないような気もする。
双玉詰将棋の初期配置が有ると良いというリクエストを Twitter で頂いた。
双玉詰将棋で使用する駒は平手と同じなのであまり気にしていなかったが、ほとんどの駒を後手の駒台に移動する必要があるため、専用のメニューがあると良さそう。
また、現状だとメニュー以外では「平手」「詰将棋」の選択しかできない状態であり、ブラウザ版では局面編集中にそれ以外を選択する方法が無い。(対局開始時に選ぶことはできる。)
全ての選択肢をボタンで並べるのは無理があるので、プルダウンメニュー等で出すようにしたい。
ぴよ将棋が出力した KIF ファイルにおいて先手番の指し手に「玉」ではなく「王」が使われている。
これをElectron将棋で読み込もうとするとエラーになる。
http://kakinoki.o.oo7.jp/kif_format.html によれば
玉、飛、龍、角、馬、金、銀、成銀、桂、成桂、香、成香、歩、と
龍を「竜」であらわす場合もある。
成銀を「全」、成桂を「圭」、成香を「杏」であらわす場合もある(「詰将棋パラダイス」でも使用)。
とされており、「王」を使って良いとは書かれていない。
しかし、将棋所、ShogiGUI、Kifu for Windows のどれでも読み込む事ができており、対応した方が良さそうである。
KIF 形式や CSA 形式自体には定義がないため、既存のソフトウェアの現状を調査した上で内容を検討する。
SFEN での局面コピー・ペーストに対応する。
将棋所はプレフィクス sfen
を付けないが、 ShogiGUI は付けている。
どちらもペーストはプレフィクスがあっても無くても読み込むことができる。
USI のデバッグ等を考えると、シンプルな SFEN だけでなく USI の position コマンドで棋譜をペーストできた方が良いかもしれない。
なお、将棋所の棋譜コピーには SFEN の選択肢があり、これを使うと USI の position コマンドがコピーされる。
http://shogidokoro.starfree.jp/translate.html
将棋所では _ja.txt
というサフィックスを付けることで、日本語の表記を指定できるとされています。
2022/05/01 現在の対応状況
個人的には、よく使われる名前(Threads とか MultiPV など)に対して Electron 将棋側で変換辞書を持ってしまっても良いのではないかと思っています。
ローカルの複雑なプロセス間通信がメインであるアプリケーションの性質上、 Vuex の恩恵を十分に享受できずむしろ扱いづらい面があるように感じる。
Vuex をやめてステートを適切に取り扱えるように設計を見直す。
特にプレイヤーを抽象化し、人やUSIエンジン、CSAプロトコルそれぞれの知識が中心部に入り込まないようにしたい。
棋譜コメントで十字キーを使おうとしても、棋譜を操作した扱いになってしまう。
.kifu 形式で保存しようとすると 棋譜の保存中にエラーが出ました: ReferenceError: Buffer is not defined
というエラーが出て失敗する。
逆に .kifu 形式のファイルを開こうとすると空の棋譜になってしまう。
例えば、盤面をクリックした後に Ctrl+V
を押すと反応しない。
特定の DOM にフォーカスがあたっていると Propagate していないように思う。
メニューバーに以下のサブメニュー項目を持つ「ヘルプ」を作成する。
最善手をハイライトするか、もしくは次善手以降を薄くすることで表示に差をつける。
十字キーの ⬆️ ⬇️ は棋譜の戻る・進む操作に割り当てられているが、分岐選択の SelectElement にフォーカスがあたっている場合はそちらを優先する。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.