基于无库的将死函数-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 [];
    }
}

希望有人能帮助我

如果你有检查的功能,以及检索所有动作的功能,那就很简单了。基本步骤:

  1. 检查当前玩家是否被选中。
  2. 检查是否有任何合法的走法。
  3. 如果玩家处于被将状态并且没有合法移动,那么它就是将死(如果没有合法移动但没有被检查则陷入僵局)。

在考虑国际象棋引擎(或其他相关棋盘游戏)时,棋盘表示是最重要的,特别是为了简化移动生成。一般选择是...

  • 位板(一种高级技术)或
  • 一维数组,棋盘周围有边框。

根据 isMovePossible 函数,您似乎已经在使用一维数组,但如果在棋盘周围添加边框,您会发现它更容易,因为它会大大简化和加快边界检查生成移动时。

通常在使用带边框棋盘的国际象棋引擎中,一维数组被解释为 10 x 12 数组,代表方块、棋子和边框。更具体地说,除了移动生成的起源之外,请参阅我的早期答案,它举例说明了带边板。

关于参考答案的一些注释...

  • 该代码片段使用了 12 x 12 带边框的棋盘,尽管可以使用 10 x 12 带边框的棋盘并且仍然可以检查骑士移动的边界。
  • 特殊的棋子移动(例如从起始方格开始的两个方格、过路人捕获和棋子升级)将需要超出代码片段中所呈现内容的特殊逻辑。
  • 代码片段的最底部显示了单个棋子的移动生成技术,当然,当应用于所有对手棋子时,将有助于评估将死...

将带边框的棋盘与一系列移动偏移结合使用将简化您的工作...