class MoveList
{
public int From;
public int To;
}
class Sum
{
public int WinSum = 0;
public MoveList Move = new MoveList();
}
class MoveListAndCount
{
public MoveList moveList = new MoveList();
public int Count = 0;
}
public class McSearch extends Einstein
{
private final int pos[] = {6,5,1};
private int CBoard[];
public MoveList BlueMoveList[] = new MoveList[6];
public MoveList GreenMoveList[] = new MoveList[6];
public Sum[] Num = new Sum[6];
McSearch()
{
CBoard = new int[25];
for(int i=0;i<6;i++)
{
Num[i] = new Sum();
BlueMoveList[i] = new MoveList();
GreenMoveList[i] = new MoveList();
}
CopyBoard();
}
public void CopyBoard()
{
for(int i=0;i<25;i++)
{
CBoard[i] = Board[i];
}
}
public void UnCopyBoard()
{
for(int i=0;i<25;i++)
{
Board[i] = CBoard[i];
}
Init();
}
public MoveListAndCount CreateBlueRandMove(int Dice,MoveListAndCount Move)
{
Move = BlueAloneMove(Dice,Move);
if(Move.Count ==0 || Move.Count == 1)
{
Move.Count = 1;
return Move;
}
int Rand = random.nextInt(Move.Count);
Move.moveList = BlueMoveList[Rand];
return Move;
}
public MoveListAndCount CreateGreenRandMove(int Dice,MoveListAndCount Move)
{
Move = GreenAloneMove(Dice,Move);
if(Move.Count ==0 || Move.Count == 1)
{
Move.Count = 1;
return Move;
}
int Rand = random.nextInt(Move.Count);
Move.moveList = GreenMoveList[Rand];
return Move;
}
public MoveListAndCount CreateBlueMove(int Dice,MoveListAndCount Move)
{
int m = Dice,i,min = 100,evals;
while(m < 7 && !Stone[m].IsExist)
{
m++;
}
if(m<7)
{
for(i=0;i<3;i++)
{
if(IsBlueVaild(m,Stone[m].Position,Stone[m].Position + pos[i]))
{
int ToDice = Board[Stone[m].Position + pos[i]],DiceFrom = Stone[m].Position;
MakeMove(Stone[m].Position,Stone[m].Position + pos[i]);
if(IsBlueWin())
{
UnMakeMove(m,ToDice,DiceFrom,DiceFrom + pos[i]);
Move.moveList.From = Stone[m].Position;
Move.moveList.To = Move.moveList.From + pos[i];
return Move;
}
evals = Blueevals();
UnMakeMove(m,ToDice,DiceFrom,DiceFrom + pos[i]);
if(min > evals)
{
min = evals;
Move.moveList.From = Stone[m].Position;
Move.moveList.To = Stone[m].Position + pos[i];
}
}
}
}
int n =Dice;
while(n > 0 && !Stone[n].IsExist)
{
n--;
}
if(m!=Dice && n>0)
{
for(i=0;i<3;i++)
{
if(IsBlueVaild(n,Stone[n].Position,Stone[n].Position + pos[i]))
{
int ToDice = Board[Stone[n].Position + pos[i]],DiceFrom = Stone[n].Position;
MakeMove(Stone[n].Position,Stone[n].Position + pos[i]);
if(IsBlueWin())
{
UnMakeMove(n,ToDice,DiceFrom,DiceFrom + pos[i]);
Move.moveList.From = Stone[n].Position;
Move.moveList.To = Move.moveList.From + pos[i];
return Move;
}
evals = Blueevals();
UnMakeMove(n,ToDice,DiceFrom,DiceFrom + pos[i]);
if(min > evals)
{
min = evals;
Move.moveList.From = DiceFrom;
Move.moveList.To = DiceFrom + pos[i];
}
}
}
}
return Move;
}
public MoveListAndCount CreateGreenMove(int Dice,MoveListAndCount Move)
{
int m = Dice,i,min = 200,evals;
while(m < 13 && !Stone[m].IsExist)
{
m++;
}
for(i=0;i<3;i++)
{
if(m<13 && IsGreenVaild(m,Stone[m].Position,Stone[m].Position - pos[i]))
{
int ToDice = Board[Stone[m].Position - pos[i]],DiceFrom = Stone[m].Position;
MakeMove(Stone[m].Position,Stone[m].Position - pos[i]);
if(IsGreenWin())
{
UnMakeMove(m,ToDice,DiceFrom,DiceFrom - pos[i]);
Move.moveList.From = Stone[m].Position;
Move.moveList.To = Move.moveList.From - pos[i];
return Move;
}
evals = Greenevals();
UnMakeMove(m,ToDice,DiceFrom,DiceFrom - pos[i]);
if(min > evals)
{
min = evals;
Move.moveList.From = Stone[m].Position;
Move.moveList.To = Move.moveList.From - pos[i];
}
}
}
if(m == Dice)
return Move;
int n =Dice -1;
while(n > 6 && !Stone[n].IsExist)
{
n--;
}
for(i=0;i<3;i++)
{
if(n>6 && IsGreenVaild(n,Stone[n].Position,Stone[n].Position - pos[i]))
{
int ToDice = Board[Stone[n].Position - pos[i]],DiceFrom = Stone[n].Position;
MakeMove(Stone[n].Position,Stone[n].Position - pos[i]);
if(IsGreenWin())
{
UnMakeMove(n,ToDice,DiceFrom,DiceFrom - pos[i]);
Move.moveList.From = Stone[n].Position;
Move.moveList.To = Move.moveList.From - pos[i];
return Move;
}
evals = Greenevals();
UnMakeMove(n,ToDice,DiceFrom,DiceFrom - pos[i]);
if(min > evals)
{
min = evals;
Move.moveList.From = Stone[n].Position;
Move.moveList.To = Move.moveList.From - pos[i];
}
}
}
return Move;
}
public MoveListAndCount BlueAloneMove(int Dice,MoveListAndCount Move)
{
int m = Dice,i,ToDice,DiceFrom;
Move.Count = 0;
while(m<7 && !Stone[m].IsExist)
{
m++;
}
for(i=0;i<3;i++)
{
if(m<7 && IsBlueVaild(m,Stone[m].Position,Stone[m].Position+pos[i]))
{
BlueMoveList[Move.Count].From = Stone[m].Position;
BlueMoveList[Move.Count].To = Stone[m].Position+pos[i];
ToDice = Board[Stone[m].Position+pos[i]];
DiceFrom = Stone[m].Position;
MakeMove(Stone[m].Position,Stone[m].Position+pos[i]);
if(IsBlueWin())
{
UnMakeMove(m,ToDice,DiceFrom,DiceFrom+pos[i]);
Move.moveList.From = Stone[m].Position;
Move.moveList.To = Stone[m].Position+pos[i];
Move.Count = 1;
return Move;
}
UnMakeMove(m,ToDice,DiceFrom,DiceFrom+pos[i]);
Move.moveList.From = Stone[m].Position;
Move.moveList.To = Stone[m].Position+pos[i];
Move.Count++;
}
}
if(m == Dice)
return Move;
int n = Dice -1;
while(n>0 && !Stone[n].IsExist)
{
n--;
}
for(i=0;i<3;i++)
{
if(n>0 && IsBlueVaild(n,Stone[n].Position,Stone[n].Position+pos[i]))
{
BlueMoveList[Move.Count].From = Stone[n].Position;
BlueMoveList[Move.Count].To = Stone[n].Position+pos[i];
ToDice = Board[Stone[n].Position+pos[i]];
DiceFrom = Stone[n].Position;
MakeMove(Stone[n].Position,Stone[n].Position+pos[i]);
if(IsBlueWin())
{
UnMakeMove(n,ToDice,DiceFrom,DiceFrom+pos[i]);
Move.moveList.From = Stone[n].Position;
Move.moveList.To = Stone[n].Position+pos[i];
Move.Count = 1;
return Move;
}
UnMakeMove(n,ToDice,DiceFrom,DiceFrom+pos[i]);
Move.moveList.From = Stone[n].Position;
Move.moveList.To = Stone[n].Position+pos[i];
Move.Count++;
}
}
return Move;
}
public MoveListAndCount BlueMcevals(int Dice,MoveListAndCount Move,int size)
{
Move = BlueAloneMove(Dice,Move);
int i,num=0,Rand,winnum,max=0;
MoveListAndCount move = new MoveListAndCount();
if(Move.Count == 0 || Move.Count == 1)
{
return Move;
}
CopyBoard();
for(i=0;i<Move.Count;i++)
{
num=0;
winnum = 0;
while(num < size)
{
UnCopyBoard();
MakeMove(BlueMoveList[i].From,BlueMoveList[i].To);
while(true)
{
Rand = GetGreenDice();
move = CreateGreenMove(Rand,move);
MakeMove(move.moveList.From,move.moveList.To);
if(IsGreenWin())
{
num++;
break;
}
Rand = GetBlueDice();
move = CreateBlueMove(Rand,move);
MakeMove(move.moveList.From,move.moveList.To);
if(IsBlueWin())
{
num++;
winnum++;
break;
}
}
}
Num[i].WinSum = winnum;
/****************************************************************************/
//注:Num[i].Move = BlueMoveList[i]是将其共用一个内存快,
//不论修改其中任一个变量都将引起共用内存块的值得改变
//所以,此处只能用 Num[i].Move.From = BlueMoveList[i].From;
//