|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的),本部分为电脑的野生智能。
为了加速AI的盘算速率,必需对后面的计划举行大批的修正,并终极向VC平台转移。在用VC完成的游戏中,棋盘将接纳BitBoard手艺,棋子的显现将完全和逻辑分隔。今朝JAVA版本仍旧接纳数组暗示棋盘,次要是便于逻辑剖析和计划。
先对第一个AI举行总结。FirstAI:
packagenicholas.game.chess;
classFirstAIextendsChessPlayer{
privateChessModelmodel[][][];
privateStepStackstack;
privateStepstep;
privateintlayer;
privateintturn;
protectedGameRulegameRule;
publicFirstAI(intt){
super(false);
stack=newStepStack();
layer=7;
//layer=3;
turn=t;
}
publicStringgetName(){
return"ColinRobot";
}
publicStepgetNextStep(ChessModelm[][][]){
//algo
model=m;
System.out.println("max="+getLayerValue(0));
stack.removeAll();
returnstep;
}
//getlargestvalue
privateintgetLayerValue(intlay){
if(lay>layer){
//norecursion
return-1*getModelValue();
}
intvalue=0;
intmax=-2000;
intdecision;
for(intz=0;z<3;z++){
for(inty=0;y<3;y++){
for(intx=0;x<3;x++){
if((x==1&&y==1)||model[z][y][x].isOccupied())continue;
//assumelaychessmanhere
model[z][y][x].acceptChessman(Chessman.CHESS[(turn+lay)%2]);
decision=gameRule.checkStep(model[z][y][x],model);
switch(decision){
case0://win
stack.add(newStep(model[z][y][x],decision));
value=1000;
break;
case3://tiaodan|gan
gameRule.checkDecision(model[z][y][x],1,model);
stack.add(newStep(model[z][y][x],1));
value=660;
/*value=-1*getLayerValue(lay+1);
//rollback
gameRule.undoStep(stack.remove(),model);
model[z][y][x].acceptChessman(Chessman.CHESS[(turn+lay)%2]);
//another
gameRule.checkDecision(model[z][y][x],2,model);
stack.add(newStep(model[z][y][x],2));
intb=-1*getLayerValue(lay+1);
//choosebetter
if(value<b){
value=b;
}else{
//rollback
gameRule.undoStep(stack.remove(),model);
model[z][y][x].acceptChessman(Chessman.CHESS[(turn+lay)%2]);
//redofirst
gameRule.checkDecision(model[z][y][x],1,model);
stack.add(newStep(model[z][y][x],1));
}
*/break;
case1://tiaodan
stack.add(newStep(model[z][y][x],decision));
value=660;
break;
case2://gan
stack.add(newStep(model[z][y][x],decision));
value=320;
break;
default://tiaodan,gan,none
stack.add(newStep(model[z][y][x],decision));
value=-1*getLayerValue(lay+1);
}
if(value>max){
max=value;
if(lay==0){
//firstlayer,savestep
System.out.println("max="+max);
step=stack.getTop();
}
}
//removechessman
gameRule.undoStep(stack.remove(),model);
if(max==1000)returnmax;
}
}
}
returnmax;
}
privateintgetModelValue(){
return3;
}
publicvoidsetGameRule(GameRulerule){
gameRule=rule;
}
}
FirstAI间接承继ChessPlayer,今后将转为直接承继。接纳最年夜最小深度优先搜刮,停止对某分支(仅以后条理)的搜刮的两个前提为:A.该条理玩家赢。B.最深搜刮条理。最深搜刮条理时将前往对场合排场的评价值(未计划,一概前往3,暗示落子得3分。)。
前面的计划,除BitBoard完成棋盘外必要思索几个成绩:
1)搜刮的条理。针对第一步着法,强迫往除部分有关分支(x+y>2),再将搜刮条理设置为7,便可失掉准确的着法。因而估量最年夜的搜刮条理设置为7便可。
2)算法的改善。即便搜刮条理仅为7,盘算一步也要思索46亿种大概性,假定每种大概性必要60次运算,以我的本本的设置必要三分钟。是不是计划残局库(盘算标明部分落子唯一独一应手);别的将思索接纳别的的搜刮技能;破直将有分外的嘉奖(场合排场值>3);思索可杠可单时,单是不是必定比杠有益。
3)场合排场的估值。对照庞大,思索中。
不得不提一下的是:.net是看到java红,而开发出来的工具。 |
|