井字游戏(C++版)完美版

本文介绍了一个用C++实现的井字游戏完美版程序。该程序通过计算每一步的权值来决定最佳落子位置,确保游戏的智能性和挑战性。支持玩家选择先行或后行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//经过本人仔细推敲,编写出了井字游戏完美版,经过大量实验,应该没什么问题了。
#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<<endl<<"再来一盘(y/n)?";
   cin>>s;
   while(s!="y"&&s!="Y"&&s!="n"&&s!="N")
    {
     cout<<"错误!请输入y或n:";
     cin>>s;
    }
  }
 return 0;
}
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值