The Memory of Tree

Kevin's Words

导航

统计

公告

一个五子棋算法的类

//五子棋算法类,

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;                   //计数器,记录已经有多少个连着的棋,times5时代码return true

              int next=1;                    //开始查找的方向为8return flase

              int temX=x-1;

              int temY=y;

              //while

              //检查15方向

              while(true){

                     if(checkNext(temX,temY,1)==true){   //11方向

                            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");

              }

       }

}

 

posted on 2006-11-08 16:04 Kevin Xin 阅读(811) 评论(0) 编辑 收藏