甜桃呆檬 2022-05-26 22:43 采纳率: 100%
浏览 142
已结题

人机对弈井字棋游戏编程问题

程序要求:1.计算机为一方,人为一方,交替下棋,谁先连成一条直线谁胜;允许人选择先下还是后下。 2.界面要求:初始状态——显示棋盘,并显示玩家的操作键;游戏进行状态——动态显示棋盘不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家号。 3.提示计算机自动下棋的规则:计算机下时,应考虑所有空位,并按行、列、对角线计算每个空位的分值,若在某行(列、对角线)上,(设计算机画X,人画O)。已有XX 加50分 已有OO 加25分 已有X空 加10分 已有O空 加8分 都是空 加4分 然后选分值最高的位置画X。

  • 写回答

2条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2022-05-27 08:12
    关注
    
    #include <iostream>
    #include <string>
    using namespace std;
    typedef char chess[10];                    //字符数组
    typedef int temparr[10];                //整型数组
    chess arr;                                //定义字符数组变量
    temparr brr;                            //定义整型数组变量
    int number,suc,n3,c3,n2,c2,n1,c1;       
    void inarrdata(chess a)                    //初始化棋盘编号
    {
        a[1]='1';a[2]='2';a[3]='3';
        a[4]='4';a[5]='5';a[6]='6';
        a[7]='7';a[8]='8';a[9]='9';
    }
    void display(chess a)                    //输出棋盘状态
    {
        cout<<endl;cout<<endl;
        cout<<"  "<<a[1]<<" "<<'|'<<" "<<a[2]<<" "<<'|'<<" "<<a[3]<<endl;
        cout<<" -----------"<<endl;
        cout<<"  "<<a[4]<<" "<<'|'<<" "<<a[5]<<" "<<'|'<<" "<<a[6]<<endl;
        cout<<" -----------"<<endl;
        cout<<"  "<<a[7]<<" "<<'|'<<" "<<a[8]<<" "<<'|'<<" "<<a[9]<<endl;
        cout<<endl;cout<<endl;
    }
    int arrfull()                //判断还有没有下棋的位置
    {
        int i;               
        int arrf=0;
        for(i=1;i<=9;i++)
            if(i==arr[i]-48)        //如果字符arr[i]-48等于i
                arrf=1;                //那么arrf=1,也就是可以走棋
        return arrf;
    }
    void cn(int line)                //判断状态
    {
        switch(line)
            {
                case 0:c3=c3+1;break;
                case 1:n2=n2+1;break;
                case 2:c2=c2+1;break;
                case 3:n1=n1+1;break;
                case 4:c1=c1+1;break;
                case 5:n3=n3+1;break;
            }
    }
    int linenum(char a,char b,char c)    //判断状态
    {
        int ln=6;
        if((a=='X')&&(b=='X')&&(c=='X'))
            ln=0;
        if(((a=='O')&&(b=='O')&&(c!='O'))||((a=='O')&&(b!='O')&&(c=='O'))||((a!='O')&&(b=='O')&&(c=='O')))
            ln=1;
        if(((a=='X')&&(b=='X')&&(c!='X'))||((a=='X')&&(b!='X')&&(c=='X'))||((a!='X')&&(b=='X')&&(c=='X')))
            ln=2;
        if(((a=='O')&&(b!='O')&&(c!='O'))||((a!='O')&&(b=='O')&&(c!='O'))||((a!='O')&&(b!='O')&&(c=='O')))
            ln=3;
        if(((a=='X')&&(b!='X')&&(c!='x'))||((a!='X')&&(b=='X')&&(c!='X'))||((a!='X')&&(b!='X')&&(c=='X')))
            ln=4;
    if((a=='O')&&(b=='O')&&(c=='O'))
            ln=5;
        return ln;
    }
    int maxbrr(int *br)        //判断最大权值
    {
        int temp,i,mb;
        temp=-888;
        for(i=1;i<=9;i++)
            {
                if(temp<=br[i])
                    {
                        temp=br[i];
                        mb=i;
                    }
            }
        return mb;
    }
    void manstep() //人走棋处理模块
    {
        int j;
        display(arr);
        if(arrfull())  //如果棋盘上还有下棋的位置,人走一步棋
            {
                cout<<"您要走哪一步?请输入数字(1--9):";
                cin>>j;
                while((j<1)||(j>9)||(j!=arr[j]-48))
                    {
                        cout<<"对不起,您输入的数字不对,请重新输入(1--9):";
                        cin>>j;
                    }
                arr[j]='O';
                n3=0;c3=0;n2=0;c2=0;n1=0;c1=0;
                number=linenum(arr[1],arr[2],arr[3]);cn(number);
                number=linenum(arr[4],arr[5],arr[6]);cn(number);
                number=linenum(arr[7],arr[8],arr[9]);cn(number);
                number=linenum(arr[1],arr[4],arr[7]);cn(number);
                number=linenum(arr[2],arr[5],arr[8]);cn(number);
                number=linenum(arr[3],arr[6],arr[9]);cn(number);
                number=linenum(arr[1],arr[5],arr[9]);cn(number);
                number=linenum(arr[3],arr[5],arr[7]);cn(number);
                if(n3!=0)                //您赢了
                    {
                        display(arr);
                        cout<<endl;
                        cout<<"恭喜您赢了!!!"<<endl;
                        suc=0;
                    }
            }
    }
    void computerstep()  //计算机走棋处理模块
    {
        int i;
        if(arrfull())  //如果棋盘上还有可下棋的位置,则计算机走棋
            {
                for(i=1;i<=9;i++)  //对每一步可走的棋进行计算
                    {
                        if(i==arr[i]-48)
                            {
                                c3=0;n2=0;c2=0;n1=0;c1=0;
                                arr[i]='X';
                                number=linenum(arr[1],arr[2],arr[3]);cn(number);
                                number=linenum(arr[4],arr[5],arr[6]);cn(number);
                                number=linenum(arr[7],arr[8],arr[9]);cn(number);
                                number=linenum(arr[1],arr[4],arr[7]);cn(number);
                                number=linenum(arr[2],arr[5],arr[8]);cn(number);
                                number=linenum(arr[3],arr[6],arr[9]);cn(number);
                                number=linenum(arr[1],arr[5],arr[9]);cn(number);
                                number=linenum(arr[3],arr[5],arr[7]);cn(number);
                                brr[i]=(128*c3-63*n2+31*c2-15*n1+7*c1);   //计算此步权值
                                arr[i]=i+48;
                            }
                        else
                            brr[i]=-999;
                    }
                arr[maxbrr(brr)]='X';    //确定计算机走哪一步,权值最大的一步
                c3=0;n2=0;c2=0;n1=0;c1=0;
                 number=linenum(arr[1],arr[2],arr[3]);cn(number);
                 number=linenum(arr[4],arr[5],arr[6]);cn(number);
                 number=linenum(arr[7],arr[8],arr[9]);cn(number);
                 number=linenum(arr[1],arr[4],arr[7]);cn(number);
                 number=linenum(arr[2],arr[5],arr[8]);cn(number);
                 number=linenum(arr[3],arr[6],arr[9]);cn(number);
                 number=linenum(arr[1],arr[5],arr[9]);cn(number);
                 number=linenum(arr[3],arr[5],arr[7]);cn(number);
                 if(c3!=0)                //计算机已赢
                    {
                        display(arr);
                        cout<<endl;
                        cout<<"计算机赢了!!!"<<endl;
                        suc=0;
                    }
                }
        else
            suc=0;
    }
    int main()
    {
        cout<<"游戏规则:"<<endl<<"棋盘格式如图,人和计算机在棋盘上交替走棋"<<endl;
        cout<<"约定计算机使用符号X,人使用符号O"<<endl;
        cout<<"谁先使一横行或一竖行或对角线上有三个自己的符号,就胜利了!"<<endl;
        string s="y";
        string ch;
        while(s=="y"||s=="Y")
        {
        inarrdata(arr);          //棋盘坐标编号
        display(arr);            //显示初始棋盘
        suc=1;
        cout<<"请选择您是否先走?(y/n)";
        cin>>ch;
        while(ch!="y"&&ch!="Y"&&ch!="n"&&ch!="N")
            {
                cout<<"错误!请输入y或n:";
                cin>>ch;
            }
        if((ch=="y")||(ch=="Y"))    //输入Y,表示人先走棋
            {
                while(suc)
                    {
                        manstep();
                        computerstep();
                    }
             }
        else                         //计算机先走棋
            {
                while(suc)
                    {
                        computerstep();
                        if(suc)
                            manstep();
                    }
            }
       if(n3==0&&c3==0)
           cout<<endl<<"和棋!"<<endl<<endl;
        cout<<"再来一盘(y/n)?";
        cin>>s;
        while(s!="y"&&s!="Y"&&s!="n"&&s!="N")
            {
                cout<<"错误!请输入y或n:";
                cin>>s;
            }
        }
        return 0;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 已采纳回答 5月27日
  • 创建了问题 5月26日

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了