//五子棋算法类,
/*看了一下QQ上面五子棋,直到有五子连珠才给出谁胜
*俺也这么做
*开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化
*=====================================================*对于一个位置(x,y),下一个连着的棋可以有八个方向*234*1(x,y)5
*876
*
*最左上角为(0,0)坐标
*/
public class CheckFinish{
private int arraySize;//棋盘大小
private int[][] array;//棋盘大小,用二维数组表示,0表无棋,1表黑棋,2表白棋
private int[][]arrayWhiteChess;//白棋的数组
private int[][]arrayBlackChess;//
Check(int arraySize){
this.arraySize=arraySize;
this.array= new int[this.arraySize][this.arraySize];
this.arrayBlackChess=new int[this.arraySize][this.arraySize];
this.arrayWhiteChess=new int[this.arraySize][this.arraySize];
}
/*
*棋子放置,由canMove方法保证能否放置到当前位置
*/
public void move(int x,int y,int chessType){
this.array[x][y]=chessType;
if(chessType==1){
this.arrayBlackChess[x][y]=1;
}
else{
this.arrayWhiteChess[x][y]=2;
}
}
/*
*如果能放置返回true,不能放置返回false,
*/
public boolean canMove(int x,int y){
//如果x,y小于0,x,y大于等于arraySize不能放
if(x<0||x>=this.arraySize||y<0||y>=this.arraySize){
return false;
};
//当前位置有棋子了也不能放
if(this.array[x][y]!=0){
return false;
}
return true;
}
public void clean(){//清空棋盘
int i,j;
for(i=0;i
for(j=0;j
this.array[i][j]=0;
}
}
}
public boolean finish(int x,int y,int chessType){
if(chessType==1){//black
this.array=this.arrayBlackChess;
if(finish(x,y)==true)return true;
}
else{
this.array=this.arrayWhiteChess;
if(finish(x,y)==true)return true;
}
return false;
}
private boolean finish(int x,int y ){//给一个点,在此点分析是否游戏是否有人胜利
int times=1;//计数器,记录已经有多少个连着的棋,当times是5时代码return true
int next=1;//开始查找的方向
int temX=x-1;
int temY=y;
//while
//检查15方向
while(true){
if(checkNext(temX,temY,1)==true){//1的1方向
times++;
temX-=1;
continue;
}
else{
break;
}
}
temX=x+1;
while(true){//5方向
if(checkNext(temX,y,5)==true){
times++;
temX+=1;
continue;
}
else{
break;
}
}
if(times>=5) return true;
end of check 15 //
检查26方向
times=1;
temX=x-1;
temY=y-1;
while(true){//检查2方向
if(checkNext(temX,temY,2)==true){
times++;
temX-=1;
temY-=1;
continue;
}
else
{
break;
}
}
temX=x+1;
temY=y+1;
while(true){//检查6方向
if(checkNext(temX,temY,6)){
times++;
temX+=1;
temY+=1;
continue;
}
else
{
break;
}
}
if(times>=5)return true;
end o check 26/
检查37方向/
temX=x;
temY=y-1;
times=1;
while(true){//看3方向
if(checkNext(temX,temY,3)==true){
times++;
temY-=1;
continue;
}
else
{
break;
}
}
temY=temY+1;
while(true){//看6方向
if(checkNext(temX,temY,7)==true){
times++;
temY+=1;
continue;
}
else
{
break;
}
}
if(times>=5)return true;
/end of check 5//
看48方向
temX=x+1;
temY=y-1;
times=1;
while(true){//看4方向
if(checkNext(temX,temY,4)==true){
times++;
temX=temX+1;
temY=temY-1;
continue;
}
else
{
break;
}
}
temX=x-1;
temY=y+1;
while(true){//看8方向
if(checkNext(temX,temY,8)==true){
times++;
temX=temX-1;
temY=temY+1;
continue;
}
else
{
break;
}
}
if(times>=5)return true;
end of check 4 8///
/
/全部完成
///
return false;
}
private boolean checkNext(int x,int y,int next ){//next表方向,检查下一个方向是否有棋子
switch(next)
{
case 1:
if(x<0) return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 2:
if(x<0||y<0)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 3:
if(y<0)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 4:
if(x>=this.arraySize||y<0)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 5:
if(x>=this.arraySize)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 6:
if(x>=this.arraySize||y>=this.arraySize) return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 7:
if(y>=this.arraySize)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
case 8:
if(x<0||y>=this.arraySize)return false;
if(this.array[x][y]!=0)
return true;
else
return false;
default:
return false;
}
}
public void test(){//测试 类 方法
this.array[6][0]=1;
this.array[6][1]=1;
this.array[6][2]=1;
this.array[6][3]=1;
this.array[6][4]=1;
this.array[1][4]=1;
this.array[2][4]=1;
this.array[3][4]=1;
this.array[4][4]=1;
this.array[5][4]=1;
this.array[0][0]=1;
this.array[1][1]=1;
this.array[2][2]=1;
this.array[3][3]=1;
this.array[4][4]=1;
this.array[1][8]=1;
this.array[2][7]=1;
this.array[3][6]=1;
this.array[4][5]=1;
this.array[5][4]=1;
if(this.finish(3,6)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
if(this.finish(3,3)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
if(this.finish(3,4)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
if(this.finish(6,1)==true){
System.out.println("OK");
}
else
{
System.out.println("false");
}
}
}