【发布时间】:2018-01-24 10:57:36
【问题描述】:
如何在 chessboard.js 和 chess.js 中运行国际象棋游戏,但只允许白人玩家移动棋子? 我需要让它总是变白。如果我移动白边,我想在白边再移动。
我想制作一个“棋步游戏”,其中白方应消灭所有黑方,例如仅在 5 步中。这就是为什么我想让白方像正常游戏一样玩,但黑方保持静止(永远不要转弯,不可拖动)。
【问题讨论】:
标签: chessboard.js
如何在 chessboard.js 和 chess.js 中运行国际象棋游戏,但只允许白人玩家移动棋子? 我需要让它总是变白。如果我移动白边,我想在白边再移动。
我想制作一个“棋步游戏”,其中白方应消灭所有黑方,例如仅在 5 步中。这就是为什么我想让白方像正常游戏一样玩,但黑方保持静止(永远不要转弯,不可拖动)。
【问题讨论】:
标签: chessboard.js
这个问题比chessboard.js 更关注chess.js,因为chess.js 是您使用的国际象棋引擎。
这样做会破坏游戏历史。
首先,您可以覆盖电路板的onDragStart,例如:
var onDragStart = function(source, piece, position, orientation) {
// if it's not white, don't allow drag
if (piece.search(/^w/) === -1) ||
return false;
}
};
var cfg = {
draggable: true,
position: 'start',
onDragStart: onDragStart
};
var board = ChessBoard('board', cfg);
其次,你必须强制转弯。
如果您通过在 FEN 中占据位置并load将 FEN 发送到棋盘并将要移动的一侧设置为 W 来重新加载游戏,您将获得您想要的行为。
您可以稍微编辑chess.js 的来源,https://github.com/jhlywa/chess.js/issues/62 就像在那个问题中一样。作者发布了这个 sn-p 或在这里:
/* totally untested ... this will blow your game state/history */
function set_turn(chess, color) {
var tokens = chess.fen().split(' ');
tokens[1] = color;
chess.load(tokens.join(' '));
}
【讨论】:
我的 Chessboard JS 版本是 v.1.0.0。
最好的方法是使用Chessboard.js events。
在将配置传递给 Chessboard 对象时(在初始化时),您可以指定回调函数,当棋盘中发生某些事件时将调用该回调函数。
为了允许/阻止玩家移动棋子,我们需要为 onDragStart 指定回调并返回值 true 以允许该动作,否则返回 false。
例如,我们可以检查用户是谁或是否打开了任何标志。
还有几个参数传递给 onDragStart 函数来帮助您决定是否让用户移动棋子。
只需返回 false 以阻止移动,返回 true 以允许移动。
例如:
const chessboardConfig = {
position: 'start',
draggable: true,
onDragStart: onDragStart,
};
// Create chessboard and chess obj
const board = window.Chessboard('elementDomID', chessboardConfig);
function onDragStart(source, piece, position, orientation) {
// Validate side moving piece
return !((orientation === 'white' && piece.search(/^w/) === -1) ||
(orientation === 'black' && piece.search(/^b/) === -1));
}
【讨论】: