象棋源码解析:走法规则

281 阅读2分钟

本篇讲解象棋的走法规则源码。

源码地址:github.com/itlwei/Ches…

如果你想自己做一个象棋游戏,那么首先遇到的问题应该就是棋子的走法的定义了。当我们点击棋子的时候,电脑是怎么知道这颗棋子可以走到哪些点上呢?想知道这些的话,就一起来揭开它神秘的面纱吧。

先看看最简单的卒的走法规则吧:

// 卒的走法规则
// 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;
}

其他的棋子就不一一举例了,有兴趣的可以去下载源码看看,还是可以学习到些东西的。