基于无库的将死函数-reactjs
Checkmate function based on no library - reactjs
我试图找出一个不使用库的函数或算法
到目前为止,我有一个用于检查时的函数,但我无法理解将死函数...
我知道我应该寻找所有可能的动作,但不能真正让它发挥作用
getKingPosition(squares, player) {
return squares.reduce((acc, current, i) =>
acc || //King may be the only one, if we had found it, returned his position
((current //current square mustn't be a null
&& (current.getPlayer() === player)) //we are looking for aspecical king
&& (current instanceof King)
&& i), // returned position if all conditions are completed
null)
}
isCheckForPlayer(squares, player) {
const opponent = player === 1 ? 2 : 1
const playerKingPosition = this.getKingPosition(squares, player)
const canPieceKillPlayerKing = (piece, i) => piece.isMovePossible(playerKingPosition, i, squares)
return (
squares.reduce((acc, current, index) =>
acc ||
(current &&
(current.getPlayer() === opponent) &&
canPieceKillPlayerKing(current, index)
&& true),
false)
)
}
isCheckmate(isCheckForPlayer, isMovePossible){
const KingUnabletoMove = this.getKingPosition(squares, player)
const CheckMate =
}
上面的功能我已经入手了,但是目前有点一头雾水..
下面是代码,阻止了潜在移动的可能性,因为有一个检查
if (isMovePossible) {
if (squares[i] !== null) {
if (squares[i].player === 1) {
whitepiecestaken.push(squares[i]);
}
else {
blackpiecestaken.push(squares[i]);
}
}
squares[i] = squares[this.state.sourceSelection];
squares[this.state.sourceSelection] = null;
const isCheckMe = this.isCheckForPlayer(squares, this.state.player)
if (isCheckMe) {
this.setState(oldState => ({
status: "Wrong selection. Choose Valid source and destination again. Now you have a check!",
sourceSelection: -1,
}))
} else {
let player = this.state.player === 1 ? 2 : 1;
let turn = this.state.turn === 'white' ? 'black' : 'white';
this.setState(oldState => ({
sourceSelection: -1,
squares,
whitepiecestaken: [...oldState.whitepiecestaken, ...whitepiecestaken],
blackpiecestaken: [...oldState.blackpiecestaken, ...blackpiecestaken],
player,
status: '',
turn
}));
}
}
else {
this.setState({
status: "Wrong selection. Choose valid source and destination again.",
sourceSelection: -1,
});
}
}
}
还包括国王向下移动的能力
import Piece from './piece.js';
import { isSameDiagonal, isSameRow } from '../helpers';
export default class King extends Piece {
constructor(player) {
super(player, (player === 1 ?
"https://upload.wikimedia.org/wikipedia/commons/4/42/Chess_klt45.svg" :
"https://upload.wikimedia.org/wikipedia/commons/f/f0/Chess_kdt45.svg"
));
}
isMovePossible(src, dest) {
return ((src - 9 === dest && isSameDiagonal(src, dest)) ||
src - 8 === dest ||
(src - 7 === dest && isSameDiagonal(src, dest)) ||
(src + 1 === dest && isSameRow(src, dest)) ||
(src + 9 === dest && isSameDiagonal(src, dest)) ||
src + 8 === dest ||
(src + 7 === dest && isSameDiagonal(src, dest)) ||
(src - 1 === dest && isSameRow(src, dest)))
}
/**
* always returns empty array because of one step
* @return {[]}
*/
getSrcToDestPath(src, dest) {
return [];
}
}
希望有人能帮助我
如果你有检查的功能,以及检索所有动作的功能,那就很简单了。基本步骤:
- 检查当前玩家是否被选中。
- 检查是否有任何合法的走法。
- 如果玩家处于被将状态并且没有合法移动,那么它就是将死(如果没有合法移动但没有被检查则陷入僵局)。
在考虑国际象棋引擎(或其他相关棋盘游戏)时,棋盘表示是最重要的,特别是为了简化移动生成。一般选择是...
- 位板(一种高级技术)或
- 一维数组,棋盘周围有边框。
根据 isMovePossible
函数,您似乎已经在使用一维数组,但如果在棋盘周围添加边框,您会发现它更容易,因为它会大大简化和加快边界检查生成移动时。
通常在使用带边框棋盘的国际象棋引擎中,一维数组被解释为 10 x 12 数组,代表方块、棋子和边框。更具体地说,除了移动生成的起源之外,请参阅我的早期答案,它举例说明了带边板。
关于参考答案的一些注释...
- 该代码片段使用了 12 x 12 带边框的棋盘,尽管可以使用 10 x 12 带边框的棋盘并且仍然可以检查骑士移动的边界。
- 特殊的棋子移动(例如从起始方格开始的两个方格、过路人捕获和棋子升级)将需要超出代码片段中所呈现内容的特殊逻辑。
- 代码片段的最底部显示了单个棋子的移动生成技术,当然,当应用于所有对手棋子时,将有助于评估将死...
将带边框的棋盘与一系列移动偏移结合使用将简化您的工作...
我试图找出一个不使用库的函数或算法
到目前为止,我有一个用于检查时的函数,但我无法理解将死函数... 我知道我应该寻找所有可能的动作,但不能真正让它发挥作用
getKingPosition(squares, player) {
return squares.reduce((acc, current, i) =>
acc || //King may be the only one, if we had found it, returned his position
((current //current square mustn't be a null
&& (current.getPlayer() === player)) //we are looking for aspecical king
&& (current instanceof King)
&& i), // returned position if all conditions are completed
null)
}
isCheckForPlayer(squares, player) {
const opponent = player === 1 ? 2 : 1
const playerKingPosition = this.getKingPosition(squares, player)
const canPieceKillPlayerKing = (piece, i) => piece.isMovePossible(playerKingPosition, i, squares)
return (
squares.reduce((acc, current, index) =>
acc ||
(current &&
(current.getPlayer() === opponent) &&
canPieceKillPlayerKing(current, index)
&& true),
false)
)
}
isCheckmate(isCheckForPlayer, isMovePossible){
const KingUnabletoMove = this.getKingPosition(squares, player)
const CheckMate =
}
上面的功能我已经入手了,但是目前有点一头雾水..
下面是代码,阻止了潜在移动的可能性,因为有一个检查
if (isMovePossible) {
if (squares[i] !== null) {
if (squares[i].player === 1) {
whitepiecestaken.push(squares[i]);
}
else {
blackpiecestaken.push(squares[i]);
}
}
squares[i] = squares[this.state.sourceSelection];
squares[this.state.sourceSelection] = null;
const isCheckMe = this.isCheckForPlayer(squares, this.state.player)
if (isCheckMe) {
this.setState(oldState => ({
status: "Wrong selection. Choose Valid source and destination again. Now you have a check!",
sourceSelection: -1,
}))
} else {
let player = this.state.player === 1 ? 2 : 1;
let turn = this.state.turn === 'white' ? 'black' : 'white';
this.setState(oldState => ({
sourceSelection: -1,
squares,
whitepiecestaken: [...oldState.whitepiecestaken, ...whitepiecestaken],
blackpiecestaken: [...oldState.blackpiecestaken, ...blackpiecestaken],
player,
status: '',
turn
}));
}
}
else {
this.setState({
status: "Wrong selection. Choose valid source and destination again.",
sourceSelection: -1,
});
}
}
}
还包括国王向下移动的能力
import Piece from './piece.js';
import { isSameDiagonal, isSameRow } from '../helpers';
export default class King extends Piece {
constructor(player) {
super(player, (player === 1 ?
"https://upload.wikimedia.org/wikipedia/commons/4/42/Chess_klt45.svg" :
"https://upload.wikimedia.org/wikipedia/commons/f/f0/Chess_kdt45.svg"
));
}
isMovePossible(src, dest) {
return ((src - 9 === dest && isSameDiagonal(src, dest)) ||
src - 8 === dest ||
(src - 7 === dest && isSameDiagonal(src, dest)) ||
(src + 1 === dest && isSameRow(src, dest)) ||
(src + 9 === dest && isSameDiagonal(src, dest)) ||
src + 8 === dest ||
(src + 7 === dest && isSameDiagonal(src, dest)) ||
(src - 1 === dest && isSameRow(src, dest)))
}
/**
* always returns empty array because of one step
* @return {[]}
*/
getSrcToDestPath(src, dest) {
return [];
}
}
希望有人能帮助我
如果你有检查的功能,以及检索所有动作的功能,那就很简单了。基本步骤:
- 检查当前玩家是否被选中。
- 检查是否有任何合法的走法。
- 如果玩家处于被将状态并且没有合法移动,那么它就是将死(如果没有合法移动但没有被检查则陷入僵局)。
在考虑国际象棋引擎(或其他相关棋盘游戏)时,棋盘表示是最重要的,特别是为了简化移动生成。一般选择是...
- 位板(一种高级技术)或
- 一维数组,棋盘周围有边框。
根据 isMovePossible
函数,您似乎已经在使用一维数组,但如果在棋盘周围添加边框,您会发现它更容易,因为它会大大简化和加快边界检查生成移动时。
通常在使用带边框棋盘的国际象棋引擎中,一维数组被解释为 10 x 12 数组,代表方块、棋子和边框。更具体地说,除了移动生成的起源之外,请参阅我的早期答案,它举例说明了带边板。
关于参考答案的一些注释...
- 该代码片段使用了 12 x 12 带边框的棋盘,尽管可以使用 10 x 12 带边框的棋盘并且仍然可以检查骑士移动的边界。
- 特殊的棋子移动(例如从起始方格开始的两个方格、过路人捕获和棋子升级)将需要超出代码片段中所呈现内容的特殊逻辑。
- 代码片段的最底部显示了单个棋子的移动生成技术,当然,当应用于所有对手棋子时,将有助于评估将死...
将带边框的棋盘与一系列移动偏移结合使用将简化您的工作...