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


    #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;
    }
  • 相关阅读:
    将新的rpm包添加到本地yum源
    linux cp命令直接覆盖不提示按Y/N的方法
    十一月二十一学习报告
    十一月二十学习报告
    十一月十九学习报告
    十一月十八学习报告
    十一月十七学习报告
    十一月十五学习报告
    十一月十四学习报告
    十一月十三学习报告
  • 原文地址:https://www.cnblogs.com/xieyulin/p/7060748.html
Copyright © 2020-2023  润新知