Struct usiagent::rule::Rule [−][src]
pub struct Rule {}
Expand description
合法手の列挙等を行う将棋のルールを管理
Implementations
盤面上の駒を移動する合法手をビットボードに列挙
Arguments
teban
- 手を列挙したい手番self_occupied
- 手番側から見た手番側の駒の配置を表すビットボード。(後手の場合は上下逆さになっている)from
- 盤面の左上を0,0とし、x * 9 + yで表される駒の移動元の位置。常に先手側から見た位置になる(後手の場合も逆さまにならない)kind
- 移動する駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
合法手をバッファに追加
Arguments
m
- 盤面の左上を0,0とし、x * 9 + yで表される移動先の駒の位置。後手の手の場合は上下さかさまになっているfrom
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 移動する駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクinverse_position
- ビットボードを上下逆さにするか否かmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
王を取る合法手をバッファに追加
Arguments
m
- 盤面の左上を0,0とし、x * 9 + yで表される移動先の駒の位置。後手の手の場合は上下さかさまになっているfrom
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 移動する駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクinverse_position
- ビットボードを上下逆さにするか否かmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
一マスだけ駒を動かす合法手を列挙してバッファに追加する
Arguments
teban
- 手を列挙したい手番self_occupied
- 手番側から見た手番側の駒の配置を表すビットボード。(後手の場合は上下逆さになっている)from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 移動する駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクinverse_position
- ビットボードを上下逆さにするか否かmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
一マスだけ駒を動かす合法手を列挙して返す
Arguments
teban
- 手を列挙したい手番self_occupied
- 手番側から見た手番側の駒の配置を表すビットボード。(後手の場合は上下逆さになっている)from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 移動する駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクinverse_position
- ビットボードを上下逆さにするか否かmove_builder
- LegalMoveを生成するためのコールバック
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
盤面上の駒を移動する合法手のうち、角の右上に移動する手をビットボードに列挙
Arguments
self_occupied
- 手番側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。opponent_occupied
- 相手側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。from
- 盤面の左上を0,0とし、x * 9 + yで表される駒の移動元の位置。盤面の上もしくは左方向へ移動するときは逆さまにした時の位置になる。
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
盤面上の駒を移動する合法手のうち、角の右下に移動する手をビットボードに列挙
Arguments
self_occupied
- 手番側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。opponent_occupied
- 相手側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。from
- 盤面の左上を0,0とし、x * 9 + yで表される駒の移動元の位置。盤面の上もしくは左方向へ移動するときは逆さまにした時の位置になる。
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
pub fn legal_moves_sente_kaku_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
pub fn legal_moves_sente_kaku_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
先手の角の合法手を列挙してバッファに追加
Arguments
sente_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。sente_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。flip_self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。flip_opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
pub fn legal_moves_gote_kaku_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
pub fn legal_moves_gote_kaku_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
後手の角の合法手を列挙してバッファに追加
Arguments
self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。flip_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。flip_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
盤面上の駒を移動する合法手のうち、飛車と香車の上に移動する手をビットボードに列挙 反転したビットボードを渡す仕様のため返されたビットボードから列挙される手は盤面をひっくり返した時の形になっていることに注意。
Arguments
flip_self_occupied
- 手番側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。flip_opponent_occupied
- 相手番側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。from
- 盤面の左上を0,0とし、x * 9 + yで表される駒の移動元の位置。盤面の上もしくは左方向へ移動するときは逆さまにした時の位置になる。
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
盤面上の駒を移動する合法手のうち、飛車と香車の右に移動する手をビットボードに列挙
Arguments
self_occupied
- 手番側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。opponent_occupied
- 相手側の駒の配置を表すビットボード。盤面の上もしくは左方向へ移動するときは逆さまにひっくり返した配置になる。from
- 盤面の左上を0,0とし、x * 9 + yで表される駒の移動元の位置。盤面の上もしくは左方向へ移動するときは逆さまにした時の位置になる。
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
pub fn legal_moves_sente_hisha_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
pub fn legal_moves_sente_hisha_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
先手の飛車の合法手を列挙してバッファに追加
Arguments
self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。flip_self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。flip_opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
pub fn legal_moves_gote_hisha_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
pub fn legal_moves_gote_hisha_with_point_and_kind_and_bitboard_and_buffer<F>(
self_occupied: BitBoard,
opponent_occupied: BitBoard,
flip_self_occupied: BitBoard,
flip_opponent_occupied: BitBoard,
from: u32,
kind: KomaKind,
nari_mask: u128,
deny_move_mask: u128,
move_builder: &F,
mvs: &mut Vec<LegalMove>
) where
F: Fn(u32, u32, bool) -> LegalMove,
後手の飛車の合法手を列挙してバッファに追加
Arguments
self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。flip_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。flip_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
先手の香車の合法手を列挙してバッファに追加
Arguments
flip_self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。flip_opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
後手の香車の合法手を列挙してバッファに追加
Arguments
flip_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。flip_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置nari_mask
- ビットボードを用いて移動先で駒が成れるか判定するためのマスクdeny_move_mask
- ビットボードを用いて移動先で駒が成らなくても合法手か判定するためのマスクmove_builder
- LegalMoveを生成するためのコールバックmvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
ビットボードの立っているビットのうち最下位のものの位置を返す
呼出し後、最下位にあったビットは0に更新される
盤面上の位置と駒の種別を元に合法手を列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態x
- 左上を0,0とする移動元のx座標y
- 左上を0,0とする移動元のy座標kind
- 移動する駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
ビットボードから列挙された合法手の情報からLegalMove
を生成して返す
Arguments
banmen
- 現在の盤面opponent_bitboard
- 相手の駒の配置を表すビットボード。常に先手視点
盤面上の位置と駒の種別を元に合法手を列挙してバッファに追加する
Arguments
t
- 手を列挙したい手番state
- 盤面の状態x
- 左上を0,0とする移動元のx座標y
- 左上を0,0とする移動元のy座標kind
- 移動する駒の種類mvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
盤面上の位置を元に合法手を列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態x
- 左上を0,0とする移動元のx座標y
- 左上を0,0とする移動元のy座標
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::legal_moves_allの内部から呼び出される)
pub fn legal_moves_with_dst_to(
t: Teban,
state: &State,
dst: KomaDstToPosition
) -> Vec<LegalMove>
pub fn legal_moves_with_dst_to(
t: Teban,
state: &State,
dst: KomaDstToPosition
) -> Vec<LegalMove>
盤面上の位置と駒の種別を元に合法手を列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態dst
- 移動元の位置
移動元の位置からさらに移動できる位置を取得するときに使う。 渡した引数の状態が不正な場合の動作は未定義
pub fn legal_moves_with_dst_put(
t: Teban,
state: &State,
dst: KomaDstPutPosition
) -> Vec<LegalMove>
pub fn legal_moves_with_dst_put(
t: Teban,
state: &State,
dst: KomaDstPutPosition
) -> Vec<LegalMove>
盤面上の位置と駒の種別を元に合法手を列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態dst
- 移動元の位置
移動元の位置からさらに移動できる位置を取得するときに使う。 渡した引数の状態が不正な場合の動作は未定義
手番と盤面の状態を元に合法手を生成して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態
State
の状態が不正な場合の動作は未定義
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::legal_moves_from_banmen(Teban::Sente,&state);
assert!(mvs.len() > 0);
手番と盤面の状態を元に合法手を生成してバッファに追加
Arguments
t
- 手を列挙したい手番state
- 盤面の状態mvs
- 手を追加するバッファ
State
の状態が不正な時の動作は未定義
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let mut mvs = Vec::new();
let state = State::new(BANMEN_START_POS.clone());
Rule::legal_moves_from_banmen_with_buffer(Teban::Sente,&state,&mut mvs);
assert!(mvs.len() > 0);
pub fn legal_moves_from_mochigoma(
t: Teban,
mc: &MochigomaCollections,
state: &State
) -> Vec<LegalMove>
pub fn legal_moves_from_mochigoma(
t: Teban,
mc: &MochigomaCollections,
state: &State
) -> Vec<LegalMove>
手番と盤面の状態と持ち駒を元に駒を置く合法手を生成して返す
Arguments
t
- 手を列挙したい手番mc
- 持ち駒state
- 盤面の状態
State
もしくはMochigomaCollections
の状態が不正な時の動作は未定義
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::legal_moves_from_mochigoma(Teban::Sente,&MochigomaCollections::Empty,&state);
assert!(mvs.len() == 0);
pub fn legal_moves_from_mochigoma_with_buffer(
t: Teban,
mc: &MochigomaCollections,
state: &State,
mvs: &mut Vec<LegalMove>
)
pub fn legal_moves_from_mochigoma_with_buffer(
t: Teban,
mc: &MochigomaCollections,
state: &State,
mvs: &mut Vec<LegalMove>
)
手番と盤面の状態と持ち駒を元に駒を置く合法手を生成してバッファに追加
t
- 手を列挙したい手番mc
- 持ち駒state
- 盤面の状態mvs
- 手を追加するバッファState
もしくはMochigomaCollections
の状態が不正な時の動作は未定義
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let mut mvs = Vec::new();
let state = State::new(BANMEN_START_POS.clone());
Rule::legal_moves_from_mochigoma_with_buffer(Teban::Sente,&MochigomaCollections::Empty,&state,&mut mvs);
assert!(mvs.len() == 0);
手番と盤面の状態と持ち駒を元に合法手を生成して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態mc
- 持ち駒
State
もしくはMochigomaCollections
の状態が不正な時の動作は未定義
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::legal_moves_all(Teban::Sente,&state,&MochigomaCollections::Empty);
assert!(mvs.len() > 0);
王を取る手のうち一マスだけ駒を動かす手を返す
Arguments
teban
- 手を列挙したい手番self_occupied
- 手番側から見た手番側の駒の配置を表すビットボード。(後手の場合は上下逆さになっている)opponent_ou_bitboard
- 手番側から見た相手の王の配置を表すビットボード。(後手の場合は上下逆さになっている)from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 移動する駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
先手の角を動かす手で王を取れる手を返す
Arguments
opponent_ou_bitboard
- 先手側から見た相手の王の配置を表すビットボード。sente_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。sente_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。flip_self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。flip_opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
後手の角を動かす手で王を取れる手を返す
Arguments
opponent_ou_bitboard
- 後手側から見た相手の王の配置を表すビットボード。self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。flip_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。flip_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
先手の飛車を動かす手で王を取れる手を返す
Arguments
opponent_ou_bitboard
- 先手側から見た相手の王の配置を表すビットボード。sente_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。sente_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。flip_self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。flip_opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
後手の飛車を動かす手で王を取れる手を返す
Arguments
opponent_ou_bitboard
- 後手側から見た相手の王の配置を表すビットボード。self_occupied
- 後手側から見た後手側の駒の配置を表すビットボード。opponent_occupied
- 後手側から見た先手側の駒の配置を表すビットボード。flip_self_occupied
- 先手側から見た先手側の駒の配置を表すビットボード。flip_opponent_occupied
- 先手側から見た後手側の駒の配置を表すビットボード。from
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
先手の香車を動かす手で王を取れる手を返す
Arguments
opponent_ou_bitboard
- 先手側から見た相手の王の配置を表すビットボード。flip_self_occupied
- 手番側の駒の配置を表すビットボード。逆さになっているものを渡すflip_opponent_occupied
- 相手番側の駒の配置を表すビットボード。逆さになっているものを渡すfrom
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
後手の香車を動かす手で王を取れる手を返す
Arguments
opponent_ou_bitboard
- 後手側から見た相手の王の配置を表すビットボード。flip_self_occupied
- 手番側の駒の配置を表すビットボード。逆さになっているものを渡すflip_opponent_occupied
- 相手番側の駒の配置を表すビットボード。逆さになっているものを渡すfrom
- 盤面の左上を0,0とし、x * 9 + yで表される移動元の駒の位置
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
王を取れる手のうち一マスだけ駒を動かす合法手を列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態x
- 盤面左上を0,0とする移動元のx座標y
- 盤面左上を0,0とする移動元のy座標kind
- 駒の種類
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
王を取れる手のうち一マスだけ駒を動かす合法手を列挙してバッファに追加する
Arguments
t
- 手を列挙したい手番state
- 盤面の状態x
- 盤面左上を0,0とする移動元のx座標y
- 盤面左上を0,0とする移動元のy座標kind
- 駒の種類mvs
- 手を追加するバッファ
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
盤面上の位置を元に王を取れる合法手のみを列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態x
- 盤面左上を0,0とする移動元のx座標y
- 盤面左上を0,0とする移動元のy座標
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::win_only_movesの内部から呼び出される)
pub fn win_only_moves_with_src(
t: Teban,
state: &State,
src: KomaSrcPosition
) -> Vec<LegalMove>
pub fn win_only_moves_with_src(
t: Teban,
state: &State,
src: KomaSrcPosition
) -> Vec<LegalMove>
pub fn win_only_moves_with_dst_to(
t: Teban,
state: &State,
dst: KomaDstToPosition
) -> Vec<LegalMove>
pub fn win_only_moves_with_dst_to(
t: Teban,
state: &State,
dst: KomaDstToPosition
) -> Vec<LegalMove>
盤面上の位置を元に王を取れる合法手のみを列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態dst
- 移動元の位置
移動元の位置からさらに移動できる位置を取得するときに使う。
pub fn win_only_moves_with_dst_put(
t: Teban,
state: &State,
dst: KomaDstPutPosition
) -> Vec<LegalMove>
pub fn win_only_moves_with_dst_put(
t: Teban,
state: &State,
dst: KomaDstPutPosition
) -> Vec<LegalMove>
盤面上の位置を元に王を取れる合法手のみを列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態dst
- 移動元の位置
移動元の位置からさらに移動できる位置を取得するときに使う。
pub fn oute_only_moves_with_point(
t: Teban,
state: &State,
mc: &MochigomaCollections,
x: u32,
y: u32
) -> Vec<LegalMove>
pub fn oute_only_moves_with_point(
t: Teban,
state: &State,
mc: &MochigomaCollections,
x: u32,
y: u32
) -> Vec<LegalMove>
盤面上の位置を元に王を取れる手か王手の合法手のみを列挙して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態mc
- 持ち駒x
- 左上を0,0とする移動元のx座標y
- 左上を0,0とする移動元のy座標
渡した引数の状態が不正な場合の動作は未定義(通常,Rule::oute_only_moves_allの内部から呼び出される)
pub fn oute_only_moves_from_banmen(
t: Teban,
state: &State,
mc: &MochigomaCollections
) -> Vec<LegalMove>
pub fn oute_only_moves_from_banmen(
t: Teban,
state: &State,
mc: &MochigomaCollections
) -> Vec<LegalMove>
手番と盤面の状態と持ち駒を元に王を取れる手か王手の盤面上の駒を動かす合法手のみを生成して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態mc
- 持ち駒
State
もしくはMochigomaCollections
の状態が不正な時の動作は未定義(通常,Rule::oute_only_moves_allの内部から呼び出される)
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::oute_only_moves_from_banmen(Teban::Sente,&state,&MochigomaCollections::Empty);
assert!(mvs.len() == 0);
pub fn oute_only_moves_from_mochigoma(
t: Teban,
mc: &MochigomaCollections,
state: &State
) -> Vec<LegalMove>
pub fn oute_only_moves_from_mochigoma(
t: Teban,
mc: &MochigomaCollections,
state: &State
) -> Vec<LegalMove>
手番と盤面の状態と持ち駒を元に駒を置く王手の合法手のみを生成して返す
Arguments
t
- 手を列挙したい手番mc
- 持ち駒state
- 盤面の状態
State
もしくはMochigomaCollections
の状態が不正な時の動作は未定義(通常,Rule::oute_only_moves_allの内部から呼び出される)
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::oute_only_moves_from_mochigoma(Teban::Sente,&MochigomaCollections::Empty,&state);
assert!(mvs.len() == 0);
pub fn oute_only_moves_all(
t: Teban,
state: &State,
mc: &MochigomaCollections
) -> Vec<LegalMove>
pub fn oute_only_moves_all(
t: Teban,
state: &State,
mc: &MochigomaCollections
) -> Vec<LegalMove>
手番と盤面の状態と持ち駒を元に王を取れる手か王手の合法手のみを生成して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態mc
- 持ち駒
State
もしくはMochigomaCollections
の状態が不正な時の動作は未定義
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::oute_only_moves_all(Teban::Sente,&state,&MochigomaCollections::Empty);
assert!(mvs.len() == 0);
pub fn respond_oute_only_moves_all(
t: Teban,
state: &State,
mc: &MochigomaCollections
) -> Vec<LegalMove>
pub fn respond_oute_only_moves_all(
t: Teban,
state: &State,
mc: &MochigomaCollections
) -> Vec<LegalMove>
手番と盤面の状態と持ち駒を元に王手に応ずる合法手のみを生成して返す
Arguments
t
- 手を列挙したい手番state
- 盤面の状態mc
- 持ち駒
State
もしくはMochigomaCollections
の状態が不正な時の動作は未定義
王手がかかってない状態で呼ばれると手を適用した結果相手に王を取られない手が列挙される
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let mvs = Rule::respond_oute_only_moves_all(Teban::Sente,&state,&MochigomaCollections::Empty);
assert!(mvs.len() > 0);
pub fn apply_move_to_partial_state_none_check(
state: &State,
t: Teban,
_: &MochigomaCollections,
m: AppliedMove
) -> PartialState
pub fn apply_move_to_partial_state_none_check(
state: &State,
t: Teban,
_: &MochigomaCollections,
m: AppliedMove
) -> PartialState
盤面の状態を管理するビットボードを手を適用した状態に更新して返す
Arguments
state
- 盤面の状態t
- 手を列挙したい手番m
- 適用する手State
もしくはAppliedMove
の状態が不正な時の動作は未定義
Examples
use usiagent::rule::*;
use usiagent::shogi::*;
let state = State::new(BANMEN_START_POS.clone());
let m = Move::To(KomaSrcPosition(1,7),KomaDstToPosition(1,6,false)).to_applied_move();
let p = Rule::apply_move_to_partial_state_none_check(&state,Teban::Sente,&MochigomaCollections::Empty,m);
let mut banmen = BANMEN_START_POS.clone();
banmen.0[6][8] = KomaKind::Blank;
banmen.0[5][8] = KomaKind::SFu;
assert_eq!(State::new(banmen).get_part(),&p);
pub fn apply_move_none_check(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> (State, MochigomaCollections, Option<MochigomaKind>)
pub fn apply_move_none_check(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> (State, MochigomaCollections, Option<MochigomaKind>)
現在の局面に手を適用した結果を返す。合法手か否かのチェックは行わない。
Arguments
state
- 盤面の状態t
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手State
もしくはAppliedMove
の状態が不正な時の動作は未定義
pub fn apply_move_to_banmen_and_mochigoma_none_check(
banmen: &Banmen,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> (Banmen, MochigomaCollections, Option<MochigomaKind>)
pub fn apply_move_to_banmen_and_mochigoma_none_check(
banmen: &Banmen,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> (Banmen, MochigomaCollections, Option<MochigomaKind>)
現在の局面に手を適用した結果を返す。適用対象は盤面と持ち駒のみでState
は返さない。
Arguments
state
- 盤面の状態t
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手State
もしくはAppliedMove
の状態が不正な時の動作は未定義
pub fn is_valid_move(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> bool
pub fn is_valid_move(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> bool
pub fn apply_valid_move(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> Result<(State, MochigomaCollections, Option<MochigomaKind>), ShogiError>
pub fn apply_valid_move(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> Result<(State, MochigomaCollections, Option<MochigomaKind>), ShogiError>
手が合法かチェック後現在の局面に手を適用して返す。
Arguments
state
- 盤面の状態t
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手State
が不正な時の動作は未定義
Errors
この関数は以下のエラーを返すケースがあります。
InvalidState
手が合法手でない
pub fn apply_moves(
state: State,
teban: Teban,
mc: MochigomaCollections,
m: &Vec<AppliedMove>,
mhash: u64,
shash: u64,
kyokumen_map: KyokumenMap<u64, u32>,
oute_kyokumen_map: KyokumenMap<u64, u32>,
hasher: &KyokumenHash<u64>
) -> (Teban, State, MochigomaCollections, u64, u64, KyokumenMap<u64, u32>, KyokumenMap<u64, u32>)
pub fn apply_moves(
state: State,
teban: Teban,
mc: MochigomaCollections,
m: &Vec<AppliedMove>,
mhash: u64,
shash: u64,
kyokumen_map: KyokumenMap<u64, u32>,
oute_kyokumen_map: KyokumenMap<u64, u32>,
hasher: &KyokumenHash<u64>
) -> (Teban, State, MochigomaCollections, u64, u64, KyokumenMap<u64, u32>, KyokumenMap<u64, u32>)
現在の局面に手のシーケンスを適用して返す
Arguments
state
- 盤面の状態teban
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手mhash
- 局面を表すハッシュ(第一キー)shash
- 局面を表すハッシュ(第二キー)kyokumen_map
- 千日手を検出するためのマップoute_kyokumen_map
- 連続王手の千日手を検出するためのマップhasher
- 局面のハッシュを計算するためのオブジェクト 引数の状態が不正な場合の動作は未定義
pub fn apply_moves_with_callback<T, F>(
state: State,
teban: Teban,
mc: MochigomaCollections,
m: &Vec<AppliedMove>,
r: T,
f: F
) -> (Teban, State, MochigomaCollections, T) where
F: FnMut(Teban, &Banmen, &MochigomaCollections, &Option<AppliedMove>, &Option<MochigomaKind>, T) -> T,
pub fn apply_moves_with_callback<T, F>(
state: State,
teban: Teban,
mc: MochigomaCollections,
m: &Vec<AppliedMove>,
r: T,
f: F
) -> (Teban, State, MochigomaCollections, T) where
F: FnMut(Teban, &Banmen, &MochigomaCollections, &Option<AppliedMove>, &Option<MochigomaKind>, T) -> T,
現在の局面に手のシーケンスを適用しつつコールバックを呼び出して結果を返す
Arguments
state
- 盤面の状態teban
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手r
- コールバックから返されて最終的にこの関数からの返却値の一部となる値f
- コールバック関数 引数の状態が不正な場合の動作は未定義
pub fn is_nyugyoku_win(
state: &State,
t: Teban,
mc: &MochigomaCollections,
limit: &Option<Instant>
) -> bool
pub fn is_nyugyoku_win(
state: &State,
t: Teban,
mc: &MochigomaCollections,
limit: &Option<Instant>
) -> bool
入玉宣言勝ちが成立しているかどうかを返す
Arguments
state
- 盤面の状態teban
- 手を列挙したい手番mc
- 持ち駒limit
- 持ち時間を使い切った時点の時間State
の状態が不正な場合の動作は未定義
pub fn responded_oute(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> Result<bool, InvalidStateError>
pub fn responded_oute(
state: &State,
t: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> Result<bool, InvalidStateError>
王手に応じたか否か
Arguments
state
- 盤面の状態t
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手State
もしくはAppliedMove
の状態が不正な場合の動作は未定義
Errors
この関数は以下のエラーを返すケースがあります
InvalidStateError
王手をかけられていない状態で呼び出された
pub fn is_put_fu_and_mate(
state: &State,
teban: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> bool
pub fn is_put_fu_and_mate(
state: &State,
teban: Teban,
mc: &MochigomaCollections,
m: AppliedMove
) -> bool
手が打ち歩詰めか否かを返す
Arguments
state
- 盤面の状態teban
- 手を列挙したい手番mc
- 持ち駒m
- 適用する手State
もしくはAppliedMove
の状態が不正な場合の動作は未定義
手が王を取る手か否かを返す
Arguments
state
- 盤面の状態teban
- 手を列挙したい手番m
- 適用する手State
もしくはAppliedMove
の状態が不正な場合の動作は未定義
pub fn is_mate_with_partial_state_and_point_and_kind(
t: Teban,
ps: &PartialState,
x: u32,
y: u32,
kind: KomaKind
) -> bool
pub fn is_mate_with_partial_state_and_point_and_kind(
t: Teban,
ps: &PartialState,
x: u32,
y: u32,
kind: KomaKind
) -> bool
相手が詰んでいるか否かビットボードと移動元座標と駒の種類から返す
Arguments
t
- 手を列挙したい手番ps
- 盤面の状態を表すビットボードx
- 盤面左上を0,0とした時の移動元のx座標y
- 盤面左上を0,0とした時の移動元のy座標kind
- 駒の種類 引数が不正な場合の動作は未定義
pub fn is_mate_with_partial_state_and_from_and_kind(
t: Teban,
ps: &PartialState,
from: u32,
kind: KomaKind
) -> bool
pub fn is_mate_with_partial_state_and_from_and_kind(
t: Teban,
ps: &PartialState,
from: u32,
kind: KomaKind
) -> bool
相手が詰んでいるか否かビットボードと移動元座標(x*9+y)と駒の種類から返す
Arguments
t
- 手を列挙したい手番ps
- 盤面の状態を表すビットボードfrom
- 盤面左上を0,0とし、x * 9 + yで表される移動元の駒の位置kind
- 駒の種類 引数が不正な場合の動作は未定義
相手が詰んでいるか否かビットボードから返す(香車、飛車、角のいずれかで詰むケースのみ)
Arguments
t
- 手を列挙したい手番ps
- 盤面の状態を表すビットボードPartialState
が不正な場合の動作は未定義
pub fn is_mate_with_partial_state_and_old_banmen_and_opponent_move(
t: Teban,
banmen: &Banmen,
ps: &PartialState,
m: AppliedMove
) -> bool
pub fn is_mate_with_partial_state_and_old_banmen_and_opponent_move(
t: Teban,
banmen: &Banmen,
ps: &PartialState,
m: AppliedMove
) -> bool
相手の手番側が詰んでいるか否か手の適用後のビットボードと手の適用前の盤面と手番側の打った手から返す
Arguments
t
- 手を列挙したい手番banmen
- 手の適用前の盤面ps
- 相手の手番側の手の適用後の盤面の状態を表すビットボードm
- 相手の手番側が打った手 引数が不正な場合の動作は未定義
pub fn update_sennichite_map(
_: &State,
teban: Teban,
mhash: u64,
shash: u64,
kyokumen_map: &mut KyokumenMap<u64, u32>
)
pub fn update_sennichite_map(
_: &State,
teban: Teban,
mhash: u64,
shash: u64,
kyokumen_map: &mut KyokumenMap<u64, u32>
)
千日手検出用マップの更新関数
Arguments
teban
- 手を列挙したい手番mhash
- 局面を表すハッシュ(第一キー)shash
- 局面を表すハッシュ(第二キー)kyokumen_map
- 千日手検出用のマップ
pub fn is_sennichite(
_: &State,
teban: Teban,
mhash: u64,
shash: u64,
kyokumen_map: &KyokumenMap<u64, u32>
) -> bool
pub fn is_sennichite(
_: &State,
teban: Teban,
mhash: u64,
shash: u64,
kyokumen_map: &KyokumenMap<u64, u32>
) -> bool
現在の局面が千日手か否かを返す
Arguments
teban
- 手を列挙したい手番mhash
- 局面を表すハッシュ(第一キー)shash
- 局面を表すハッシュ(第二キー)kyokumen_map
- 千日手検出用のマップ
pub fn update_sennichite_by_oute_map(
state: &State,
teban: Teban,
mhash: u64,
shash: u64,
oute_kyokumen_map: &mut KyokumenMap<u64, u32>
)
pub fn update_sennichite_by_oute_map(
state: &State,
teban: Teban,
mhash: u64,
shash: u64,
oute_kyokumen_map: &mut KyokumenMap<u64, u32>
)
連続王手の千日手検出用マップの更新関数
Arguments
teban
- 手を列挙したい手番mhash
- 局面を表すハッシュ(第一キー)shash
- 局面を表すハッシュ(第二キー)oute_kyokumen_map
- 千日手検出用のマップ
pub fn is_sennichite_by_oute(
state: &State,
teban: Teban,
mhash: u64,
shash: u64,
oute_kyokumen_map: &KyokumenMap<u64, u32>
) -> bool
pub fn is_sennichite_by_oute(
state: &State,
teban: Teban,
mhash: u64,
shash: u64,
oute_kyokumen_map: &KyokumenMap<u64, u32>
) -> bool
現在の局面が連続王手の千日手か否かを返す
Arguments
teban
- 手を列挙したい手番mhash
- 局面を表すハッシュ(第一キー)shash
- 局面を表すハッシュ(第二キー)oute_kyokumen_map
- 千日手検出用のマップ
pub fn update_time_limit(
limit: &UsiGoTimeLimit,
teban: Teban,
consumed: Duration
) -> UsiGoTimeLimit
pub fn update_time_limit(
limit: &UsiGoTimeLimit,
teban: Teban,
consumed: Duration
) -> UsiGoTimeLimit
持ち駒の状態を平手初期局面の時の駒を全部持ち駒にした状態で返す。
返されるのはHashMap<MochigomaKind,u32>
なので先手後手それぞれについて呼び出す必要がある