棋盘棋子绘制完成后,接下来玩家要移动棋子开始与机器对弈。
那么如何判断当前棋子移动合法?
棋盘中所有的位置坐标映射为一个二维数组效果图,蓝色数字代表数组维数
黑帅移动规则:不能出九宫格,走直线,每步只能走一格
黑士移动规则:不能出九宫格,走斜线,每步只能走一格
黑象移动规则:不能过河,走“田”字,象眼处没有棋子
马移动规则:马走"日",马蹄处没有棋子
车移动规则:走直线
兵移动规则:走直线,不能后退,过河前,只能向前,过了河,可左右移动,每步只能走一格
炮移动规则:走直线,隔棋吃棋子
了解完棋子移动规则。
我们用代码来实现如上规则
首先要把坐标转变为数组的维数
//二维数组
int[][] qizi;
//起始位置维数
int fromY, fromX;
//目的位置维数
int toY, toX;
// 起始位置是什么棋子
int moveChessID = qizi[fromX][fromY] ;
//黑帅
moveChessID == 1;
if (toY > 2 || toX < 3 || toX > 5 ) {//出了九宫格
return false;
} else if ((Math.round(toX-fromX) + Math.round(toY - fromY)) == 1) {
//只能走一格
return true;
} else {
return false;
}
//黑士
moveChessID == 5;
if (toY > 2 || toX < 3 || toX > 5) { //出了九宫格
return false;
} else if (Math.round(toX - fromX) == 1 && Math.round(toY - fromY) == 1) {
//走斜线,直走一格
return true;
} else {
return false;
}
//黑象
moveChessID == 6;
if (toY > 4) {//过河了
return false;
} else if (Math.roung(toY - fromY) == 2 && Math.round(toX - fromX) == 2) {
//走"田"字
int centerX = ( toY + fromY) / 2;
int centerY = (toX + fromX) / 2;
if (qizi[centerY][centerX] != 0) {// 象眼处有棋子
return false;
}
return true;
} else {
return false;
}
//黑马
moveChessID == 3;
if (Math.round(toY - fromY) == 2 && Math.round(toX - fromX) == 1) {
int centerY = (toY + fromY) / 2;
if (qizi[centerY][fromX] != 0) {//马蹄处有棋子
return false;
}
return true;
} else if (Math.round(toY - fromY) == 1 && Math.round(toX - fromX) == 2) {
int centerX = (toX + fromX) / 2;
if (qizi[fromY][centerX] != 0) {//马蹄处有棋子
return false;
}
return true;
} else {
return false;
}
//车
moveChessID == 2 || moveChessID == 9;
if (Math.round(toY - fromY) > 0 && Math.round(toX - fromX) == 0) {
//走的横竖线
if (toY > fromY) {
for (int i = fromY + 1 ; i < toY; i++) {
if (qizi[i][fromX] != 0) {
return false;
}
}
} else {
for (int i = toY - 1 ; i > fromY; i--) {
if (qizi[i][fromX] != 0) {
return false;
}
}
}
return true;
} else if (Math.round(toX - fromX) > 0 && Math.round(toY - fromY) == 0) {
//走的横线
if (toX > fromX) {
for (int i = fromX + 1 ; i < toX; i++) {
if (qizi[fromY][i] != 0) {
return false;
}
}
} else {
for (int i = toX - 1 ; i > fromX; i--) {
if (qizi[fromY][i] != 0) {
return false;
}
}
}
return true;
} else {
return false;
}
//黑士
moveChessID == 7;
if ((toY - fromY) < 0 ) {
//后退
return false;
} else if (fromY > 4) {//过了河
if () {
}
} else {//没过河
}