//五子棋算法类,
public class Check{
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];
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;
}
/*
* 棋子放置,由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<this.arraySize;i++){
for(j=0;j<this.arraySize;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 ){ //给一个点,在此点分析是否游戏是否有人胜利
/* 看了一下QQ上面五子棋,直到有五子连珠才给出谁胜
* 俺也这么做
* 开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化
* =====================================================
* 对于一个位置(x,y),下一个连着的棋可以有八个方向
* 2 3 4
* 1 (x,y) 5
* 8 7 6
*
* 最左上角为(0,0)坐标
* 现在只分析如果都有棋子谁胜,而没有分开是白还是黑胜
*/
int times=1; //计数器,记录已经有多少个连着的棋,当times是5时代码return true
int next=1; //开始查找的方向为8时return flase
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//////////////////////////////
////////////////////////看4 8方向////////////////////////////////////////
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(){ //测试类方法
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");
}
}
}