首先为车,炮的吃子判断方法代码如下
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令其不可见,(被吃只是说该棋子不可见并非消失了)再退出该方法即可.至于之后的左右吃子的情况,基本思想一致,只是参数数值或加减法有些不一致可以根据代码以及注释进行理解。
之后对于炮的吃子判断方法:只需将车的吃子判断方法体完全复制下来,并将count==0改为count==1即只有当中间隔了一个棋子的时候才能进行吃子.如此即完成炮和车的吃子判断方法的书写。
之后为马象的吃子判断,代码如下:
public void horseEat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
//马吃子规则的方法具体方法的参数意义与之前一致
int canGo=1;//看是否有马腿而不能走,如果能走值为1否则为0
//左上与右上情况的拌马腿位置一致可以总结一起
if((play.getX()-57==enemy.getX()||play.getX()+57==enemy.getX())&&(play.getY()-114==enemy.getY())){
//此时判断语句表示要吃操作的棋子与被吃的棋子位置满足马的左上与右上情况
for(int i=0;i<32;i++){//对32个棋子进行查看是否有刚好在马腿位置的棋子
if(playQ[i].getX()==play.getX()&&playQ[i].getY()==play.getY()-57&&playQ[i].died==false){//满足则表示有马腿不能吃子
canGo=0;
}
}
if(canGo==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.getX() - 57 == enemy.getX() || play.getX() + 57 == enemy.getX()) && play.getY() + 114 == enemy.getY()) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].getX() == play.getX() && playQ[i].getY() == play.getY() + 57 && playQ[i].died==false) {
canGo = 0;
}
}
if (canGo==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;
}
}
//左左下和左左上情况
if (play.getX() - 114 == enemy.getX() && (play.getY() - 57 == enemy.getY() || play.getY() + 57 == enemy.getY())) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].getX() - 57 == play.getX() && playQ[i].getY() == play.getY() && playQ[i].died==false) {
canGo = 0;
}
}
if (canGo==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;
}
}
//右右上和右右下情况
if (play.getX() + 114 == enemy.getX() && (play.getY() - 57 == enemy.getY() || play.getY() + 57 == enemy.getY())) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].getX() + 57 == play.getX() && playQ[i].getY() == play.getY() && playQ[i].died==false) {
canGo = 0;
}
}
if (canGo==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;
}
}
}
public void elephantEat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
//象吃子判别的方法具体参数与其它的一致,除了包含四种吃子情况外还要进行红黑的判别因为象无法过河
int canGo=1;//用于判别是否有象腿而是否能移动若为1表示能吃0则表示不能吃
int judge=play.getName().charAt(1)-'0';//用来判断该棋子是红象还是黑象
//左上吃子情况
if(play.getX()-114==enemy.getX()&&play.getY()-114==enemy.getY()){
if((judge==1&&enemy.getY()<=455)||(judge==2&&enemy.getY()>=512)){
//表示若为黑象(judge==1)则y的坐标要小于455若为红象(judge==2)则y的坐标要大于512
for(int i=0;i<32;i++){//判断是否存在绊象腿的操作
if(playQ[i].getX()==play.getX()-57&&playQ[i].getY()==play.getY()-57&&playQ[i].died==false){
canGo=0;//令之为0即表示此时有绊象腿的情况无法移动
}
}
}
if(canGo==1){
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
enemy.setVisible(false);
play.setBounds(enemy.getX(),enemy.getY(),55,55);//基本操作与之前的吃子一般
return;
}
}
//右上吃子情况
if (play.getX() + 114 == enemy.getX() && play.getY() - 114 == enemy.getY() && (judge == 1 && enemy.getY() <= 455 || judge == 2 && enemy.getY() >= 512)) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].getX() == play.getX() + 57 && playQ[i].getY() == play.getY() - 57 && playQ[i].died==false) {
canGo = 0;
}
}
if (canGo==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;
}
}
//左下吃子情况
if (play.getX() - 114 == enemy.getX() && play.getY() + 114 == enemy.getY() && (judge == 1 && enemy.getY() <= 455 || judge == 2 && enemy.getY() >= 512)) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].getX() == play.getX() - 57 && playQ[i].getY() == play.getY() + 57 && playQ[i].died==false) {
canGo = 0;
}
}
if (canGo==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;
}
}
//右下吃子情况
if (play.getX() + 114 == enemy.getX() && play.getY() + 114 == enemy.getY() && (judge == 1 && enemy.getY() <= 455 || judge == 2 && enemy.getY() >= 512)) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].getX() == play.getX() + 57 && playQ[i].getY() == play.getY() + 57 && playQ[i].died==false) {
canGo = 0;
}
}
if (canGo==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;
}
}
}
首先对于马的吃子判断方法,定义canGo=1若为0则表示此时有马腿存在不能吃子,对于马腿的情况可以将八种情况分为四种情况因为总有两种情况的马腿位于同一位置,对于马腿的判断之前的移动方法中已经介绍完毕,此时根据代码注释进行理解即可,如果有马腿存在将canGO设为0之后如果canGo==1表示可以吃子,按照之前的吃子函数直接复制下来即可,并结束方法,其它的三种方法均为该中方法上的部分修改,换汤不换药看代码进行理解即可。
之后对于象的吃子判断同马的吃子判断方法一致,也定义一变量canGo=1来表示是否存在象腿,象腿的存在判断也不再赘述,直接当canGo==1时进行状态的保存以及棋子位置的改变和被吃棋子变为不可见的操作,至此象的吃子操作也介绍完毕,具体查看代码以及注释进行具体理解。
最后为士,帅,卒的吃子判断以及当将帅相遇时的处理方法
public void chapEat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
//士的吃子判断方法且士的走子只能是斜着走
int canGo=1;
int judge=play.getName().charAt(1)-'0';
//左上坐标情况
if(enemy.getX()==play.getX()-57&&enemy.getY()==play.getY()-57){
if(judge==1){//表示此时为黒士
if((enemy.getY()==56&&enemy.getX()==195)||(enemy.getY()==113&&enemy.getX()==252)){
//用罗列的方法写出所有满足左上情况的被吃棋子的位置表示满足左上情况的要求
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
enemy.setVisible(false);
play.setBounds(enemy.getX(),enemy.getY(),55,55);
return;
}
}
if(judge==2){//表示此时为红士情况
if((enemy.getY()==455&&enemy.getX()==195)||(enemy.getY()==512&&enemy.getX()==252)){
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
enemy.setVisible(false);
play.setBounds(enemy.getX(),enemy.getY(),55,55);
return;
}
}
}
//右上情况
if (enemy.getX() == play.getX() + 57 && enemy.getY() == play.getY() - 57) {
if (judge == 1 && (enemy.getY() == 56 && enemy.getX() == 309 || enemy.getY() == 113 && enemy.getX() == 252)) {
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;
}
if (judge == 2 && (enemy.getY() == 455 && enemy.getX() == 309 || enemy.getY() == 512 && enemy.getX() == 252)) {
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;
}
}
//左下情况
if (enemy.getX() == play.getX() - 57 && enemy.getY() == play.getY() + 57) {
if (judge == 1 && (enemy.getY() == 170 && enemy.getX() == 195 || enemy.getY() == 113 && enemy.getX() == 252)) {
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;
}
if (judge == 2 && (enemy.getY() == 569 && enemy.getX() == 195 || enemy.getY() == 512 && enemy.getX() == 252)) {
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;
}
}
//右下情况
if (enemy.getX() == play.getX() + 57 && enemy.getY() == play.getY() + 57) {
if (judge == 1 && (enemy.getY() == 170 && enemy.getX() == 309 || enemy.getY() == 113 && enemy.getX() == 252)) {
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;
}
if (judge == 2 && (enemy.getY() == 569 && enemy.getX() == 309 || enemy.getY() == 512 && enemy.getX() == 252)) {
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 masterEat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
int canGo=1;
int judge=play.getName().charAt(1)-'0';
//向上吃子的情况
if(enemy.getX()==play.getX()&&enemy.getY()==play.getY()-57){
if(judge==1){//为黑将
if((enemy.getX()==252&&enemy.getY()==56)||(enemy.getX()==252&&enemy.getY()==113)||(enemy.getX()==195&&enemy.getY()==56)
||(enemy.getX()==195&&enemy.getY()==113)||(enemy.getX()==309&&enemy.getY()==56)||(enemy.getX()==309&&enemy.getY()==113)){
//最简单的方法:将六个被吃子列举全部即可
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
enemy.setVisible(false);
play.setBounds(enemy.getX(),enemy.getY(),55,55);
return;
}
}
if(judge==2){//为红帅向上吃子情况
if((enemy.getX()==252&&enemy.getY()==455)||(enemy.getX()==252&&enemy.getY()==512)||(enemy.getX()==195&&enemy.getY()==455)||
(enemy.getX()==195&&enemy.getY()==512)||(enemy.getX()==309&&enemy.getY()==455)||(enemy.getX()==309&&enemy.getY()==512)){
//同样将所有被吃子的六种情况列举完毕
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
enemy.setVisible(false);
play.setBounds(enemy.getX(),enemy.getY(),55,55);
return;
}
}
}
//向下吃子情况从此情况开始的三种情况思想与第一种一般不再赘述
if (enemy.getX() == play.getX() && enemy.getY() == play.getY() + 57) {
if (judge == 1 && (enemy.getX() == 252 && enemy.getY() == 170 || enemy.getX() == 252 && enemy.getY() == 113 || enemy.getX() == 109 && enemy.getY() == 170 || enemy.getX() == 109 && enemy.getY() == 113 || enemy.getX() == 309 && enemy.getY() == 170 || enemy.getX() == 309 && enemy.getY() == 113)) {
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;
}
if (judge == 2 && (enemy.getX() == 252 && enemy.getY() == 569 || enemy.getX() == 252 && enemy.getY() == 512 || enemy.getX() == 109 && enemy.getY() == 569 || enemy.getX() == 109 && enemy.getY() == 512 || enemy.getX() == 309 && enemy.getY() == 569 || enemy.getX() == 309 && enemy.getY() == 512)) {
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;
}
}
//向左吃子情况
if (enemy.getX() == play.getX() - 57 && enemy.getY() == play.getY()) {
if (judge == 1 && (enemy.getX() == 252 && enemy.getY() == 56 || enemy.getX() == 195 && enemy.getY() == 56 || enemy.getX() == 252 && enemy.getY() == 113 || enemy.getX() == 195 && enemy.getY() == 113 || enemy.getX() == 252 && enemy.getY() == 170 || enemy.getX() == 195 && enemy.getY() == 170)) {
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;
}
if (judge == 2 && (enemy.getX() == 252 && enemy.getY() == 455 || enemy.getX() == 195 && enemy.getY() == 455 || enemy.getX() == 252 && enemy.getY() == 512 || enemy.getX() == 195 && enemy.getY() == 512 || enemy.getX() == 252 && enemy.getY() == 569 || enemy.getX() == 195 && enemy.getY() == 569)) {
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;
}
}
//向右吃子情况
if (enemy.getX() == play.getX() + 57 && enemy.getY() == play.getY()) {
if (judge == 1 && (enemy.getX() == 252 && enemy.getY() == 56 || enemy.getX() == 309 && enemy.getY() == 56 || enemy.getX() == 252 && enemy.getY() == 113 || enemy.getX() == 309 && enemy.getY() == 113 || enemy.getX() == 252 && enemy.getY() == 170 || enemy.getX() == 309 && enemy.getY() == 170)) {
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;
}
if (judge == 2 && (enemy.getX() == 252 && enemy.getY() == 455 || enemy.getX() == 309 && enemy.getY() == 455 || enemy.getX() == 252 && enemy.getY() == 512 || enemy.getX() == 309 && enemy.getY() == 512 || enemy.getX() == 252 && enemy.getY() == 569 || enemy.getX() == 309 && enemy.getY() == 569)) {
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 soliderEat(ChessMainBehavior play,ChessMainBehavior playQ[],ChessMainBehavior enemy,List<ChessRegret> chessRegretList,int man,int beEat){
//卒子吃子判断的方法具体参数的意义与之前一致
int judge=play.getName().charAt(1)-'0';//用来判断是黑卒还是红卒
//向上走的情况
if(enemy.getX()==play.getX()&&enemy.getY()==play.getY()-57){
if(judge==2){//为红卒情况因为只有红卒才能够向上走且不用判别是否过河
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
play.setBounds(enemy.getX(),enemy.getY(),55,55);
return;
}
}
//向下走的情况
if(enemy.getX()==play.getX()&&enemy.getY()==play.getY()+57){
if(judge==1){//为黑卒情况因为只有红卒才能够向下走且不用判别是否过河
ChessRegret chessRegret=new ChessRegret();
chessRegret.eatMan=beEat;
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
enemy.died=true;
play.setBounds(enemy.getX(),enemy.getY(),55,55);
return;
}
}
//向左走的情况只需在上述情况的基础上加一个过河的判断方法
if (enemy.getX() == play.getX() - 57 && enemy.getY() == play.getY()) {
if (judge == 1 && enemy.getY() >= 341) {
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;
}
if (judge == 2 && enemy.getY() < 341) {
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;
}
}
//向右吃子的情况
if (enemy.getX() == play.getX() + 57 && enemy.getY() == play.getY()) {
if (judge == 1 && enemy.getY() >= 341) {
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;
}
if (judge == 2 && enemy.getY() < 341) {
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 int masterMeet(ChessMainBehavior playQ[]){
//该方法用于判断将帅是否碰面的情况,参数为32个棋子用返回值来表示是否发生了碰面0表示未碰面1表示发生了碰面
if(playQ[30].getX()!=playQ[31].getX()){//将和帅的棋子编号分别为30与31
return 0;
}
int count=0;//用来存储当将帅碰面时候中间的棋子数目
int cx=playQ[30].getX();//为黑将的x坐标
for(int j=playQ[30].getY()+57;j<playQ[31].getY();j+=57){//表示循环遍历从黑将到红帅之间的棋盘上的所有格子
for(int i=0;i<32;i++){//对于二者之间的每一个格子都遍历32个棋子看是否有棋子在该格子上面
if(playQ[i].getX()==cx&&playQ[i].getY()==j&&playQ[i].died==false){
count++;//表示将帅中轴线之间存在其它棋子为此令记录count加一
}
}
}
if(count>0){//表示二者之间有其它棋子不会发生碰见返回值为0
return 0;
}
//若上一个if语句未执行则表明将帅之间没有棋子即发生了碰面
return 1;
}
首先对于士的情况共有四种每种均需要判断吃子棋子为黑士还是红士并且列举出(各自情况下的两种处于该情况下的被吃棋子的坐标)之后进行吃子前状态的保存并存入数组,之后将吃子棋子的坐标设为被吃棋子的坐标大小保持不变,之后令被吃棋子不可见且为死的。其它的三种情况也与这种情况基本一致,只需要根据参数的修改即可看代码和注释加以理解强化.
之后对于将帅的情况:与士吃子得情况基本一致,也是分为四大情况,针对其中的每个情况,先判断是否为黑将,若是将黑将在该情况吃子士对应的6个被吃棋子的坐标以或的形式罗列出来,若满足其中之一,则进行吃子前状态的保存并存入列表,再将吃子棋子位置设置为被吃棋子大小保持不变,之后令被吃棋子不可变并为死的,如果为红将在该情况吃子士对应的6个被吃棋子的坐标以或的形式罗列出来,若满足其中之一,则进行吃子前状态的保存并存入列表,再将吃子棋子位置设置为被吃棋子大小保持不变,之后令被吃棋子不可变并为死的。此时该情况下即得到解决其它三种情况按照该方法进行相同形式的书写即可实现,具体看代码以及注释进行理解即可。
其次对于卒子的吃子情况:分为四种情况,分别为向上吃子(只能为红卒)向下吃子(只能为黑卒),向左走与向右走(这两种情况要进行卒子类型的判断以及是否过河的判断)具体和移动棋子的方法类似,可以直接根据代码进行理解即可。
最终对于将帅相遇的方法判断:
public int masterMeet(ChessMainBehavior playQ[])其参数为32个棋子所在的数组,其具备一个返回值若返回为0表示未碰面为1表示发生了碰面
首先黑将与红将的编号分别为30与31先判别二者的x轴左边是否一致若不一致直接返回0即一定不会碰面,之后当x坐标一致时,直接从黑将的下一个格子开始知道红将的上一个格子结束,不断遍历其中的所有格子,并遍历32个棋子,观察是否有棋子在这起格子上,若有一个则将count(记录二将之间的其它棋子的个数)加一,最后判断如果count==0表示二将相遇了直接return 1;若count>0则表示二将未相遇直接返回0即可。
到此时为止吃子判断与将帅相遇方法的判定均已完成,之后为对于整个程序的完善以及小幅度修改。