首先为对于炮和车的移动
之所以将二者结合在一起是因为它们的移动方式完全一致,完成了其中一个的移动方法的书写,另外一个方法可以直接调用完成后的该方法.
public void cannonRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){
//方法为炮的规则参数1为棋子是谁2所有的棋子作为参数3鼠标事件得到鼠标的点击4列表用于悔棋时记录移动地方5具体是谁走
int count=0;//记录移动中间有几个棋子
int cx=me.getX();
int cy=me.getY()+30;//cx与cy(cy加30为工具栏的高度)分别得到鼠标点击的横纵坐标
if(cx-play.getX()>=0 &&cx-play.getX()<57){//判断条件是保证为纵向移动其x坐标必须在这个范围内play的getx与gety方法得到的是play图像的左上角横纵坐标
//这个for循环是为了找到当点击的格子满足和要移动的棋子的x轴相加的坐标范围时对应的是该x范围内的哪一个格子for循环内的i就是该格子对应的y坐标
for(int i=56;i<=569;i+=57){
//真正判别点击的点是哪一个格子的条件
if(cy-i>=0 && cy-i<57){//若满足则得到该cy坐标所对应的是哪个格子
//遍历32个棋子
for(int j=0;j<32;j++){
//判断是否有棋子在要移动棋子的行上面
if(playQ[j].getX()==play.getX() &&play.getName()!=playQ[j].getName()&&playQ[j].isVisible()){
for(int k=i;k<play.getY();k+=57){//这是代表鼠标点击的位置在要移动棋子的上面(57为格子的大小)
//如果在该棋子x轴坐标上的棋子的y轴坐标在鼠标点击的位置与要移动棋子的中间时
if(playQ[j].getY()==k){
//令记录中间有多少棋子的变量加一
count++;
}
}
for(int k=play.getY();k<i;k+=57){//这是代表鼠标点击的位置在要移动棋子的下面(57为格子的大小)
//具体分析和上方一致
if(playQ[j].getY()==k){
count++;
}
}
}
}
if(count==0){//中间无任何棋子
ChessRegret chessRegret=new ChessRegret();
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();//此处的x与y都是移动前的棋子的x与y坐标
chessRegretList.add(chessRegret);//将移动前的相关信息填入用于悔棋的参数列表中
play.setBounds(play.getX(),i,55,55);//i是与鼠标点击的位置恰好对应的格子的左上角的y坐标,将棋子移动到该位置
play.playSounds();//移动时放出声音
return;//至此上下移动就完成了(不吃棋子的情况)
}
}
}
}
//同上方一致,实现对于炮的左右移动的判断分析过程基本一致
if(me.getY()-play.getY()+30>=0 && me.getY()-play.getY()+30<57){
for(int i=24;i<480;i+=57){
if(me.getX()-i>=0 && me.getX()-i<57){
for(int j=0;j<32;j++){
if(playQ[j].getY()==play.getY()&&play.getName()!=playQ[j].getName()&&playQ[j].died==false){
for(int k=i;k<play.getX();k+=57){
if(playQ[j].getX()==k){
count++;
}
}
for(int k=play.getX();k<i;k+=57){
if(playQ[j].getX()==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(i,play.getY(),55,55);
//播放声音
play.playSounds();
return;
}
}
}
}
}
public void cannoRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){
//车棋子的移动方法与炮一致所以直接调用炮的移动方法即可
cannonRule(play,playQ,me,chessRegretList,man);
}
首先对于炮的移动规则方法为cannonRule()五个参数的具体意义注释已写,首先明白对于某个棋子实际上为一个55*55的JLabel类的矩形框架,且由getx与gety方法得到的坐标是位于左上角的坐标.对于炮的移动规则是检测从移动的炮到点击位置之间是否有其它棋子如果有不进行移动没有则直接移动
定义的cx与cy为鼠标点击位置的x与y+30坐标,count=0是为了记录点击位置与移动棋子之间其它棋子的数目,先进行纵向移动的判断,注意此时鼠标点击的区域应该和移动的炮的位置处于同一个x区域内,因为鼠标不可能准确点击一个点来实现移动所以必须为一个区域,又一个格子大小为57,故而当cx-play.getx()即鼠标点击的x坐标与要移动的炮(实际为左上角坐标)的x坐标要满足>=0<57就可视为在同一个格子内,之后对于i的循环是为了找到该鼠标点击位置真正所处于的格子的y坐标,下方的if语句就是判断过程,此时就得到了鼠标点击位置所处的格子的左上角位置的x与y坐标,之后遍历32个棋子,分两种情况进行讨论,如果点击的格子在炮的上方以及点击格子在炮的下方,不论哪种情况,均是查看32个棋子中是否有棋子在二者之间,若有令count++;当32个棋子遍历结束后就得到了炮与点击的格子之间是否有其它棋子,通过count==0若满足就进行移动其中的chessRegert是存储移动之前的炮的位置以及编号信息便于悔棋时恢复,再将该信息加入悔棋状态结点的列表chessRegertList中其中列表中的最后一项元素就是最近一次操作的棋子移动或吃子前的状态.之后直接调用play.setBounds(x,y,55,55)其中的x与y就是鼠标所点击的格子的位置,55代表棋子的长与宽,之后结束该方法,即结束一次炮的移动操作.
按照上方的分析类似地就可得出,炮的左右移动的代码分析.
在一开始就说炮和车的移动规则一模一样因此对于车的移动规则cannoRule(移动方法参数都一致)的内容就是调用cannonRule()方法,将cannoRule方法的形参作为实参传递给它即可。
之后对于马和象的移动,之所以将二者练习到一起,因为二者都要考虑绊腿的情况,象为绊象腿马则为绊马腿,若有绊腿的情况则不能进行移动
public void horseRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){//马的移动规则方法//具体参数意义同炮的移动方法是一致的
int ex=0,ey=0,move=0;//ex与ey分别为鼠标点击的目标点的x与y坐标move用来判断是否拌马腿
ex=me.getX();
ey=me.getY()+30;//同样30为工具栏的高度
if(play.getX()-ex>0 && play.getX()-ex<=57 &&play.getY()-ey>=59 &&play.getY()-ey<=114){//为马走棋中的左上情况
//满足左上情况时看是否绊马腿了即看马腿位置是否有一个棋子
for(int i=0;i<32;i++){
if(playQ[i].died==false && playQ[i].getX()==play.getX() && playQ[i].getY()-play.getY()==-57){//若满足则表示存在绊马腿操作
//如果某棋子未死(被吃)且该棋子与要移动的马的x轴坐标一致而其y轴坐标正好在马的上一个格子即马腿位置
move=1;
break;//发现绊马腿了退出循环
}
}
if(move==0){
ChessRegret chessRegret=new ChessRegret();//便于之后的悔棋操作
//将移动前马的相关状态存入该chessRegret变量中便于悔棋后恢复
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX()-57,play.getY()-114,55,55);//即不存在绊马脚的操作就进行马的左上移动
}
}
//以左上情况为基础可以类似地写出其它7种马将移动的情况
//右上坐标点
if (ex - play.getX() > 0 && play.getX() - ex <= 57 && play.getY() - ey >= 59 && play.getY() - ey <= 114) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getX() == play.getX() && playQ[i].getY() - play.getY() == -57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY() - 114, 55, 55);
}
return;
}
//左下坐标点
if (play.getX() - ex > 0 && play.getX() - ex <= 57 && ey - play.getY() >= 114 && ey - play.getY() <= 170) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getX() == play.getX() && playQ[i].getY() - play.getY() == 57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY() + 114, 55, 55);
return;
}
}
//右下坐标点
if (ex - play.getX() > 0 && play.getX() - ex <= 57 && ey - play.getY() >= 114 && ey - play.getY() <= 170) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getX() == play.getX() && playQ[i].getY() - play.getY() == 57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY() + 114, 55, 55);
return;
}
}
//左左上坐标点
if (play.getX() - ex > 0 && play.getX() - ex <= 114 && play.getY() - ey > 0 && play.getY() - ey <= 57) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getY() == play.getY() && playQ[i].getX() - play.getX() == -57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 114, play.getY() - 57, 55, 55);
return;
}
}
//左左下坐标点
if (play.getX() - ex > 0 && play.getX() - ex <= 114 && ey - play.getY() >= 57 && ey - play.getY() < 114) {
for(int i=0;i<32; i++) {
if (playQ[i].isVisible() && playQ[i].getY() == play.getY() && playQ[i].getX() - play.getX() == -57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 114, play.getY() + 57, 55, 55);
return;
}
}
//右右上
if (ex - play.getX() >= 114 && ex - play.getX() <= 170 && play.getY() - ey > 0 && play.getY() - ey <= 57) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getY() == play.getY() && playQ[i].getX() - play.getX() == 57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 114, play.getY() - 57, 55, 55);
return;
}
}
//右右下
if (ex - play.getX() >= 114 && ex - play.getX() <= 170 && ey - play.getY() >= 57 && ey - play.getY() < 114) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getY() == play.getY() && playQ[i].getX() - play.getX() == 57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 114, play.getY() + 57, 55, 55);
return;
}
}
}
public void elephantRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){
//此为象的移动规则方法具体参数与首个cannonRule的参数意义一致
int ex=me.getX();
int ey=me.getY()+30;//30为工具栏的像素长度
int move=0;//判断是否绊象腿(田字的中间位置是否有棋子)
if(play.getY()<=284){//表示为黑象(因为象无法过河)
if(ey>=341){
return;//此时表示黑棋要去的地方过河了无法执行直接结束该操作
}
}
if(play.getY()>=341){//表示应该为红象
if(ey<341)
return;//红象要去的目标过河了无法执行操作
}
//具体区别就是两个不能过河的情况其它与马一致不需要进行红黑的区别
//左上情况与马类似
if(play.getX()-ex<=114 && play.getX()-ex>=58 && play.getY()-ey<=114 && play.getY()-ey>=58){//要去的目标为左上各两格长度的结点注意play为要移动的棋子,ex与ey是鼠标点击的位置
for(int i=0;i<32;i++){//检测象腿是否存在
if(playQ[i].died=false&&playQ[i].getX()==play.getX()-57&&playQ[i].getY()-play.getY()==-57){
//表示象腿存在的情况
move=1;//表示有象腿绊着
break;//结束该函数
}
}
if(move==0){
ChessRegret chessRegret=new ChessRegret();//定义chessRegret保存棋子移动前的状态,便于悔棋时恢复棋盘状态
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX()-114,play.getY()-114,55,55);
return;//直接结束该函数
}
}
//左下移动情况
if (play.getX() - ex <= 114 && play.getX() - ex >= 58 && ey - play.getY() >= 114 && ey - play.getY() <= 170) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getX() == play.getX() - 57 && playQ[i].getY() - play.getY() == 57) {
move = 1;
break;
}
}
if (move==1) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 114, play.getY() + 114, 55, 55);
return;
}
}
//右上移动情况
if (ex - play.getX() >= 114 && ex - play.getX() <= 170 && play.getY() - ey <= 114 && play.getY() - ey >= 58) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getX() == play.getX() + 57 && playQ[i].getY() - play.getY() == -57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 114, play.getY() - 114, 55, 55);
return;
}
}
//右下移动情况
if (ex - play.getX() >= 114 && ex - play.getX() <= 170 && ey - play.getY() >= 114 && ey - play.getY() <= 170) {
for(int i = 0; i < 32; ++i) {
if (playQ[i].isVisible() && playQ[i].getX() == play.getX() + 57 && playQ[i].getY() - play.getY() == 57) {
move = 1;
break;
}
}
if (move==0) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 114, play.getY() + 114, 55, 55);
return;
}
}
}
首先对于马的走棋有八种情况分别为左上,右上,左下,右下,左左上,左左下,右右上,右右下走日情况,以其中的左上情况为例进行介绍,即要移动的目标格子在左移依次上一两次的位置,先用ex与ey得到鼠标点击处的x与y坐标再由区域得到其应该所处的区域,首先马自身的坐标实际上是左上角的一个点,所以点击的x坐标要满足play.getX()-ex即要移动的马的x坐标减去鼠标点击的x坐标应该大于0小于等于57而play.getY()-ey即要移动的马的y坐标减去鼠标点击的x坐标应该大于等于59小于114此时点击的格子就满足左上情况的目标区域,时候要循环遍历32个棋子,观察马的位置的上一个格子是否有棋子判别条件为playQ[i].died==false&&playQ[i].getX()==play.getX()&&playQ[i].getY()-play.getY()==57即表明有马腿的存在,令move(判断是否有绊马腿情况的变量为1表示有)置为1,并直接退出该马移动函数即结束此次判别马是否移动的方法,遍历完32个棋子之后,若该move仍==0则表示不存在绊马腿的操作,按照之前的介绍用chessRegert保存马移动前的状态,并将该状态存入相应的列表list中,之后设定马的坐标位置为play.setBounds(play.getX()-57,play.getY()-114,55,55)对于左上情况的走马的移动方法就完成了,其它七种情况的思想与本情况基本一致只是参数不同,自己看代码即可.
之后对于象的移动方法,其情况比较马更少只有四种情况为:左上,右上,左下,右下。但不同的是象无法过河故而在总结四种不同情况之前,要先对要移动的象的种类进行判别并对鼠标点击的y轴左边做出要求(具体数值为多少参考上一篇文章中的坐标数值图片):同样先令ex与ey分别代表鼠标点击位置的x与y轴的具体坐标值,之后对于要移动的棋子play若play.getY()的值<=284则表示该象应该为黑象,之后在此基础上判断鼠标点击的位置ey的值是否大于等于341即点击的位置过河了,则直接结束本次方法,之后判断play.getY()是否>=341若是则表示为红象同上方一样判断鼠标点击的y坐标是否<341若是则直接结束本方法。之后对于四种情况之一的左上情况为例进行分析: 其与马类似,先看play.getX()-ex是否小于等于114大于等于58并且play,getY()-ey小于等于114大于等于58的情况即鼠标点击位置所对应的格子恰好为要移动的象的左两个格子再上两个格子的位置,之后遍历32个棋子查看是否有棋子在其左一个格子再上一个格子的位置(及绊象腿)若有则令move=1并结束该函数,否则保存该状态并存入列表中,再设定其位置为setBounds(play.getX()-114,play.getY()-114,55,55)。至此该情况分析完毕,其它三种情况均只是参数数值的改变,看代码理解即可。
之后是对于士帅的移动规则之所以将二者结合在一起,是因为二者都只能在田字格内移动而士只能斜着移动将只能横着移动具体代码如下
public void chapRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){
//为士的移动规则函数参数意义与之前函数一致
int judge=play.getName().charAt(1)-'0';//判断是红士或黒士
int ex=me.getX();
int ey=me.getY()+30;
//右上情况
if(ex-play.getX()>=57 && ex-play.getY()<=113 && play.getY()-ey>0&&play.getY()-ey<=57){
if(judge==1 && play.getX()+57>=252&&play.getX()+57<=309){//此时为黒士要移动棋子的位置满足田字格内部区域时
ChessRegret chessRegret=new ChessRegret();//用于记录士移动前的状态,用于点击悔棋后恢复该状态
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX()+57,play.getY()-57,55,55);//令要移动的黒士位置变为其右上一格的结点
}
if(judge==2 && play.getX()-57<=512 &&play.getY()-57>=455 && play.getX()+57>=252&&play.getX()+57<=389){
ChessRegret chessRegret=new ChessRegret();//用于记录士移动前的状态,用于点击悔棋后恢复该状态
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX()+57,play.getY()-57,55,55);
}
}
//右下情况
if (ex - play.getX() >= 57 && ex - play.getX() <= 113 && ey - play.getY() > 0 && ey - play.getY() <= 113) {
if (judge == 1 && play.getX() + 57 <= 309 && play.getX() + 57 >= 252) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY() + 57, 55, 55);
}
if (judge == 2 && play.getY() + 57 <= 569 && play.getY() + 57 >= 512 && play.getX() + 57 >= 252 && play.getX() + 57 <= 309) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY() + 57, 55, 55);
}
}
//左上情况
if (play.getX() - ex > 0 && play.getX() - ex <= 57 && play.getY() - ey > 0 && play.getY() - ey <= 57) {
if (judge == 1 && play.getX() - 57 >= 195 && play.getX() - 57 <= 252) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY() - 57, 55, 55);
}
if (judge == 2 && play.getY() - 57 <= 512 && play.getY() - 57 >= 455) {
play.setBounds(play.getX() - 57, play.getY() - 57, 55, 55);
}
}
//左下情况
if (play.getX() - ex > 0 && play.getX() - ex <= 57 && ey - play.getY() > 0 && ey - play.getY() <= 113) {
if (judge == 1 && play.getX() - 57 >= 195 && play.getX() - 57 <= 252) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY() + 57, 55, 55);
}
if (judge == 2 && play.getY() + 57 <= 569 && play.getY() + 57 >= 512 && (play.getX() == 252 || play.getX() == 309)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY() + 57, 55, 55);
}
}
}
public void masterRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){
int ex=me.getX();
int ey=me.getY()+30;
int judge=play.getName().charAt(1)-'0';//用来判断是红帅还是黑将
//向上移动情况
if(ex-play.getX()>=0&&ex-play.getX()<57&&play.getY()-ey>0&&play.getY()-ey<=57){
//判断的时候要注意play.getX于.getY方法二者都是取得该棋子图像的最左上方的坐标用于进行鼠标点击的判断
if(judge==1&&(play.getX()==195||play.getX()==252||play.getX()==309)&&(play.getY()==113||play.getY()==170)){
//表明当前要移动的棋子为黑将且用列举的方式判断其所可能处于的所有六种可能只有满足后才能要求该棋子上移
ChessRegret chessRegret=new ChessRegret();
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();//同样是为了记忆移动前黑将所处的位置便于悔棋后进行该状态的恢复
chessRegretList.add(chessRegret);
play.setBounds(play.getX(),play.getY()-57,55,55);
//表示为黑将向上移动即为(实际方向是向下)
return;
}
if(judge==2 &&(play.getX()==195||play.getX()==252||play.getX()==309)&&(play.getY()==512||play.getY()==569)){
//表明当前要移动的棋子为红帅且用列举的方式判断其所可能处于的所有六种可能只有满足后才能要求该棋子上移
//具体要进行的移动实际上与上方是一致的
ChessRegret chessRegret=new ChessRegret();
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();//同样是为了记忆移动前黑将所处的位置便于悔棋后进行该状态的恢复
chessRegretList.add(chessRegret);
play.setBounds(play.getX(),play.getY()-57,55,55);
//表示为黑将向上移动即为(实际方向是向下)
return;
}
}
//向下移动
if (me.getX() - play.getX() >= 0 && me.getX() - play.getX() < 57 && ey - play.getY() >= 57 && ey - play.getY() <= 113) {
if (judge == 1 && (play.getX() == 195 || play.getX() == 309 || play.getX() == 252) && (play.getY() == 56 || play.getY() == 113)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX(), play.getY() + 57, 55, 55);
return;
}
if (judge == 2 && (play.getX() == 195 || play.getX() == 309 || play.getX() == 252) && (play.getY() == 512 || play.getY() == 455)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX(), play.getY() + 57, 55, 55);
return;
}
}
//向左移动
if (ey - play.getY() >= 0 && ey - play.getY() <= 56 && play.getX() - ex > 0 && play.getX() - ex <= 57) {
if (judge == 1 && (play.getX() == 252 || play.getX() == 309) && (play.getY() == 56 || play.getY() == 113 || play.getY() == 170)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY(), 55, 55);
return;
}
if (judge == 2 && (play.getX() == 252 || play.getX() == 309) && (play.getY() == 569 || play.getY() == 512 || play.getY() == 455)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY(), 55, 55);
return;
}
}
//向右移动这下面的三种代码的具体分析情况与第一种的向上移动的分析方法一致
if (ey - play.getY() >= 0 && ey - play.getY() <= 56 && ex - play.getX() >= 57 && ex - play.getX() <= 113) {
if (judge == 1 && (play.getX() == 252 || play.getX() == 195) && (play.getY() == 56 || play.getY() == 113 || play.getY() == 170)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY(), 55, 55);
return;
}
if (judge == 2 && (play.getX() == 252 || play.getX() == 195) && (play.getY() == 569 || play.getY() == 512 || play.getY() == 455)) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY(), 55, 55);
return;
}
}
}
首先是对于士,由于只能在田字格内斜着移动所以只有四种情况,但每一种情况都要分红士与黒士两种情况,四种情况为右上,右下,左上,左下四种情况.针对右上情况的分析思想为:首先定义judge得到所要执行的士的名字的第二个字符(因为框架定义时候对于红棋第二个字符均为2黑棋均为1)来判别该士的种类,之后定义ex与ey+30分别为鼠标点击的x与y轴坐标,对于右上情况即点击区域对应的格子为要移动士的右一个格子再上一个格子,坐标要求为ex-play.getX()要大于等于57小于等于113(具体原因是因为getX()Y()方法得到的都只是左上角的坐标)并且play.getY()-ey大于0小于等于57则点击区域满足士右上情况要走的位置,之后若judge==1且play.getX()+57满足>=252小于等于309即该士为黑士且在其所在的田字格内,故而满足士的走棋要求,先将士走棋前状态保存并存入数组中.之后play.setBounds(play.getX()+57,play.getY()-57,55,55)完成了此情况下士的移动,之后判断若judge==2&&play.getX()-57<=512&&play.getY-57>=455则该士为红士且满足在田字格内,再次保存红士移动前状态并存入数组中,之后设置play.setBounds(play.getX()+57,play.getY()-57,55,55)完成该红士的移动.此时此右上情况分析完毕,其余的三种情况均是在该思想基础上修改参数值完成的参考代码自行理解即可.
之后对于将帅的情况,同样包含四种情况:向上,向下,向左,向右的情况,每种情况都要判断该棋子为红将还是黑将,因为将同样无法出田字格,对于向上情况的分析:首先定义ex与ey为鼠标点击处的x与y轴坐标,judeg与士时候的意义一致,对于向上情况分析:先看ex-play.getX()是否大于等于0且小于57并且play.getY()-ey大于0小于等于57,再该情况即点击的区域满足为将的上一个格子,之后判断若该将的judge==1&&(用列举法写出所有满足能向上移动的6个黑将所在位置用或的关系)若满足则保存状态并存入数组中,并执行play.setBounds(play.getX(),play.getY()-57,55,55)来实现黑将的移动,同理可以得到红将的判别为judeg==2&&(用列举法写出所有满足能向上移动的6个红将所在位置用或的关系)若满足则保存状态并存入数组中,并执行play.setBounds(play.getX(),play.getY()-57,55,55)来实现红将的移动.其它三种情况均为在此情况基础上修改参数值实现的参考代码进行理解即可。
最后是对于卒子的移动方法代码如下:
public void soilderRule(ChessMainBehavior play, ChessMainBehavior playQ[], MouseEvent me, List<ChessRegret> chessRegretList, int man){
//为士兵的移动规则(过河前只能前移,过河后可以左右移动,但始终不能后移)参数与上方所有方法的参数意义一致
int judge=play.getName().charAt(1)-'0';//用来判断该棋子是红卒还是黑卒
int ex=me.getX();
int ey=me.getY()+30;
if(judge==1){//此时表示为黑卒的情况
if(ex-play.getX()>=0&&ex-play.getX()<57&&ey-play.getY()>=57&&ey-play.getY()<=113){
//表示为对于目标黑卒的鼠标的目的地是该黑卒的下方格子
//即为进行是否为进行向下的移动此时不需要判断是否过河
ChessRegret chessRegret=new ChessRegret();
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();//保存移动前的黑卒的坐标状况便于悔棋后进行移动前状态的恢复,cx与cy意为原始的x与y坐标值
chessRegretList.add(chessRegret);
play.setBounds(play.getX(),play.getY()+57,55,55);
return;
}
if(play.getY()>=341&&ey-play.getY()>=0&&ey-play.getY()<=56&&ex-play.getX()>=57&&ex-play.getX()<=113){
//此时判断黑卒是否过河且鼠标要点击的区域是否满足为要移动棋子右侧一格的区域
//满足后即进行保存移动前状态以及右移的操作
ChessRegret chessRegret=new ChessRegret();
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();//保存移动前的黑卒的坐标状况便于悔棋后进行移动前状态的恢复,cx与cy意为原始的x与y坐标值
chessRegretList.add(chessRegret);
play.setBounds(play.getX()+57,play.getY(),55,55);
return;
}
if(play.getY()>=341&&ey-play.getY()>=0&&ey-play.getY()<=56&&play.getX()-ex>0&&play.getX()-ex<=57){
//满足过河且向左移动的前提要求
ChessRegret chessRegret=new ChessRegret();
chessRegret.man=man;
chessRegret.cx=play.getX();
chessRegret.cy=play.getY();//保存移动前的黑卒的坐标状况便于悔棋后进行移动前状态的恢复,cx与cy意为原始的x与y坐标值
chessRegretList.add(chessRegret);
play.setBounds(play.getX()-57,play.getY(),55,55);
return;
}
//上述三个if语句就是对于要移动棋子为黑色棋子时候的三种移动方式的判断以及操作
}
//为红卒时候
if (judge == 2) {
if (me.getX() - play.getX() >= 0 && me.getX() - play.getX() < 57 && play.getY() - ey > 0 && play.getY() - ey <= 57) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX(), play.getY() - 57, 55, 55);
return;
}
if (play.getY() <= 284 && ey - play.getY() >= 0 && ey - play.getY() <= 56 && ex - play.getX() >= 57 && ex - play.getX() <= 113) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() + 57, play.getY(), 55, 55);
return;
}
if (play.getY() <= 284 && ey - play.getY() >= 0 && ey - play.getY() <= 56 && play.getX() - ex > 0 && play.getX() - ex <= 57) {
ChessRegret chessRegret = new ChessRegret();
chessRegret.man = man;
chessRegret.cx = play.getX();
chessRegret.cy = play.getY();
chessRegretList.add(chessRegret);
play.setBounds(play.getX() - 57, play.getY(), 55, 55);
return;
}
}
}
对于卒子的情况,先定义ex与ey分别为鼠标点击位置的x与y的坐标,定义judge得到棋子为黑卒(1)还是红卒(2)判断If(judge==1)即为黑卒,首先若为向下情况,即ex-play.getX()>=0且<57并且ey.play.getY()>=57且<=114则要去的位置满足向下的情况,保存移动前黑卒的状态并加入列表中,之后修改该黑卒位置,即play.setBound(play.getX(),play.getY()+57,55,55);之后若为右移状态则要满足play.getY()>=341(即过河了)且ey-play.getY()>=0且<=56并且ex-play.getX()>=57且<=113则为右移的情况在保存完状态后令play.setBounds(play.getX()+557,play.getY(),55,55)而对于左移的情况只需对于右移的条件改为play.getY()>341并且ey-play.getY()>=0且<=56并且play.getX()-x大于0且小于等于57则将状态保存后进行位置的设置为play.setBounds(play.getX()-57,play.getY(),55,55);之后对于judge==2即为黑卒的情况下,基本情况与此情况一致,根据代码进行理解即可。
至此为止所有棋子的移动规则代码均已填写完毕。