Files
cheers/js/CMoveRule.js
进进啊 7c44a0d056 commit
2022-01-06 08:59:42 +08:00

354 lines
7.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 该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;
}
}
}