# 操作モード
# 特徴
- 対戦用のモード
- 手番側の操作を行う
- 一度指すとその手が最終手になる
- 再生モードの棋譜とは独立している (再生モードの棋譜を上書きしない)
# 関連オプション
- sp_body: AIと対戦すると仮定したときAIの指し手を反映する
- sp_human_side: 片側の操作に絞る
# 関連イベント
- ev_play_mode_move: 人間の指し手を受けとる
# Playground
# 例1. 次の1手クイズ
指し手によって「正解」「不正解」を表示する
# 手順
- 操作モードにする
- 人間が指す
- と同時に ev_play_mode_move で指し手を受け取る
- 指し手が正しいか確認する
# コードの要点
<shogi-player-wc
sp_mode="play"
sp_body="${this.source}"
@ev_play_mode_move="${this.ev_play_mode_move}"
></shogi-player-wc>
ev_play_mode_move(e) {
const move = e.detail[0].last_move_info.to_kif
if (move === this.expected) {
alert("正解")
} else {
alert("不正解")
}
}
# 例2. AIと対戦する
- AI は角交換を望んでいる
- 先手(人間)は角道を開けて自分から角交換すること
- それ以外の手を指すと AI は投了する
# 手順
- 操作モードにする
- 人間が指す
- と同時に ev_play_mode_move で指し手を含む棋譜を受け取る
- その棋譜を AI に渡す
- AI は受け取った棋譜を見て考え、応手を含む新しい棋譜を返す
- その棋譜を sp_body に指定する
このとき人間にはAIが駒を1つ動かしただけのように見える - 2 に戻る
- ここでいう「棋譜」は「moves 付きの SFEN」を意味する
- AIの指し手を反映させる方法として「A座標の駒をB座標に動かす」のような処理のイメージをしてしまうかもしれないがそのようなAPIがあるわけではない
- 指し手の反映は棋譜を sp_body に指定するのみ
# コードの要点
<shogi-player-wc
sp_mode="play"
sp_body="${this.ai_sfen}"
@ev_play_mode_move="${this.ev_play_mode_move}"
></shogi-player-wc>
ev_play_mode_move(e) {
this.human_sfen = e.detail[0].sfen // 人間の指し手を受け取って
const sfen = this.ai_best_move(this.human_sfen) // AIに渡すと応手が返ってくるので
this.ai_sfen = sfen // 局面に反映する
}
// 「☗76歩」には「☖34歩」とし「☗22角成」に「同銀」とするだけのAI
ai_best_move(sfen) {
if (sfen === "position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves 7g7f") {
return "position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves 7g7f 3c3d"
}
if (sfen === "position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves 7g7f 3c3d 8h2b+") {
return "position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves 7g7f 3c3d 8h2b+ 3a2b"
}
}