中国象棋红黑方各有多少颗棋子中,各个棋子的走法规则是什么

象棋中的各个棋子可以怎么放到什么位置?_百度知道
象棋中的各个棋子可以怎么放到什么位置?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
张飞李逵程咬金
张飞李逵程咬金
采纳数:18
获赞数:130
擅长:暂未定制
车马炮卒(兵)可以在棋盘的任意位置,象(相)因为只能走田字,所以只有14个位置,士只能在九宫里走,一共只有10个位置,将(帅)也只能在九宫里走,一共有18个位置。我这里说的都是总数,对于一方而言,车马炮仍然是棋盘任意位置,卒(兵)不过河时只能向前走,过河后可以横走,但是不能后退,也就是对方棋盘的任意位置,象(相)只有7个位置,士只有5个位置,将(帅)只有9个位置。
采纳数:299
获赞数:735
建议看一下象棋入门之类的书就明白了。
为你推荐:
其他类似问题
您可能关注的内容
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。JS 中国象棋(1):校验棋子走法 - WEB前端 - 伯乐在线
& JS 中国象棋(1):校验棋子走法
“JavaScript中国象棋程序” 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序。这是教程的第2节。
程序的最终效果。
这一节介绍棋子的走法。改进之后的程序,可以连续走动红方棋子,但要符合象棋规则。黑方(电脑方)暂时还不能回应。
2.1、走法表示
一个走法包括起点和终点,分别用sqSrc和pcDst表示一维棋局数组中的起点和终点。很容易想到,使用数组[sqSrc, pcDst]表示一个走法。但程序将来会处理大量的走法,使用数组表示走法太浪费内存。由于sqSrc和pcDst都是不超过255的整数(因为一维棋盘数组的大小是256),可以将sqSrc和pcDst压缩到一个整数中,算法如下:
JavaScript
function MOVE(sqSrc, sqDst) {
return sqSrc + (sqDst && 8);
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb
function MOVE(sqSrc, sqDst) {
return sqSrc + (sqDst && 8);}
如果想从压缩后的整数中,重新获取起点和终点,可分别使用以下函数:
JavaScript
// 获取走法的起点
function SRC(mv) {
return mv & 255;
// 获取走法的终点
function DST(mv) {
return mv && 8;
// 获取走法的起点function SRC(mv) {
return mv & 255;} // 获取走法的终点function DST(mv) {
return mv && 8;}
2.2、判断目标位置是否有本方棋子
如果目标位置有本方棋子,那么该走法肯定是不合法的。
设置一个变量pcSelfSide。走棋方为红方时pcSelfSide=8,走棋方为黑方时pcSelfSide=16。在上一节提到过:
红方棋子 & 8 = 1
黑方棋子 & 16 = 1
(终点棋子 & pcSelfSide) != 0 就说明终止位置有本方棋子,走法不合法。
另外,我们设置七个全局变量:
JavaScript
var PIECE_KING = 0; // 将
var PIECE_ADVISOR = 1; // 士
var PIECE_BISHOP = 2; // 象
var PIECE_KNIGHT = 3; // 马
var PIECE_ROOK = 4; // 车
var PIECE_CANNON = 5; // 炮
var PIECE_PAWN = 6; // 卒
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb
var PIECE_KING = 0; // 将var PIECE_ADVISOR = 1; // 士var PIECE_BISHOP = 2; // 象var PIECE_KNIGHT = 3; // 马var PIECE_ROOK = 4; // 车var PIECE_CANNON = 5; // 炮var PIECE_PAWN = 6; // 卒
来对棋子编号。例如,只要满足:
棋子数值 &#8211; pcSelfSide = PIECE_KING
那么这个棋子就是将(帅)。使用同样的方法,可以判断出其他六种棋子。
2.3、校验将(帅)的走法
将的走法有四个方向,如下图所示:
在一维数组中,1、2、3、4几个方向的起点和终点分别满足以下等式:
pcDst = sqSrc &#8211; 16
pcDst = sqSrc &#8211; 1
pcDst = sqSrc + 1
pcDst = sqSrc + 16
将(帅)的走法需要满足下面这两个条件:
(1)、终点sqSrc位于九宫
可使用一个辅助数组,标识出所有合法的位置。
JavaScript
var IN_FORT_ = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb
var IN_FORT_ = [&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,];
判断是否在九宫,使用函数
JavaScript
function IN_FORT(sq) {
return IN_FORT_[sq] != 0;
function IN_FORT(sq) {
return IN_FORT_[sq] != 0;}
(2)、pcDst &#8211; sqSrc等于-16、-1、1、16其中的一个。
设置一个数组16×32的一维数组
JavaScript
var LEGAL_SPAN = [
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
1234567891011121314151617181920212223242526272829303132333435
var LEGAL_SPAN = [&&&&&&&&&&&&&&&&&&&&&& 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&&0, 0, 0, 0, 0, 0, 0,];
在该数组中,(-16 + 256)、(-1 + 256)、(1 + 256)、(16 + 256)四个位置是1,其他位置都不是1。校验函数如下
JavaScript
function KING_SPAN(sqSrc, sqDst) {
return LEGAL_SPAN[sqDst - sqSrc + 256] = = 1;
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb
function KING_SPAN(sqSrc, sqDst) {&&return LEGAL_SPAN[sqDst - sqSrc + 256] = = 1;}
2.4、校验士的走法
士的走法也是四个方向,如下所示
士的4个方向分别满足以下等式:
pcDst = sqSrc &#8211; 17
pcDst = sqSrc &#8211; 15
pcDst = sqSrc + 15
pcDst = sqSrc + 17
士的走法需要满足下面这两个条件:
(1)、终点sqSrc位于九宫
这与将(帅)的判断方法相同
(2)、pcDst &#8211; sqSrc等于-17、-15、15、17其中的一个
在上面提到的辅助数组LEGAL_SPAN中,(-17 + 256)、(-15 + 256)、(15 + 256)、(17 + 256)四个位置是2,其他位置都不是2。检验函数如下
JavaScript
function ADVISOR_SPAN(sqSrc, sqDst) {
return LEGAL_SPAN[sqDst - sqSrc + 256] == 2;
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb
function ADVISOR_SPAN(sqSrc, sqDst) {&&return LEGAL_SPAN[sqDst - sqSrc + 256] == 2;}
2.5、校验象的走法
象的四个走法如下图所示,黑三角是相应的象眼位置
象的4个方向分别满足以下等式:
pcDst = sqSrc &#8211; 34
pcDst = sqSrc &#8211; 30
pcDst = sqSrc + 30
pcDst = sqSrc + 34
象的走法需要满足下面三个条件:
(1)、象不能过河
在程序中,棋局被表示为大小为256的一维数组,一半棋盘位于0到127,另一半位于128到255。
128的二进制是,右起第八位是1。128到255这些数的二进制,右起第8位都是1;0到127这些数的二进制,右起第8位都是0。因此,如果象没过河,也就是pcDst和sqSrc位于相同的一半棋盘,那么
(sqSrc ^ sqDst)二进制的右起第八位是0,((sqSrc ^ sqDst) & 256)等于0。判断函数如下:
JavaScript
// 如果从起点sqSrc到终点sqDst没有过河,则返回true;否则返回false
function SAME_HALF(sqSrc, sqDst) {
return ((sqSrc ^ sqDst) & 0x80) == 0;
// 如果从起点sqSrc到终点sqDst没有过河,则返回true;否则返回falsefunction SAME_HALF(sqSrc, sqDst) {&&return ((sqSrc ^ sqDst) & 0x80) == 0;}
(2)、pcDst &#8211; sqSrc等于-34、-30、34、30其中的一个
在上面提到的辅助数组LEGAL_SPAN中,(-34 + 256)、(-30 + 256)、(30 + 256)、(34 + 256)四个位置是3,其他位置都不是3。检验函数如下
JavaScript
function BISHOP_SPAN(sqSrc, sqDst) {
return LEGAL_SPAN[sqDst - sqSrc + 256] == 3;
function BISHOP_SPAN(sqSrc, sqDst) {&&return LEGAL_SPAN[sqDst - sqSrc + 256] == 3;}
(3)、象眼无棋子
象眼位于sqSrc和sqDst的中点,判断(sqSrc + sqDst)/2 的位置是否有棋子即可。
2.6、校验马的走法
马的8个走法如下图所示,黑三角是相应的马脚位置
马的8个方向满足以下等式:
pcDst = sqSrc &#8211; 33
pcDst = sqSrc &#8211; 31
pcDst = sqSrc &#8211; 18
pcDst = sqSrc + 14
pcDst = sqSrc &#8211; 14
pcDst = sqSrc + 18
pcDst = sqSrc + 31
pcDst = sqSrc + 33
对应的马脚分别位于:
sqSrc &#8211; 16
sqSrc &#8211; 16
sqSrc &#8211; 1
sqSrc &#8211; 1
sqSrc + 16
sqSrc + 16
马的走法需要满足下面两个条件:
(1)、pcDst &#8211; sqSrc等于-33、-31、-18、14、-14、18、31、33其中的一个
(2)、对应马脚的位置没有棋子
我们使用一个新的辅助数组,来判断马的走法是否合法。
JavaScript
var KNIGHT_PIN_ = [
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb
var KNIGHT_PIN_ = [&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,-16,&&0,-16,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0, -1,&&0,&&0,&&0,&&1,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0, -1,&&0,&&0,&&0,&&1,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0, 16,&&0, 16,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,&&0,];
该数组在(-33 + 256)、(-31 + 256)、(-18 + 256)、(14 + 256)、(-14 + 256)、(18 + 256)、(31 + 256)、(33 + 256)这8个位置分别存放了-1、-1、-16、-16、1、1、16、16,其他位置都是0。
设置变量sqPin满足:
sqPin = sqSrc + KNIGHT_PIN_[sqDst &#8211; sqSrc + 256]
如果马的走法满足条件(1),那么spPin就是马脚的位置;否则sqPin = sqSrc。
因此马的走法合法,只需要满足sqPin != sqSrc并且sqPin位置无棋子。
2.7、校验车、炮的走法
车的走法如下图所示:
沿着四条直线走,每个方向可一直向前走,直到:
(1)、走出棋盘
(2)、碰到本方棋子
(3)、吃掉对方棋子
例如方向1,每走一步都是在起点基础上-1;方向2是在起点基础上-16;方向3是在起点基础上+1;方向4是在起点基础上+16。
炮与车的行棋规则类似,也可以沿一个方向一直向前走,不过遇到棋子时,要越过去(也就是翻山)。翻山后,炮只能吃对方棋子,不能落到空位置。
具体校验算法可参看代码。
2.8、校验卒(兵)的走法
红兵的走法如下图所示:
过河前,只能向前走。过河后,可以左右走。
(1)、判断是否过河
以红方为例,红方是向上走。如果红方过河,则会走到棋盘0到127的位置,此时所处位置的二进制表示,右起第8位是0。(因为128的二进制是,这与之前讲过的SAME_HALF函数类似)
判断函数如下:
JavaScript
// sp是棋子位置,sd是走棋方(红方0,黑方1)。如果该位置已过河,则返回true;否则返回false。
function AWAY_HALF(sq, sd) {
return (sq & 0x80) == (sd && 7);
<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb<div class="crayon-num crayon-striped-num" data-line="crayon-5b6abb<div class="crayon-num" data-line="crayon-5b6abb
// sp是棋子位置,sd是走棋方(红方0,黑方1)。如果该位置已过河,则返回true;否则返回false。function AWAY_HALF(sq, sd) {&&return (sq & 0x80) == (sd && 7); }
如果兵已经过河,是可以左右走的,满足下面条件的走法一定合法:
AWAY_HALF(sq, sd) && (sqDst == sqSrc &#8211; 1 || sqDst == sqSrc + 1)
(2)、判断兵(卒)是否是向前走了一步
红兵向前走一步是sqSrc &#8211; 16,黑卒向前走一步是sqSrc + 16。可用如下函数得到兵(卒)向前一步的位置:
JavaScript
// sp是棋子位置,sd是走棋方(红方0,黑方1)。返回兵(卒)向前走一步的位置。
function SQUARE_FORWARD(sq, sd) {
return sq - 16 + (sd && 5);
// sp是棋子位置,sd是走棋方(红方0,黑方1)。返回兵(卒)向前走一步的位置。function SQUARE_FORWARD(sq, sd) {&&return sq - 16 + (sd && 5);}
因此,只要sqDst = = SQUARE_FORWARD(sq, sd),说明兵(卒)是向前走了一步,走法合法。
2.9、核心代码说明
本节的代码可以在
下载,也可以直接clone
git clone -b step-2 https://github.com/Royhoo/write-a-chinesechess-program
Board中新增或修改的主要属性和方法
(1)、sqSelected
当前被选中棋子的位置。
(2)、clickSquare(sq_)
用户点击棋盘时,我们分两种情况进行讨论:
1、当前棋盘上没有棋子被选中
也就是说sqSelected为0。如果点击的是己方棋子,那么直接选中该子
sqSelected = 点击的位置
2、当前棋盘上有棋子被选中
也就是说sqSelected不为0。如果这次点击的仍然是己方棋子,这说明用户重新选择了要走的棋子,
sqSelected = 新的点击的位置
如果这次点击的是对方棋子,或者是一个空位置,这说明用户是在走棋。起点是原来选中的位置,终点是当前选中的位置。
(3)、addMove(mv)
判断一步棋是否合法,如果合法,就执行这步棋。
Position中新增或修改的主要属性和方法
(1)、legalMove(mv)
判断步骤是否合法。合法返回true,非法返回false。
关于作者:

我要回帖

更多关于 中国象棋棋子 的文章

 

随机推荐