势必拿下SpringBoot 2021-10-24 18:58 采纳率: 100%
浏览 29
已结题

关于中国象棋选子算法的问题

想问一下r和c的算法为什么要获取y再算(y - 25) /58
这是在别人的CSDN帖子中截取的代码(本来想借鉴着做个中国象棋的游戏的但是不是很明白这个算法的原因)

public Canvas(){
        //chessimage = new ImageIcon("黑车.gif").getImage();
        font = new Font("宋体",Font.BOLD,30);
        initMap();
        addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e){
                //super.mouseClicked(e);
                //System.out.println(e.getButton());
                if(e.getButton()==MouseEvent.BUTTON1){
                    int x = e.getX();
                    int y = e.getY();
                    //System.out.println(e.getX()+","+e.getY()+"["+x+","+y+"]");
                    int r = (y - 25) /58;
                    int c = (x - 25) /58;
                    //System.out.println("r = "+r+", c = "+c);
                    //选子
                    if(select_c == -1&&map[r][c]!=0){
                        if(RangeChecker.selectInRange(map,r,c,isBlack)){//isBlack 是 红方
                            select_c = c;
                            select_r = r;
                            repaint();
                        }
                        else{
                            showFail("请选择己方棋子");
                        }
                        return ;// 选子阶段结束
                    }
                    
                    boolean valid  = RangeChecker.inRange(map, select_r,select_c,r, c, isBlack);
                    if(!valid){
                        showFail("下子失败");
                    }
                    
                    Chess chess = manager.getTheChess(map[select_r][select_c]);
                    valid = chess.check(map, select_r, select_c, r, c, isBlack);
                    if(!valid||(map[select_r][select_c]<1000&&map[r][c]<1000&&map[r][c]!=0)||(map[select_r][select_c]>1000&&map[r][c]>1000&&map[r][c]!=0)){
                        showFail("下子失败,规则不允许");
                        select_c = -1;
                        select_r = -1;
                        repaint();
                        return ;
                    }
                    
                    map[r][c] = map[select_r][select_c ];
                    map[select_r][select_c ] = 0; 
                    select_c = -1;
                    select_r = -1;
                    
                    isBlack = !isBlack;//对方来下
                    repaint();
                }
            }
        });


  • 写回答

1条回答 默认 最新

  • 其樂无穷 2021-10-25 00:34
    关注

    1.从命名上看,这个r应该是row的缩写。c是column的缩写。分别表示在棋盘的第几行的第几列。
    2.因为中国象棋是10行9列。所以可以使用一个二维数组存储,他这里取名叫map,从initMap的名字可以推断。他是在初始化,把象棋中每粒棋子放在二维数组中应该放在的位置。
    3.至于为啥r = (y - 25) /58;首先y是从e中获取的,就是所谓的鼠标e的像素点位置的纵坐标y。易得,鼠标e中获取当前点击的像素点坐标(y,x) 。与其在棋盘坐标(r,c)。是有线性对应关系的。你看的那篇博客,应该是事前统计过棋子的左上角和右下角的像素点坐标,然后计算出像素点坐标和棋盘坐标的公式。因为没有太多的信息,我只能从这个58可以反推出,这个象棋游戏在制作的时候,一个格子的宽和高是58个像素点。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?