📄 board.java
字号:
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 + -