初学java,写了一个五子棋算法的类,请大家多多指教.

本文介绍了一种五子棋胜负判断算法,通过分析棋盘上八个方向的连子情况来判断是否存在五子连珠,进而确定游戏胜负。该算法考虑了棋盘边界条件并实现了对黑白两方棋子的独立验证。

 //五子棋算法类,

/*   看了一下QQ上面五子棋,直到有五子连珠才给出谁胜
*    俺也这么做

*   开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化

*    =====================================================
*    对于一个位置(x,y),下一个连着的棋可以有八个方向
*              2     3      4
*              1    (x,y)   5

*              8     7      6

*                  

*      最左上角为(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<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 ){            //给一个点,在此点分析是否游戏是否有人胜利

                         int times=1;                   //计数器,记录已经有多少个连着的棋,times5时代码return true

              int next=1;                    //开始查找的方向

              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(){              //测试 类 方法

             

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

              }

       }

}

 

 

 

             

 

         

 

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值