VC完成五子棋游戲的一個算法示例。本站提示廣大學習愛好者:(VC完成五子棋游戲的一個算法示例)文章只能為提供參考,不一定能成為您想要的結果。以下是VC完成五子棋游戲的一個算法示例正文
本文講述了VC完成五子棋游戲的一個算法示例,該算法采取極年夜極小剪枝博弈算法,感興致的讀者可以對法式中不完美的部門停止修正與完美。
該設計重要包含:數據構造、估值函數、輸贏斷定、搜刮算法
法式運轉界面以下:
詳細完成步調以下:
1、數據構造
//記載每步棋,可以樹立鏈表用來停止悔棋、撤退退卻(本法式沒有完成)
struct Step
{
int x,y; //棋子坐標
int ball; //表現下子方{BLACK,WHITE}
};
//記載棋盤情形,用於搜刮進程
class CBoardSituation
{
public:
int nArrBoard[15][15]; //棋盤情形
struct Step machineStep; //AI所下的那一步
long value; //盤面所打的分數
};
//以後棋盤,用於棋盤顯示
int nArrBoard[15][15];
2、估值函數
剖析以後棋盤上诟谇兩邊棋型:五連、活4、沖4、雙活3、單活3、眠3、活2、眠二,然後依據五子棋規矩給棋盤打分,
詳細分值可以依據經歷本身肯定。本法式中:五連=9999(極值),活四=9990,沖四=9980,雙活三=9970,多活三加2000,
單活三加200,每一個眠三加10,每一個活二加4,每一個眠二加1。個中打分時還要依據以後下棋方情形停止打分。
3、輸贏斷定
這個比擬簡略,依據最初落子情形從程度、垂直、左斜、右斜四個偏向檢討能否存在五個持續棋子便可。
4、搜刮算法
算法采取極年夜極小值博弈算法,它的重要思惟為:猜測後N步下棋情形,對猜測的後N個棋盤停止打分。輪到本身下棋時選分值最年夜的,輪到對方下時選分值最小的。選出我們以為最優的作為下一步走法。本法式算法根本思惟以下(算法說話表現):
void DFAI()
{
long value=-MAXINT; //對初始根節點的value賦值
CBoardSituation currentBoard;
//獲得以後機械新棋面情形
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
currentBoard.nArrBoard[i][j]=nArrBoard[i][j];
currentBoard.machineStep.ball=ComputerBall;
currentBoard.machineStep.x=gnRow;
currentBoard.machineStep.y=gnColumn;
currentBoard.value=Eveluate(currentBoard.nArrBoard,BLACK);
//拔取幾個最好的下法(貪心法)-->CountList;
GetSeveralGoodPlace(¤tBoard,WHITE);
CountList.RemoveAll();
POSITION pos=templist.GetHeadPosition();
for(int j=0;j {
CountList.AddTail(templist.GetNext(pos));
}
pos=CountList.GetHeadPosition();
CBoardSituation *pBoard;
//對這些盤面做進一步深度搜刮
for(i=0;i {
pBoard= &(CountList.GetNext(pos));
pBoard->value=Search(pBoard,BLACK,value,0);
value=Select(value,pBoard->value,WHITE); //找出最年夜的分值
}
//回到鏈表頭
pos=CountList.GetHeadPosition();
for(i=0;i {
pBoard= &(CountList.GetNext(pos));
if (value==pBoard->value) //找出獲得最高分的盤面
{
value=pBoard->value;
gnRow=pBoard->machineStep.x;
gnColumn=pBoard->machineStep.y;
bPlayerDo=TRUE; //以後下子方改成人
break;
}
}
//其他處置
}
個中Search()函數以下:
//算法搜刮函數
long Search(CBoardSituation *board,int mode,long &oldvalue, int depth)
{
CList m_DeepList;
long value;
if(depthnArrBoard,mode))<8000)
{
value=(mode==WHITE)?-MAXINT:MAXINT;
//選擇幾個最好的搜刮目的
GetSeveralGoodPlace(board,mode);
POSITION pos=templist.GetHeadPosition();
for(int j=0;j {
m_DeepList.AddTail(templist.GetNext(pos));
}
pos=m_DeepList.GetHeadPosition();
CBoardSituation successorBoard;
for(int i=0;i {
successorBoard= m_DeepList.GetNext(pos);
//能否停止持續深度搜刮(剪枝):極年夜極小值法
if((mode==WHITE && value<=oldvalue) || (mode==BLACK && value>=oldvalue))
{
if(mode==WHITE)
value=Select(value,Search(&successorBoard,BLACK,value,depth+1),WHITE);
else//mode==BLACK
value=Select(value,Search(&successorBoard,WHITE,value,depth+1),BLACK);
}
}
return value;
}
else//搜刮停止前提
{
return Eveluate(board->nArrBoard,mode);//棋面打分
}
return 0;
}