象棋AI博弈演算法(最大值最小值演算法)

2021-09-29 11:36:03 字數 1917 閱讀 2701

最大值最小值在象棋運用的很多,也是最基礎的走棋演算法:首先根據基礎局面計算各個走棋的局面分,假如說電腦要計算三層,那麼如圖:

總之就是要在所有走法中瘸子裡面挑將軍的意思:電腦想自己得分最高,電腦假設人下棋的時候要推斷出最優的走法也就是得分最高的走法,那麼人就會選擇電腦走法得分最高的走法,然後人從這些走法中挑選出分值最小的走法給電腦,電腦又想從人給的這些走法中挑出值最大的哪乙個,所以這就是最小值最大值演算法

下面是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...