势必拿下SpringBoot 2021-10-30 15:05 采纳率: 100%
浏览 24
已结题

关于中国象棋中炮吃子出现的问题

一下是我关于炮上下吃子的判断的方法,我的程序运行后炮是可以实现向下吃子的功能的,但是纯在的问题是炮不能实现向上吃子的功能而且炮可以在目标棋子之间没有棋子的情况下吃掉目标棋子。(请帮我指出代码中的不足)我已经呆呆的看了自己的代码2个多小时了试过改数值和嵌套都还是改变不了原来的问题

public void cannoRule(ChessMainBehavior play,ChessMainBehavior playQ[],MouseEvent me,List<ChessRegret> chessRegretList,int man){
        int count=0;//统计中间隔了多少个棋子
        int cx=me.getX();//得到鼠标点击的横坐标
        int cy=me.getY()+30;//鼠标点击的纵坐标,坐标加上30px是因为我们的窗体上工具栏占用了30px
        //判断棋子没有左右移动
        if(cx-play.getX()>=0 && cx-play.getX()<57){
            //cx是鼠标点击的位置-棋子的位置,
            //保证了我们的上下移动和左右移动因为气质的像素是5555棋子间的间隔为2所以是57
            //所以每个格子的间隔是57   
            
            //26是棋子的开始的高度因为有一半的棋子是在网格外的(细品)
            //棋盘中是26相加但是要加上工具栏的高度30所以是56
            //569是棋盘总高度
            for(int i=56;i<=569;i+=57){
                if(cy-i>=0 && cy-i<57){
                    for(int j=0;j<32;j++){
                        if(playQ[j].getX()==play.getX() && play.getName()!=playQ[j].getName() && playQ[j].died==false){
                        //                                      //判定这个棋子不是自己                           //并且这个棋子是显示的
                            for(int k=i;k<play.getY();k+=57){
                                if(playQ[j].getY()==k){
                                count++;
                                //判定路上是否有别的棋子
                                }
                            }
                            for(int k=play.getY();k<i;k+=57){
                                if(playQ[i].getY()==k){
                                    count++;
                                }
                            }
                            }                                       
                        
                        
                    }
                        if(count==0){
                        ChessRegret chessRegret=new ChessRegret();
                        chessRegret.man=man;
                        chessRegret.cx=play.getX();
                        chessRegret.cy=play.getY();
                        chessRegretList.add(chessRegret);
                        play.setBounds(play.getX(), i,55, 55);
                    
                    return;
                }
            }
        }
            }
  • 写回答

1条回答 默认 最新

  • 钰娘娘 2021-10-30 15:34
    关注

    大概写了一下伪代码,解决共线中间一个棋子的问题,你看看行不?

    for(int j = 0; j < 32; j++){
    //a和b两个棋子都不共线,那就肯定不能吃
    if(play.getX()!=playQ[j].getX() && play.getY()!=playQ[j].getY())
        continue;
    //同x同y是自己,那不能吃
    if(play.getX()==playQ[j].getX() && play.getY()==playQ[j].getY())
        continue;
    
    int x1 = play.getX();
    int y1 = play.getY(0;
    int x2 = playQ[j].getX();
    int y2 = playQ[j].getY();
    //假设是y相同,x不同,那取两者中间的棋子应该刚好是1个
    //x相同则根本无法进入该循环
    int cnt = 0;
    for(int i = Math.min(x1,x2)+1; i < Math.max(x1,x2); i++){
       if(有棋子){
          ++cnt;
       }
    }
    //假设是x相同,y不同,那取两者中间的棋子应该刚好是1个
    //y相同则根本无法进入该循环
    for(int i = Math.min(y1,y2)+1; i < Math.max(y1,y2); i++){
       if(有棋子){
          ++cnt;
       }
    }
    //中间刚好有一个棋子,则可以跳
    if(cnt==1){
       可以跳
    }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月10日
  • 已采纳回答 11月2日
  • 创建了问题 10月30日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分