Java小程序游戏象棋3-吃子判断方法

首先为车,炮的吃子判断方法代码如下

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令其不可见,(

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光的样子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值