// 该js文件中的函数主要是用于控制棋子路径,使其符合象棋的游戏规则,如马走日,象走田等。 // 设置小兵的路径规则 function binMove(tmap, c, y, x) { //0红 1黑 var w; var h = 0; if (c == 0) { w = y < 5; h = -1; } else { w = y > 4; h = 1; } if (w) { if (y + h >= 0 && y + h < map.length) { var t1 = []; t1[0] = y + h; t1[1] = x; tmap.push(t1); } var t2 = []; var t3 = []; t2[0] = y; t3[0] = y; t2[1] = x - 1; t3[1] = x + 1; tmap.push(t2); tmap.push(t3); } else { var t = []; t[0] = y + h; t[1] = x; tmap.push(t); } } // 设置炮直线和竖线移动 function paoMove(tmap, c, y, x) { paoMove_(tmap, 0, c, y, x); paoMove_(tmap, 1, c, y, x); paoMove_(tmap, 2, c, y, x); paoMove_(tmap, 3, c, y, x); } // 设置炮隔子移动 function paoMove_(tmap, d, c, y, x) { //0上1左2下3右 var q = y, w = x, qi = 0, wi = 0, ci = 0; //ci:0红 1黑 if (c == 0) { ci = 1; } else { ci = -1; } var cc; switch (d) { case 0: cc = function (q) { return q >= 0; }; qi = -1; break; case 1: cc = function (q, w) { return w >= 0; }; wi = -1; break; case 2: cc = function (q) { return q < map.length; }; qi = 1; break; case 3: cc = function (q, w) { return w < map.length; }; wi = 1; break; } var ce = false; while (true) { if (!cc(q, w)) break; if (q == y && w == x) { q += qi; w += wi; continue; } if (map[q][w] == 0) { if (!ce) { var t = []; t[0] = q; t[1] = w; tmap.push(t); } } else { if (ce) { if (map[q][w] * ci < 0) { var t = []; t[0] = q; t[1] = w; tmap.push(t); ce = false; break; } } ce = true; } q += qi; w += wi; } } // 设置车的路径规则 function juMove(tmap, c, y, x) { for (var q = y; q >= 0; q--) { if (q == y) continue; if (!fastMove(tmap, c, q, x)) break; } for (var q = x; q >= 0; q--) { if (q == x) continue; if (!fastMove(tmap, c, y, q)) break; } for (var q = y; q < map.length; q++) { if (q == y) continue; if (!fastMove(tmap, c, q, x)) break; } for (var q = x; q < map.length; q++) { if (q == x) continue; if (!fastMove(tmap, c, y, q)) break; } } // 设置车的水平和垂直移动 function fastMove(tmap, c, y, x) { //c:0红 1黑 var ci = 0; if (c == 0) { ci = 1; } else { ci = -1; } if (map[y][x] == 0) { var t = []; t[0] = y; t[1] = x; tmap.push(t); return true; } else { if (map[y][x] * ci < 0) { var t = []; t[0] = y; t[1] = x; tmap.push(t); } return false; } } // 设置马的路径规则 function maMove(tmap, c, y, x) { function fastMa(tmap, y, x, ys, xs, c) { if ( y + ys < map.length && y + ys >= 0 && x + xs < map.length && x + xs >= 0 ) if (map[y + ys][x + xs] == 0) { var yz = 0, xz = 0; if (ys == 0) { yz = -1; } else { xz = -1; } if ( y + ys + ys - yz < map.length && y + ys + ys - yz >= 0 && x + xs + xs - xz < map.length && x + xs + xs - xz >= 0 ) if (map[y + ys + ys - yz][x + xs + xs - xz] * c <= 0) { var t = []; t[0] = y + ys + ys - yz; t[1] = x + xs + xs - xz; tmap.push(t); } if ( y + ys + ys + yz < map.length && y + ys + ys + yz >= 0 && x + xs + xs + xz < map.length && x + xs + xs + xz >= 0 ) if (map[y + ys + ys + yz][x + xs + xs + xz] * c <= 0) { var t1 = []; t1[0] = y + ys + ys + yz; t1[1] = x + xs + xs + xz; tmap.push(t1); } } } var cc = 0; if (c == 0) { cc = 1; } else { cc = -1; } fastMa(tmap, y, x, -1, 0, cc); fastMa(tmap, y, x, 1, 0, cc); fastMa(tmap, y, x, 0, -1, cc); fastMa(tmap, y, x, 0, 1, cc); } // 设置象的路径规则 function xiangMove(tmap, c, y, x) { //c:0红 1黑 function fastXiang(tmap, y, x, yy, xx, c, cy) { if ( y + yy * 2 < map.length && y + yy * 2 >= 0 && x + xx * 2 < map.length && x + xx * 2 >= 0 ) { if (cy(y + yy * 2)) if (map[y + yy][x + xx] == 0) { if (map[y + yy * 2][x + xx * 2] * c <= 0) { var t = []; t[0] = y + yy * 2; t[1] = x + xx * 2; tmap.push(t); } } } } var cc = 0; if (c == 0) { cc = 1; } else { cc = -1; } var ch; if (c == 0) { ch = function (y) { return y > 4; }; } else { ch = function (y) { return y < 5; }; } fastXiang(tmap, y, x, 1, 1, cc, ch); fastXiang(tmap, y, x, 1, -1, cc, ch); fastXiang(tmap, y, x, -1, 1, cc, ch); fastXiang(tmap, y, x, -1, -1, cc, ch); } // 设置士的路径规则 function shiMove(tmap, c, y, x) { //c:0红 1黑 function fastShi(tmap, y, x, yy, xx, c, cc) { if (cc(y + yy)) { if (x + xx >= 3 && x + xx <= 5) { if (map[y + yy][x + xx] * c <= 0) { var t = []; t[0] = y + yy; t[1] = x + xx; tmap.push(t); } } } } var cf; var cc = 0; if (c == 0) { cc = 1; cf = function (y) { return y >= 7 && y <= 9; }; } else { cf = function (y) { return y >= 0 && y <= 2; }; cc = -1; } fastShi(tmap, y, x, 1, 1, cc, cf); fastShi(tmap, y, x, -1, 1, cc, cf); fastShi(tmap, y, x, 1, -1, cc, cf); fastShi(tmap, y, x, -1, -1, cc, cf); } // 设置将和帅的路径规则 function JSMove(tmap, c, y, x) { function fastJS(tmap, y, x, yy, xx, c, cc) { if (cc(y + yy)) { if (x + xx >= 3 && x + xx <= 5) { if (map[y + yy][x + xx] * c <= 0) { var t = []; t[0] = y + yy; t[1] = x + xx; tmap.push(t); } } } } var cf; var cc = 0; if (c == 0) { cc = 1; cf = function (y) { return y >= 7 && y <= 9; }; } else { cf = function (y) { return y >= 0 && y <= 2; }; cc = -1; } fastJS(tmap, y, x, 1, 0, cc, cf); fastJS(tmap, y, x, -1, 0, cc, cf); fastJS(tmap, y, x, 0, -1, cc, cf); fastJS(tmap, y, x, 0, 1, cc, cf); if (c == 0) { for (var q = y - 1; q < map.length && q >= 0; q--) { if (map[q][x] == 0) { continue; } if (map[q][x] == -7) { var t = []; t[0] = q; t[1] = x; tmap.push(t); } else break; } } else { for (var q = y + 1; q < map.length && q >= 0; q++) { if (map[q][x] == 0) { continue; } if (map[q][x] == 7) { var t = []; t[0] = q; t[1] = x; tmap.push(t); } else break; } } }