最大值最小值在象棋運用的很多,也是最基礎的走棋演算法:首先根據基礎局面計算各個走棋的局面分,假如說電腦要計算三層,那麼如圖:
總之就是要在所有走法中瘸子裡面挑將軍的意思:電腦想自己得分最高,電腦假設人下棋的時候要推斷出最優的走法也就是得分最高的走法,那麼人就會選擇電腦走法得分最高的走法,然後人從這些走法中挑選出分值最小的走法給電腦,電腦又想從人給的這些走法中挑出值最大的哪乙個,所以這就是最小值最大值演算法
下面是c++版本的ai走棋演算法:
step& ai::getstep(gamescene& game,int level)
// 獲得所有可能移動的移動方案
vectorai::getallsteps(gamescene& game)
else
for (int i = start; i < start + 16; i++)
if (killid == -1 && game.chessboard->dealrealwar(piece->id, killid, piece->row, piece->col, row, col))
else if (killid != -1 && game.chessboard->dealwar(piece->id, killid)) }}
}} }
time(&end);
cost = difftime(end,start);
return steparr;
}// 獲得局面分最大的分數
int ai::getmaxscore(gamescene* game, int level)
vectorallmoves = this->getallsteps(*game);
int topscore = -30000323;
// 遍歷每一種走法
for (int i = 0; i < allmoves.size(); i++)
} // 取消走棋試探
this->unfakemove(game, moveitem);
} return topscore;
}// ai獲得對方子局面中最小的分值
int ai::getminscore(gamescene* game, int level)
vectorallmoves = this->getallsteps(*game);
int minscore = 30000323;
// 遍歷每一種走法
for (int i = 0; i < allmoves.size(); i++)
} // 取消走棋試探
this->unfakemove(game, moveitem);
} return minscore;
}// 計算得分
int ai::calscore(gamescene* game) ;
// 己方得分
int bottomscore = 0;
// 敵方得分
int upscore = 0;
for (int i = 0; i < 16; i++)
} for (int j = 16; j < 32; j++)
} // 返回得分
return upscore - bottomscore;
}// 試探性的走棋
void ai::fakemove(gamescene* game,step* step)
// 取消試探走棋邏輯
void ai::unfakemove(gamescene* game, step* step)
else
game->redrun = !game->redrun;
}
最大值 最小值
求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...
AI象棋中的,最大最小值演算法思路
一層的情況就不討論了,直接就是走一步後,當前局面的最高分 第二層情況 第三層情況 現在分析一下為什麼會出現最大最小值演算法 因為走棋是你一步我一步的來。作為我來說,我肯定願意選當前局面分值最大的一步。作為對方來說,對方肯定不是傻子,肯定選你局面分最小的情況。這樣就形成了,最大,最小值演算法,最大 我...
int float double 最大值,最小值
中沒有double的最大最小值。如果輸出的比如 100lf輸出2.23432432,沒有達到100位,則最後2後面不一定都是0。原文見view plaincopy to clipboardprint?coder acboy date 2010 3 1 include include using na...