本篇讲解象棋的走法规则源码。
如果你想自己做一个象棋游戏,那么首先遇到的问题应该就是棋子的走法的定义了。当我们点击棋子的时候,电脑是怎么知道这颗棋子可以走到哪些点上呢?想知道这些的话,就一起来揭开它神秘的面纱吧。
先看看最简单的卒的走法规则吧:
// 卒的走法规则
// x 点击的棋子的x坐标
// y 点击的棋子的y坐标
// map 当前的棋盘
// my 己方 1 敌方 -1
// map为一个二维数组,如果是初始棋盘,那它应该是这样子的:
// map = [
// [ "车", "马", "象", "仕", "将", "仕", "象", "马", "车" ],
// [ , , , , , , , , ],
// [ , "炮", , , , , , "炮", ],
// [ "卒", , "卒", , "卒", , "卒", , "卒" ],
// [ , , , , , , , , ],
// [ , , , , , , , , ],
// [ "兵", , "兵", , "兵", , "兵", , "兵" ],
// [ , "炮", , , , , , "炮", ],
// [ , , , , , , , , ],
// [ "车", "马", "相", "士", "帅", "士", "相", "马", "车" ]
// ]
com.bylaw.z = function (x, y, map, my) {
var d = []; // 可走的点集合,最终渲染出这些点即可得到UI效果了。
if (my === 1) { //红方
// 上
// y-1 >= 0 没有走出最上方棋盘
// !com.mans[map[y-1][x]] 它的上方位置没有棋子
// com.mans[map[y-1][x]].my!=my 它的上方位置是敌方棋子
if ( y-1 >= 0 && (!com.mans[map[y-1][x]] || com.mans[map[y-1][x]].my != my)) d.push([x, y-1]);
// 右
// x+1 <= 8 在棋盘范围内(未超过最右边)
// y <= 4 已过河
// !com.mans[map[y][x+1]] 它的右方位置没有棋子
// com.mans[map[y][x+1]].my!=my 它的右方位置是敌方棋子
if ( x+1 <= 8 && y <=4 && (!com.mans[map[y][x+1]] || com.mans[map[y][x+1]].my != my)) d.push([x+1, y]);
// 左
// x-1 >= 0 在棋盘范围内(未超过最左边)
// y <= 4 已过河
// !com.mans[map[y][x-1]] 它的左方位置没有棋子
// com.mans[map[y][x-1]].my!=my 它的左方位置是敌方棋子
if ( x-1 >= 0 && y <=4 && (!com.mans[map[y][x-1]] || com.mans[map[y][x-1]].my != my))d.push([x-1, y]);
} else {
//下
if ( y+1 <= 9 && (!com.mans[map[y+1][x]] || com.mans[map[y+1][x]].my!=my)) d.push([x, y+1]);
//右
if ( x+1 <= 8 && y >= 6 && (!com.mans[map[y][x+1]] || com.mans[map[y][x+1]].my != my)) d.push([x+1, y]);
//左
if ( x-1 >= 0 && y >= 6 && (!com.mans[map[y][x-1]] || com.mans[map[y][x-1]].my != my))d.push([x-1, y]);
}
return d;
}
还是有点意思的吧,来看看炮的走法规则吧:
// 炮
com.bylaw.p = function (x,y,map,my) {
var d = [];
// 左侧检索
var n = 0;
for (var i = x - 1; i >= 0; i--) {
// 有棋子
if (map[y][i]) {
if (n == 0) {
n++;
continue;
} else {
// 该位置是敌方棋子(炮的跳吃法)
if (com.mans[map[y][i]].my != my) d.push([i,y]);
break
}
} else {
if(n == 0) d.push([i,y])
}
}
// 右侧检索
var n = 0;
for (var i = x + 1; i <= 8; i++){
// 有棋子
if (map[y][i]) {
if (n == 0) {
n++;
continue;
} else {
// 该位置是敌方棋子(炮的跳吃法)
if (com.mans[map[y][i]].my != my) d.push([i,y]);
break
}
} else {
if(n == 0) d.push([i,y])
}
}
// 上检索
var n=0;
for (var i = y - 1; i >= 0; i--){
// 有棋子
if (map[i][x]) {
if (n == 0) {
n++;
continue;
} else {
// 该位置是敌方棋子(炮的跳吃法)
if (com.mans[map[i][x]].my != my) d.push([x,i]);
break
}
} else {
if(n == 0) d.push([x,i])
}
}
// 下检索
var n = 0;
for (var i = y + 1; i <= 9; i++){
// 有棋子
if (map[i][x]) {
if (n == 0){
n++;
continue;
} else {
// 该位置是敌方棋子(炮的跳吃法)
if (com.mans[map[i][x]].my != my) d.push([x,i]);
break
}
} else {
if(n == 0) d.push([x,i])
}
}
return d;
}
其他的棋子就不一一举例了,有兴趣的可以去下载源码看看,还是可以学习到些东西的。