想问一下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.从命名上看,这个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个像素点。