正文

五子棋AI(II)2005-08-07 11:03:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/elva6401/3589.html

分享到:

(3)    给出下了一个子后的分数:
int CMyChessDlg::GiveScore(int type, int x, int y)
{
        int i,score=0;
    for(i=0;i<572;i++)
    {
        //计算机下
        if(type==1)
        {
            if(ctable[x][y][i])
            {
                switch(win[1][i])
                {
                case 1:
                    score+=5;
                    break;
                case 2:
                    score+=50;
                    break;
                case 3:
                    score+=100;
                    break;
                case 4:
                    score+=10000;
                    break;
                default:
                    break;
                }
            }
        }
        //人下
        else
        {
            if(ptable[x][y][i])
            {
                switch(win[0][i])
                {
                case 1:
                    score-=5;
                    break;
                case 2:
                    score-=50;
                    break;
                case 3:
                    score-=500;
                    break;
                case 4:
                    score-=5000;
                    break;
                default:
                break;
            }
            }
        }
    }
    return score;
}
(4)    核心程序 ,(5)    即计算机如何运用极小极大法分析,(6)    选取最优走法,(7)    
在程序中极小极大法即体现在两个while循环前后及之间的内容,其估价函数的体现在ctemp+pscore中
void CMyChessDlg::ComTurn()
{
        //bestx,best为当前最佳位置,i,j是人能下的各种位置;pi,pj是计算机能下的各种位置
    Int   bestx,besty,i,j,pi,pj,ptemp,ctemp,pscore=10,cscore=-10000,
ctempboard[15][15],ptempboard[15][15];
    int m,n,temp1[20],temp2[20];//暂存第一步搜索的信息
    if(start)
    {
        if(board[7][7]==2)
        {
            bestx=7;
            besty=7;
        }
        else
        {
            bestx=8;
            besty=8;
        }
        start=false;
    }
    else
    {//寻找最佳位置
        GetBoard(ctempboard,board);
    while(SearchBlank(i,j,ctempboard))
    {//进行第一步查找
        n=0;
        pscore=10;
        GetBoard(ptempboard,board);//获取当前棋盘状态
        ctempboard[i][j]=3;//标记已被查找
        ctemp=GiveScore(1,i,j);
        for(m=0;m<572;m++)
        {//暂时更改玩家信息
            if(ptable[i][j][m])
            {
                temp1[n]=m;
                ptable[i][j][m]=false;
                temp2[n]=win[0][m];
                win[0][m]=7;
                n++;
            }
        }
        ptempboard[i][j]=1;
        

阅读(2988) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册