首先为车,炮的吃子判断方法代码如下
public void careat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
//为车的吃子判断方法,play为要移动的棋子也就是车,playQ[]数组是32个棋子数组,enemy是要被吃的敌人的棋子,chessRegretList是方便悔棋操作的记录
//棋子吃子前的状态的列表,man是对应吃子棋子的编号,beEat是记录被吃棋子的编号二者都是为了悔棋时便于恢复
int count=0;//用来统计吃子棋子与被吃棋子之间是否有棋子
//上下吃子的情况
if(play.getX()==enemy.getX()){
for(int i=0;i<32;i++){//进行32个棋子的判别
if(play.getY()<enemy.getY()){//为下吃子的情况
for(int j=play.getY()+57;j<enemy.getY();j+=57){//判断二者之间是否有其它棋子
if(playQ[i].getX()==play.getX()&&playQ[i].getY()==j&&playQ[i].died==false){
//表示吃棋子与被吃棋子之间存在一个棋子且该棋子没有被吃即died=false;
count++;
}
}
}else{//表示上吃子的情况
for(int j=enemy.getY()+57;j<play.getY();j+=57){//判断二者之间是否有其它棋子
if(playQ[i].getX()==play.getX()&&playQ[i].getY()==j&&playQ[i].died==false){
//表示吃棋子与被吃棋子之间存在一个棋子且该棋子没有被吃即died=false;
count++;
}
}
}
}//此时对于上下两种情况都进行了中间是否有棋子的判别中间棋子的个数就是count
if(count==0){
//吃子前先保存之前的状态便于悔棋时恢复
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegret.man=man;
chessRegretList.add(chessRegret);
enemy.setVisible(false);//令被吃棋子不可见
enemy.died=true;//用来标记表示该棋子已死(被吃)
play.setBounds(enemy.getX(),enemy.getY(),55,55);//令吃子棋子移动到被吃棋子位置
return;
}
}
//左右吃子的情况
if (play.getY() == enemy.getY()) {
for(int i = 0; i < 32; ++i) {
if (play.getX() > enemy.getX()) {//左吃子的判定
for(int j = enemy.getX() + 57; j < play.getX(); j += 57) {
if (playQ[i].getY() == play.getY() && playQ[i].getX() == j && playQ[i].isVisible()) {
++count;
}
}
} else {//否则即为右吃子
for(int j = play.getX(); j < enemy.getX(); j += 57) {
if (playQ[i].getY() == play.getY() && playQ[i].getX() == j && playQ[i].isVisible()) {
++count;
}
}
}
}
if (count == 0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.eatMan = beEat;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegret.man = man;
chessRegretList.add(chessRegret);
enemy.setVisible(false);
play.setBounds(enemy.getX(), enemy.getY(), 55, 55);
return;
}
}
}
public void cannonEat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
//为炮的吃子判断规则类其与车的吃子判断基本一致只不过只有当count===1时才执行吃子
int count=0;//用来统计吃子棋子与被吃棋子之间是否有棋子
//上下吃子的情况
if(play.getX()==enemy.getX()){
for(int i=0;i<32;i++){//进行32个棋子的判别
if(play.getY()<enemy.getY()){//为下吃子的情况
for(int j=play.getY()+57;j<enemy.getY();j+=57){//判断二者之间是否有其它棋子
if(playQ[i].getX()==play.getX()&&playQ[i].getY()==j&&playQ[i].died==false){
//表示吃棋子与被吃棋子之间存在一个棋子且该棋子没有被吃即died=false;
count++;
}
}
}else{//表示上吃子的情况
for(int j=enemy.getY()+57;j<play.getY();j+=57){//判断二者之间是否有其它棋子
if(playQ[i].getX()==play.getX()&&playQ[i].getY()==j&&playQ[i].died==false){
//表示吃棋子与被吃棋子之间存在一个棋子且该棋子没有被吃即died=false;
count++;
}
}
}
}//此时对于上下两种情况都进行了中间是否有棋子的判别中间棋子的个数就是count
if(count==1){
//吃子前先保存之前的状态便于悔棋时恢复
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegret.man=man;
chessRegretList.add(chessRegret);
enemy.setVisible(false);//令被吃棋子不可见
enemy.died=true;//用来标记表示该棋子已死(被吃)
play.setBounds(enemy.getX(),enemy.getY(),55,55);//令吃子棋子移动到被吃棋子位置
return;
}
}
//左右吃子的情况
if (play.getY() == enemy.getY()) {
for(int i = 0; i < 32; ++i) {
if (play.getX() > enemy.getX()) {//左吃子的判定
for(int j = enemy.getX() + 57; j < play.getX(); j += 57) {
if (playQ[i].getY() == play.getY() && playQ[i].getX() == j && playQ[i].isVisible()) {
++count;
}
}
} else {//否则即为右吃子
for(int j = play.getX(); j < enemy.getX(); j += 57) {
if (playQ[i].getY() == play.getY() && playQ[i].getX() == j && playQ[i].isVisible()) {
++count;
}
}
}
}
if (count == 1) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.eatMan = beEat;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegret.man = man;
chessRegretList.add(chessRegret);
enemy.setVisible(false);
play.setBounds(enemy.getX(), enemy.getY(), 55, 55);
return;
}
}
}
首先对于车的吃子判断方法:
ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat这就是吃子方法所对应的六个参数1为要进行吃子的棋子,2为32个棋子的数组,3为被吃掉棋子,4为保存吃子前状态的数组用于悔棋的恢复,5为记录吃子棋子的编号,6为被吃棋子的编号
其分为上下吃子以及左右吃子的情况,对于其中的上下吃子的情况,定义count是吃子棋子与被吃棋子之间的其它棋子的个数,具体方法在之前移动规则中已经介绍这里不再赘述,看代码以及注释即可,经历了该步骤后count即记录了吃子与将吃子之间的其它棋子的个数,进行判别如果count==0即中间没有其它棋子则进行吃子前状态的保存(此时有一点不一样多了一项eatMan的保存即被吃子编号的保存)并加入状态列表中,之后设置吃子的坐标为play.setBound(enemy.getX(),enmey.getY(),55,55)并将被吃子enemy的setVisivible与died分别设为false与true令其不可见,(