势必拿下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 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了