GuiZe.java
~~~
public class GuiZe {
QiZi[][] qiZi;//聲明棋子的數組
boolean canMove=false;
int i;
int j;
public GuiZe(QiZi[][] qiZi)
{
this.qiZi=qiZi;
}
public boolean canMove(int startI,int startJ,int endI,int endJ,String name)
{
int maxI;//定義一些輔助變量
int minI;
int maxJ;
int minJ;
canMove=true;
if(startI>=endI)//確定其實坐標的大小關系
{
maxI=startI;
minI=endI;
}
else//確定maxI和minI
{
maxI=endI;
minI=startI;
}
if(startJ>=endJ)//確定endJ和startJ
{
maxJ=startJ;
minJ=endJ;
}
else
{
maxJ=endJ;
minJ=startJ;
}
if(name.equals("車"))//如果是"車"
{
this.ju(maxI,minI,maxJ,minJ);
}
else if(name.equals("馬"))//如果是"馬"
{
this.ma(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("相"))//如果是"相"
{
this.xiang1(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("象"))//如果是"象"
{
this.xiang2(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("士")||name.equals("仕")) //如果是"士"
{
this.shi(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("帥")||name.equals("將"))//如果是"將"
{
this.jiang(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("炮")||name.equals("砲"))//如果是"炮"
{
this.pao(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("兵"))//如果是"兵"
{
this.bing(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
else if(name.equals("卒"))//如果是"卒"
{
this.zu(maxI,minI,maxJ,minJ,startI,startJ,endI,endJ);
}
return canMove;
}
public void ju(int maxI,int minI,int maxJ,int minJ)
{//對"車"的處理方法
if(maxI==minI)//如果在一條橫線上
{
for(j=minJ+1;j<maxJ;j++)
{
if(qiZi[maxI][j]!=null)//如果中間有棋子
{
canMove=false;//不可以走棋
break;
}
}
}
else if(maxJ==minJ)//如果在一條豎線上
{
for(i=minJ+1;i<maxJ;i++)
{
if(qiZi[i][maxJ]!=null)//如果中間有棋子
{
canMove=false;//不可以走棋
break;
}
}
}
else if(maxI!=minI&&maxJ!=minJ)//如果不在同一條線上
{
canMove=false;//不可以走棋
}
}
public void ma(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"馬"的處理方法
int a=maxI-minI;
int b=maxJ-minJ;//獲得兩坐標點之間的差
if(a==1&&b==2)//如果是豎著的"日"字
{
if(startJ>endJ)//如果是從下向上走
{
if(qiZi[startI][startJ-1]!=null)//如果馬腿處有棋子
{
canMove=false;//不可以走
}
}
else
{//如果是從上往下走
if(qiZi[startI][startJ+1]!=null)//如果馬腿處有棋子
{
canMove=false;//不可以走
}
}
}
else if(a==2&&b==1)//如果是橫著的"日"
{
if(startI>endI)//如果是從右往左走
{
if(qiZi[startI-1][startJ]!=null)//如果馬腿處有棋子
{
canMove=false;//不可以走
}
}
else
{//如果是從左往右走
if(qiZi[startI+1][startJ]!=null)//如果馬腿處有棋子
{
canMove=false;//不可以走
}
}
}
else if(!((a==2&&b==1)||(a==1&&b==2)))//如果不時"日"字
{
canMove=false;//不可以走
}
}
public void xiang1(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"相"的處理
int a=maxI-minI;
int b=maxJ-minJ;//獲得X,Y坐標的差
if(a==2&&b==2)//如果是"田"字
{
if(endJ>4)//如果過河了
{
canMove=false;//不可以走
}
if(qiZi[(maxI+minI)/2][(maxJ+minJ)/2]!=null)//如果"田"字中間有棋子
{
canMove=false;//不可以走
}
}
else
{
canMove=false;//如果不是"田"字,不可以走
}
}
public void xiang2(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"象"的處理
int a=maxI-minI;
int b=maxJ-minJ;//獲得X,Y坐標的差
if(a==2&&b==2)//如果是"田"字
{
if(endJ<5)//如果過河了
{
canMove=false;//不可以走
}
if(qiZi[(maxI+minI)/2][(maxJ+minJ)/2]!=null)//如果"田"字中間有棋子
{
canMove=false;//不可以走
}
}
else
{
canMove=false;//如果不是"田"字,不可以走
}
}
public void shi(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{
int a=maxI-minI;
int b=maxJ-minJ;//獲得X,Y坐標的差
if(a==1&&b==1)//如果是小斜線
{
if(startJ>4)//如果是下方的士
{
if(endJ<7)
{
canMove=false;//如果下方的士越界,不可以走
}
}
else
{//如果是上方的仕
if(endJ>2)
{
canMove=false;//如果上方的仕越界,不可以走
}
}
if(endI>5||endI<3)//如果左右越界,則不可以走
{
canMove=false;
}
}
else
{//如果不時小斜線
canMove=false;//不可以走
}
}
public void jiang(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"帥"、"將"的處理
int a=maxI-minI;
int b=maxJ-minJ;//獲得X,Y坐標的差
if((a==1&&b==0)||(a==0&&b==1))
{//如果走的是一小格
if(startJ>4)//如果是下方的將
{
if(endJ<7)//如果越界
{
canMove=false;//不可以走
}
}
else
{//如果是上方的將
if(endJ>2)//如果越界
{
canMove=false;//不可以走
}
}
if(endI>5||endI<3)//如果左右越界,不可以走
{
canMove=false;
}
}
else
{//如果走的不是一格,不可以走
canMove=false;
}
}
public void pao(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"炮"、"砲"的處理
if(maxI==minI)//如果走的豎線
{
if(qiZi[endI][endJ]!=null)//如果終點有棋子
{
int count=0;
for(j=minJ+1;j<maxJ;j++)
{
if(qiZi[minI][j]!=null)//判斷起點與終點之間有幾個棋子
{
count++;
}
}
if(count!=1)
{//如果不是一個棋子
canMove=false;//不可以走
}
}
else if(qiZi[endI][endJ]==null)//如果終點沒有棋子
{
for(j=minJ+1;j<maxJ;j++)
{
if(qiZi[minI][j]!=null)//如果起止點之間有棋子
{
canMove=false;//不可以走
break;
}
}
}
}
else if(maxJ==minJ)//如果走的是橫線
{
if(qiZi[endI][endJ]!=null)//如果終點有棋子
{
int count=0;
for(i=minI+1;i<maxI;i++)
{
if(qiZi[i][minJ]!=null)//判斷起點與終點之間有幾個棋子
{
count++;
}
}
if(count!=1)//如果不是一個棋子
{
canMove=false;//不可以走
}
}
else if(qiZi[endI][endJ]==null)//如果終點沒有棋子
{
for(i=minI+1;i<maxI;i++)
{
if(qiZi[i][minJ]!=null)//如果起止點之間有棋子
{
canMove=false;//不可以走
break;
}
}
}
}
else if(maxJ!=minJ&&maxI!=minI)
{//如果走的既不是豎線,也不是橫線,則不可以走
canMove=false;
}
}
public void bing(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"兵"的處理
if(startJ<5)//如果還沒有過河
{
if(startI!=endI)//如果不是向前走
{
canMove=false;//不可以走
}
if(endJ-startJ!=1)//如果走的不是一格
{
canMove=false;//不可以走
}
}
else
{//如果已經過河
if(startI==endI)
{//如果走的是豎線
if(endJ-startJ!=1)//如果走的不是一格
{
canMove=false;//不可以走
}
}
else if(startJ==endJ)
{//如果走的是橫線
if(maxI-minI!=1)
{//如果走的不是一格
canMove=false;//不可以走
}
}
else if(startI!=endI&&startJ!=endJ)
{//如果走的既不是豎線,也不是橫線,則不可以走
canMove=false;
}
}
}
public void zu(int maxI,int minI,int maxJ,int minJ,int startI,int startJ,int endI,int endJ)
{//對"卒"的處理
if(startJ>4)
{//如果還沒有過河
if(startI!=endI)
{//如果不是向前走
canMove=false;//不可以走
}
if(endJ-startJ!=-1)//如果走的不是一格
{
canMove=false;
}
}
else
{//如果已經過河
if(startI==endI)
{//如果走的是豎線
if(endJ-startJ!=-1)
{//如果走的不是一格
canMove=false;//不可以走
}
}
else if(startJ==endJ)
{//如果走的是橫線
if(maxI-minI!=1)
{//如果走的不是一格
canMove=false;//不可以走
}
}
else if(startI!=endI&&startJ!=endJ)
{//如果走的既不是豎線,也不是橫線,則不可以走
canMove=false;
}
}
}
}
~~~