关于中国象棋中炮吃子出现的问题
问题描述:
一下是我关于炮上下吃子的判断的方法,我的程序运行后炮是可以实现向下吃子的功能的,但是纯在的问题是炮不能实现向上吃子的功能而且炮可以在目标棋子之间没有棋子的情况下吃掉目标棋子。(请帮我指出代码中的不足)我已经呆呆的看了自己的代码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是鼠标点击的位置-棋子的位置,
//保证了我们的上下移动和左右移动因为气质的像素是55和55棋子间的间隔为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;
}
}
}
}
答
大概写了一下伪代码,解决共线中间一个棋子的问题,你看看行不?
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){
可以跳
}
}