算法学习---一个博弈问题

#include <stdio.h>
#include <stdlib.h>
template <class type>
void inline Swap(type &a,type &b)
{
    type tmp=a;
    a=b;
    b=tmp;
}
class Chess
{
public:
    Chess()
    {
        int i,j;
        int c[5][10]=
        {{0,1,1,0,1,1,0,1,1,0},
        {1,0,0,1,0,1,1,0,1,-1},
        {0,0,0,0,-1,-1,-1,-1,-1,-1},
        {1,1,1,0,1,1,1,-1,-1,-1},
        {1,-1,-1,-1,-1,-1,-1,-1,-1,-1}  }; 
        //1是黑棋 0是白棋
        for(i=0;i<5;i++)
            for(j=0;j<10;j++)
                chess[i][j]=c[i][j];
        rows=5;
         
    }
    Chess(Chess &other)
    {
        int i,j;
        for(i=0;i<other.rows;i++)
        {for(j=0;j<10;j++)  
            chess[i][j]=other.chess[i][j];
        }
        rows=other.rows;
    }
    int isWin(int turn) const  //1该黑棋走,0该白棋走
    {
        if (rows==0) return 1;
                 
        int i,j;
        for(i=0;i<rows;i++)
        {
            for(j=0;j<10;j++)
            {
                if(chess[i][j]==!turn) return 0;
            }
        }
        return 1;
         
    }
    void takeout(int k,int l)
    {
     
        int i,j,flag=0;
     
     
        for(j=l;j<10;j++) chess[k][j]=-1;
        for(j=0;j<10;j++)
        {
            flag=chess[k][j]!=-1;
            if (flag==1) break;
                 
        }
        if(flag==0)
        {
                 
            for(i=k;i<rows-1;i++)
            {
                for(j=0;j<10;j++)
                {
                    Swap(chess[i][j],chess[i+1][j]);
                }
            }
            rows--;
        }
         
    }
     
    int CheckInput(int i,int j)
    {
        if(i<0||i>=rows||j<0||j>=10)
        {
            printf("该棋子不存在! ");
            return 0;
        }
        else
        {
            if(chess[i][j]==-1) {
                printf("该棋子不存在!2 ");
                return 0;
            }
            if(chess[i][j]==0) {
                printf("您不能选择白棋! ");
                return 0;
            }
     
        }
    return 1;
    }
    double EigenValue() const
    {
        double value = 0;
        int i,j;
        for(i=0;i<rows;i++)
        {
            if (chess[i][0] == 0 && chess[i][1] == 0 && chess[i][2] == -1)
            {
                value+= 0.5;
            }
            else
            {
             
                for(j=0;j<10;j++)
                {
                 
                    switch(chess[i][j])
                    {
                        case 1:value--;break;
                        case 0:value++;break;
         
                    }
                }
            }
        }
        return value;
    }
    void print() const
    {
        int i,j;
        for(i=0;i<rows;i++)
        {
            for(j=0;j<10;j++)
            {
                switch(chess[i][j])
                {
                case 1:printf("●");break;
                case 0:printf("○");break;
         
                }
            }
            printf(" ");
        }
    }
int chess[5][10];
int rows;
};
//AI下棋的程序
void AIPredict(Chess c,int &AIi,int &AIj)
{
    struct v{
        int i,j;
        double value;
         
    } value[50];
    int count=0,i,j;
     
     
     
    for(i=0;i<c.rows;i++)
        {
            for(j=0;j<10;j++)
            {
                if(c.chess[i][j]==0)
                {
                    Chess predict=c;
                    predict.takeout(i,j);
                    value[count].i=i;
                    value[count].j=j;
                    value[count].value=predict.EigenValue();
                    count++;
                }
            }
        }
    v maxvalue=value[0];
    for(i=1;i<count;i++)
    {
        if(value[i].value>maxvalue.value)
        {
            maxvalue=value[i];
        }
    }
    AIi=maxvalue.i;
    AIj=maxvalue.j;
}
int main()
{
    system("color F0");
    printf("游戏规则: 下面有五行石子,白色空心○的石子都是我的,黑色实心●的石子都是你的。 我们轮流拿走一个自己的石子,并且规定如果一个石子被拿走了, 它后面的所有石子都要被扔掉。谁先没有拿的了,谁就输了。 ");
    Chess c;
    c.print();
    printf(" ");
     
    int i,j,turn;
    printf("你想先手还是后手?1为先手,0为后手:");
    scanf("%d", &turn);
    printf(" ");
    while(!c.isWin(turn))
    {
         
        if (turn==1) {
             
            do{
             
                printf("请输入i j表示你要下的位置:(从0开始)");
                scanf("%d %d",&i,&j);
                 
             
            }while(!c.CheckInput(i,j));
                c.takeout(i,j);
                printf(" ");
                c.print();
         
        }
        else
        {
            AIPredict(c,i,j);
            printf("电脑下的位置是:<%d,%d> ",i,j);
            c.takeout(i,j);
            printf(" ");
            c.print();
        }
        turn = !turn;
    }
    if(turn)
    {
        printf("你赢了! ");
    }
    else
    {
        printf("你输了! ");
    }
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/xieyulin/p/7060748.html