⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 board.java

📁 Game Caro 4 user begginer
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
  for(i=mi;i>-1;i--){
     if(grid[i][mj].getColor() == nside){ left++;}
     if(grid[i][mj].getColor() != nside) break;    
  }
  
  for(i=mi;i<rows;i++){
     if(grid[i][mj].getColor() == nside){ right++;}
     if(grid[i][mj].getColor() != nside) break;
  }
  //win if this line is have 5 square of nside
  if(((left+right)-1) == 5) return VERTICAL; 
  
  // horizontal
  left=0; right=0;
  for(j=mj;j>-1;j--){
     if(grid[mi][j].getColor() == nside){ left++;}
     if(grid[mi][j].getColor() != nside) break;
  }
  
  for(j=mj;j<colums;j++){
     if(grid[mi][j].getColor() == nside){ right++;}
     if(grid[mi][j].getColor() != nside) break;
  }
  
  if(((left+right)-1) == 5) return HORIZONTAL; 
  
  //bias 1
  left=0; right=0;
  for(i=mi,j=mj;i>-1 && j>-1;i--,j--){
     if(grid[i][j].getColor() == nside){ left++;}
     if(grid[i][j].getColor() != nside) break;
  }
  
  for(i=mi,j=mj;i<rows && j<colums;i++,j++){
     if(grid[i][j].getColor() == nside){ right++;}
     if(grid[i][j].getColor() != nside) break;
  }
  
  if(((left+right)-1) == 5) return BIAS_1;
   
  //bias 2
  left=0; right=0;
  for(i=mi,j=mj;i>-1 && j<colums;i--,j++){
     if(grid[i][j].getColor() == nside){ left++;}
     if(grid[i][j].getColor() != nside) break;
  }
  
  for(i=mi,j=mj;i<rows && j>-1;i++,j--){
     if(grid[i][j].getColor() == nside){ right++;}
     if(grid[i][j].getColor() != nside) break;    
  }
  
  if(((left+right)-1) == 5) return BIAS_2;
   
	// if not win return FALSE
  return NOWON;
}

int WinLine4(int mi,int mj,int nside)
{
	int i,j;
	int mask[] = {0,0,0,0}; // mask line
    for(i=0;i<4;i++){ // set up mask
       mask[i] = CalcPoints(mi,mj,nside,i);
	}

	for(i=0;i<4;i++){
		if(mask[i] == 2200)	 return WIN_LINE1B4;
	}

    for(i=0;i<4;i++){
		switch(mask[i]){
        case 2195: // line 4
        case 1500:
		case 1495:
			{
              j=0;
			  while(j<4){
				  if(j != i){
                    if(mask[j] == 1500 || mask[j] == 1495 || mask[j] == 2195) return WIN_LINE4B4;
				  }
				  j++;
			  }
			  j=0;
			  while(j<4){
				  if(j != i){
					if(mask[j] == 340 || mask[j] == 335) return WIN_LINE4B3;
				  }
				  j++;
			  }
			}
			break;		
		}
	}//end for i
   return NOWON;
}
int  FindSideWin(int nside,boolean sqquick)
{
	int i,n,k;
    int win = NOWON;
    n=QuickGen(nside,false); Sort(); 
	if(n == 0 || Gen_dat[Gen_begin[ply]].prior < 2200) return NOWON;	
    k = Gen_begin[ply]; 
	// get k is break point for loop, reject if prior < 2200
	while(Gen_dat[k++].prior >= 2200);
	
    for (i=Gen_begin[ply]; i<k+1 && win < 1 ; i++) {	  		  
		grid[Gen_dat[i].y][Gen_dat[i].x].setColor(nside);
        win = WinFive(Gen_dat[i].y,Gen_dat[i].x,nside);
		if(sqquick ==true && win == 1) newmove = Gen_dat[i];
		grid[Gen_dat[i].y][Gen_dat[i].x].setColor(EMPTY);
	}
	
	return win;
}

public int Better(int nside)
{
	int s = 0;
    int maxnside = GetMaxSide(nside);
    s = CalcPoints(histmove[m_hp].gety(),histmove[m_hp].getx(),nside,-1);
    if(s>5000) s -= 5300;	 
    if( maxnside > s) s = maxnside;	 
   return s;
}

public int CalcPoints(int mi, int mj, int nside,int Full)
{
	int s=0;
    short i,masksquare[][]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; // mask square near
	switch(Full){
    case 0:
      s = Bias1(mi,mj,nside);
      break;
    case 1:
      s = Bias2(mi,mj,nside);
      break;
	case 2:
      s = Vertical(mi,mj,nside);
      break;
    case 3:
      s = Horizontal(mi,mj,nside);
      break; 
	case 5:
		for(i=0;i<8;i++){
		 // is square near
         if(grid[mi+masksquare[i][0]][mj + masksquare[i][1]].getColor() == nside) s += 1;
	    }
		break;
	default:
      s += Vertical(mi,mj,nside);
	  s += Horizontal(mi,mj,nside);
	  s += Bias1(mi,mj,nside);
	  s += Bias2(mi,mj,nside);	  
	  break;
	}
  return s;
}
//calculate value of line
int CalcLine(boolean lbreak,boolean rbreak,int total,int nempty,int tempty)
{
   int c = 0;
   // 1 **** ,2 * *** ,3 ** **,4 * * **, no break
   if((lbreak == false) && (rbreak == false)){
	   c += spoint[0][total];
   }
   // 1 0****,2 ****0 , left break or right break
   if(((lbreak == true) && (rbreak == false)) || ((lbreak == false) && (rbreak == true))) c += spoint[1][total];
   // 1 0****0, 2 0*** *0-0*** 0-0**** 0, left break and right break
   if((lbreak == true) && (rbreak == true)){
	   if(tempty == 0 && nempty > 0) return 0;
	   c += spoint[2][total]; 
   }
   return c;
}
//Scan Vertical, Horizontal, Bias with color is nside,
//check is break and empty
public int  Vertical(int mi, int mj, int nside)
{
   boolean b1=false,b2=false; //break 1 && 2
   int i,e,k1=0,k2=0,te=0/*total empty*/,
	   ne = grid[mi][mj].getColor()==nside?1:0; //num empty it's grid not empty square
   int c=0; //calculator
   //vertical
   for(i=mi,e=ne;i>-1 && i>mi-9 && e<=2;i--){
     if(grid[i][mj].getColor() == nside){ k1++;}	 
	 if(grid[i][mj].getColor() == 0){ 
		 e++; te++;
         if(e==2 && (i-1)>-1){
			 if(grid[i-1][mj].getColor() == nside)  c -= 5;
             if(grid[i-1][mj].getColor() != nside) break;
		 }
		 if(e>=2 && (i-1)==-1) break;
	 }
     if(grid[i][mj].getColor() == 3-nside || (i-1 == -1)){ b1=true;break;}
   }

   for(i=mi,e=ne;i<rows && i< mi+9 && e<=2;i++){
     if(grid[i][mj].getColor() == nside){ k2++;}	 
	 if(grid[i][mj].getColor() == 0){
		 e++; te++;
         if(e==2 && (i+1)<rows){
			 if(grid[i+1][mj].getColor() == nside) c -= 5;
             if(grid[i+1][mj].getColor() != nside) break;
		 }
		 if(e>=2 && (i+1)==rows) break;
	 }
     if(grid[i][mj].getColor() == 3-nside || (i+1 == rows)){ b2=true; break;} 
   }
   
   //calc point   
   int num = (k1+k2) - ne;  
   return c + CalcLine(b1,b2,num,ne,te);
}
public int  Horizontal(int mi, int mj, int nside)
{
   boolean b1=false,b2=false;
   int j,e,k1=0,k2=0,te=0/*total empty*/,
	     ne = grid[mi][mj].getColor()==nside?1:0; //is grid not empty square
   int c=0;
   //horizontal
   for(j=mj,e=ne;j>-1 && j>mj-9 && e<=2;j--){
     if(grid[mi][j].getColor() == nside){ k1++;}	 
	 if(grid[mi][j].getColor() == 0){
		 e++; te++;
         if(e==2 && (j-1)>-1){
			 if(grid[mi][j-1].getColor() == nside) c -= 5;
			 if(grid[mi][j-1].getColor() != nside) break;
		 }
		 if(e>=2 && (j-1)==-1) break;
	 }
     if(grid[mi][j].getColor() == 3-nside || ((j-1) == -1)){ b1=true;break;} 
   }
   
   for(j=mj,e=ne;j<colums && j< mj+9 && e<=2;j++){
     if(grid[mi][j].getColor() == nside){ k2++;}	 
	 if(grid[mi][j].getColor() == 0){
		 e++; te++;
         if(e==2 && (j+1)<colums){
			 if(grid[mi][j+1].getColor() == nside) c -= 5;
			 if(grid[mi][j+1].getColor() != nside) break;
		 }
		 if(e >= 2 && (j+1)== colums) break;
	 }
     if(grid[mi][j].getColor() == 3-nside || ((j+1) == colums)){ b2=true; break;}
   }
    
   //calc point   
   int num = (k1+k2) - ne;   
   return c + CalcLine(b1,b2,num,ne,te);
}
public int  Bias1(int mi, int mj, int nside)
{
   boolean b1=false,b2=false;
   int i,j,e,k1=0,k2=0,n=0,te=0/*total empty*/,
	    ne = grid[mi][mj].getColor()==nside?1:0; //is grid not empty square
   int c=0;
   // bias 1
   for(i=mi,j=mj,e=ne;i>-1 && j>-1 && n<9 && e<=2;i--,j--){
     if(grid[i][j].getColor() == nside){ k1++;}	 
	 if(grid[i][j].getColor() == EMPTY){
		 e++; te++;
         if(e==2 && (i-1)>-1 && (j-1)>-1){
			 if(grid[i-1][j-1].getColor() == nside) c -= 5;
			 if(grid[i-1][j-1].getColor() != nside) break;
		 }
		 if(e>=2 && ((i-1)==-1 || (j-1)==-1)) break;
	 }
     if(grid[i][j].getColor() == 3-nside || ((i-1) == -1) || ((j-1) == -1) ){ b1=true; break;} 
	 n++;
   }
   //c += k1;
   n=0; 
   for(i=mi,j=mj,e=ne;i<rows && j<colums && n<9 && e<=2;i++,j++){
     if(grid[i][j].getColor() == nside){ k2++;}	 
	 if(grid[i][j].getColor() == EMPTY){
		 e++; te++;
         if(e==2 && ((i+1)<rows && (j+1)<colums)){
			 if(grid[i+1][j+1].getColor() == nside) c -= 5;
			 if(grid[i+1][j+1].getColor() != nside) break;
		 }
		 if(e>=2 && ((i+1)==rows || (j+1)==colums)) break;
	 }
     if(grid[i][j].getColor() == 3-nside || ((i+1)==rows) || ((j+1)==colums)){ b2=true; break;}
     n++;
   }
   
   //calc point      
   int num = (k1+k2) - ne; 
   return c + CalcLine(b1,b2,num,ne,te);
}
public int  Bias2(int mi, int mj, int nside)
{
   boolean b1=false,b2=false;
   int i,j,e,k1=0,k2=0,n=0,te=0/*total empty*/,
	     ne = grid[mi][mj].getColor()==nside?1:0; //is grid not empty square
   int c=0;
   //bias 2
   for(i=mi,j=mj,e=ne;i<rows && j>-1 && n<9 && e<=2;i++,j--){
     if(grid[i][j].getColor() == nside){ k1++;}	 
	 if(grid[i][j].getColor() == EMPTY){
		 e++; te++;
         if(e==2 && (i+1)<rows && (j-1)>-1){
			 if(grid[i+1][j-1].getColor() == nside) c -= 5;
			 if(grid[i+1][j-1].getColor() != nside) break;
		 }
		 if(e>=2 && ((i+1) == rows || (j-1)==-1)) break;
	 }
     if(grid[i][j].getColor() == 3-nside || ((i+1)==rows) || ((j-1)==-1)){ b1=true; break;} 
	 n++;
   }
   //c += k1;
   n=0;
   for(i=mi,j=mj,e=ne;i>-1 && j<colums && n<9 && e<=2;i--,j++){
     if(grid[i][j].getColor() == nside){ k2++;}	 
	 if(grid[i][j].getColor() == EMPTY){
		 e++; te++;
         if(e==2 && (i-1)>-1 && (j+1)<colums){
			 if(grid[i-1][j+1].getColor() == nside) c -= 5;
			 if(grid[i-1][j+1].getColor() != nside) break;
		 }
		 if(e>=2 && ((i-1)==-1 || (j+1)==colums)) break;
	 }
     if(grid[i][j].getColor() == 3-nside || ((i-1)== -1) || ((j+1)==colums)){ b2=true; break;} 
	 n++;
   }
   
   //calc point
   int num = (k1+k2) - ne;
   return c + CalcLine(b1,b2,num,ne,te);
}
int GetMaxSide(int nside){
   int i,j;
   int best = 0,val;
   Move bs = new Move(0,0,0); // best piece
    // search best points of nside
   for(i=cRect.y1;i<=cRect.y2;i++){
	    for(j=cRect.x1;j<=cRect.x2;j++)	{
   //for(i=0;i<rows;i++){
	   // for(j=0;j<colums;j++){
           if(grid[i][j].getColor() == nside){
              val = CalcPoints(i,j,nside,-1);
			  if(val>5000) val -= 5300;	
			  if(best == val && best> 0){
				int Add = CalcPoints(i,j,nside,5);
                if(Add > CalcPoints(bs.gety(),bs.getx(),nside,5)) val += Add; 
			  }
			  if(best < val){
				  best = val; bs.y=i; bs.x=j;
			  }		
		   }
		}
   }   
   return best;
}
int GetMaxLine(int nside)
{
   int i,k;
   int best = 0,val;  
    // search best points of nside    
   for(i=m_hp-1;i>hp && i-2>0;i -= 2){  // in process for computer think
	   for(k=0;k<4;k++){
           val = CalcPoints(histmove[i].y,histmove[i].x,nside,k);
		   if(val>5000) val -= 5300;  // is 6 piece	
		   if(val > best) best = val;
	   }
   }
   return best;
}

int TryOfMaxSide(int nside)
{
    int bestside = 0,val;
	int i,n,k=max[ply];
	boolean maskbreak = false;
    n=QuickGen(nside,false);
	Sort();
   
    i=Gen_begin[ply];
	while(Gen_dat[i++].prior>2);
	//reject
	if(i-Gen_begin[ply]> k) k = i-Gen_begin[ply];
	if(n>k) Gen_end[ply] = Gen_begin[ply] + k;

    for (i=Gen_begin[ply]; i<Gen_end[ply] && maskbreak==false; i++) {

		grid[Gen_dat[i].y][Gen_dat[i].x].setColor(nside);
		val = CalcPoints(Gen_dat[i].y,Gen_dat[i].x,nside,-1);
		if(val>5000){
           if(WinFive(Gen_dat[i].y,Gen_dat[i].x,nside) == NOWON) val -= 5300;	
		   else{ val = (20-ply)*1000; maskbreak = true;}
		}
		grid[Gen_dat[i].y][Gen_dat[i].x].setColor(EMPTY);        
		if(val>bestside) bestside = val;
	}
   return bestside ;
}

}//end class board

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -