C++实现九宫格游戏人机对战

时间:2022-06-12 14:57:32

九宫格游戏是大家熟悉的“草稿纸”游戏。记得曾经经常和同学在草稿纸上画着玩。规则很简单,就是在3*3的格子里双方交替落子,先连成3个的(横竖斜都行)一方获胜。

实现人机对战我主要分成两大类,一是人先下,二是电脑先下。期间主要运用九宫格的对称性以及等价位置来画博弈树来实现决策。

大致四个决策顺序:

1.看自己是否连成两个。2.看对方是否连成两个。3.特殊情况讨论。4.已是绝对平局情况,找到第一个空的位置落子。

//main.cpp//

#include<cstring>
#include<cstdlib>

#include"gongju.h"
#include"huagezi.h"
//#include"shuchu.h"
#include"renren.h"
#include"renji.h"
#include"jiren.h"
char s[10][10];
int main()
{   
    char F='1',xuanze;
    char (*p)[10];
    p=s;
    system("color f1"); 
    
    while(F!='0')
    {///
    
xuanze='0';
    system("cls");
cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";

huagezi(p);
//s[2][2] = s[4][4] = s[2][6] = 'O';
//s[4][2] = s[6][2] = s[6][6] = 'X';
shuchu(p);

while(xuanze!='1' && xuanze!='2'){

cout<<"请选择模式(输入1表示人人对战,输入2表示人机对战):";
cin>>xuanze;
if(xuanze=='1'){//人人模式 


while(F!='0'){//hehe

huagezi(p);
system("cls");
   cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
   cout<<"                                   人----人"<<endl;
   shuchu(p);

   renren(p);
   
   while(F!='0'){//////////////
cout<<"输入0结束游戏 输入1重玩 输入2重选模式:";
   cin>>F; 
   if(F!='0' && F!='1' && F!='2') {cout<<"输入错误!\n";F='1';}
   else if(F=='1' || F=='2') break;
}/////////////////////

   if(F=='2') break;   //重选模式 
   
   
}         //hehe

}///人人if的括号 

else if(xuanze=='2')  //人机模式
{
xuanze='0';
system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
   //cout<<"                                   人----机"<<endl;
   shuchu(p);



while(xuanze!='1' && xuanze!='2'){
cout<<"输入1人先落子 输入2电脑先落子:";
cin>>xuanze;
if(xuanze == '1'){//f1
   
   while(F!='0'){//f2
   
    huagezi(p);
   system("cls");
   cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
   
   cout<<"                                   人----机"<<endl;
   shuchu(p);
   
    renji(p); 
   
    while(F!='0'){//////////////
cout<<"输入0结束游戏 输入1重玩 输入2重选模式:";
   cin>>F; 
   if(F!='0' && F!='1' && F!='2') {cout<<"输入错误!\n";F='1';}
   else if(F=='1' || F=='2') break;
}/////////////////////

   if(F=='2') break;   //重选模式 
   
   
    }//f2
   
} //人先下的if括号 f1

else if(xuanze == '2'){//电脑先下的if括号


   while(F!='0'){//f2
   
    huagezi(p);
   system("cls");
   cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
   
   cout<<"                                   人----机"<<endl;
   shuchu(p);
   
    jiren(p); 
   
    while(F!='0'){//////////////
cout<<"输入0结束游戏 输入1重玩 输入2重选模式:";
   cin>>F; 
   if(F!='0' && F!='1' && F!='2') {cout<<"输入错误!\n";F='1';}
   else if(F=='1' || F=='2') break;
}/////////////////////

   if(F=='2') break;   //重选模式 
   
   
    }//f2
   

} //电脑先下的if括号

else{
cout<<"输入错误!\n";///////


}//小 xuanze != 1 || 2

}  //人机的if的括号 

else cout<<"输入错误!\n"; 

}//大xuanze != 1 || 2

} //大while 
   
return 0;


//gongju.h//

#include<iostream>
#include<cstdlib>
using namespace std;


void print(char (*p)[10],int f)
{
if(!f)
cout<<"                                   人----人"<<endl;
else if(f==1)
cout<<"                                   人----机"<<endl;
else 
cout<<"                                   机----人"<<endl;

for(int i=1;i<=7;i++){
for(int I=0;I<15;I++)
cout<<"  ";
cout<<"     ";
for(int j=1;j<=7;j++)
cout<<(*(*(p+i)+j));
cout<<endl;
}
cout<<"\n\n\n"; 
//return 1;
}


int suiji()
{
    srand(time(NULL));
    int i;
     
    i=rand()%3;
    return i;
}


int panduan(char (*p)[10],int x,int y,int f ,char Sa[])

    int c1,c2,c3,c4;
    c1=c2=c3=c4=0;
//横方向 
if((y*2+2)<=6) {if( ( *(*( p+(x*2) )+ (y*2+2) ) ) == Sa[f]) ++c1;}
if((y*2-2)>=2) {if( ( *(*( p+(x*2) )+ (y*2-2) ) ) == Sa[f]) ++c1; if(c1>=2) return 1;}
if((y*2-4)>=2) {if( ( *(*( p+(x*2) )+ (y*2-4) ) ) == Sa[f]) ++c1; if(c1>=2) return 1;}
if((y*2+4)<=6) {if( ( *(*( p+(x*2) )+ (y*2+4) ) ) == Sa[f]) ++c1; if(c1>=2) return 1;}
//竖方向 
if((x*2+2)<=6) {if( ( *(*( p+(x*2+2) )+ (y*2) ) ) == Sa[f]) ++c2;}
if((x*2-2)>=2) {if( ( *(*( p+(x*2-2) )+ (y*2) ) ) == Sa[f]) ++c2; if(c2>=2) return 1;}
if((x*2-4)>=2) {if( ( *(*( p+(x*2-4) )+ (y*2) ) ) == Sa[f]) ++c2; if(c2>=2) return 1;}
if((x*2+4)<=6) {if( ( *(*( p+(x*2+4) )+ (y*2) ) ) == Sa[f]) ++c2; if(c2>=2) return 1;}
//右斜方向
if((x*2+2)<=6 && (y*2+2)<=6) {if( ( *(*( p+(x*2+2) )+ (y*2+2) ) ) == Sa[f]) ++c3;}
if((x*2+4)<=6 && (y*2+4)<=6) {if( ( *(*( p+(x*2+4) )+ (y*2+4) ) ) == Sa[f]) ++c3; if(c3>=2) return 1;}
if((x*2-2)>=2 && (y*2-2)>=2) {if( ( *(*( p+(x*2-2) )+ (y*2-2) ) ) == Sa[f]) ++c3; if(c3>=2) return 1;}
if((x*2-4)<=6 && (y*2-4)<=6) {if( ( *(*( p+(x*2-4) )+ (y*2-4) ) ) == Sa[f]) ++c3; if(c3>=2) return 1;}
//左斜方向
if((x*2+2)<=6 && (y*2-2)>=2) {if( ( *(*( p+(x*2+2) )+ (y*2-2) ) ) == Sa[f]) ++c4;}
if((x*2+4)<=6 && (y*2-4)>=2) {if( ( *(*( p+(x*2+4) )+ (y*2-4) ) ) == Sa[f]) ++c4; if(c4>=2) return 1;}
if((x*2-2)>=2 && (y*2+2)<=6) {if( ( *(*( p+(x*2-2) )+ (y*2+2) ) ) == Sa[f]) ++c4; if(c4>=2) return 1;}
if((x*2-4)>=2 && (y*2+4)<=6) {if( ( *(*( p+(x*2-4) )+ (y*2+4) ) ) == Sa[f]) ++c4; if(c4>=2) return 1;} 

return 0;
}




int sousuo(int (*q)[5],int *a,int biao)/////
{
int x,o,f=0,t1,t2,F=0;//F表示存在空格 
    x=o=0;
//行方向 
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++)
{
if( (*(*(q+i)+j))==2 ) ++x;
else if( (*(*(q+i)+j))==1 ) ++o;
else if( (*(*(q+i)+j))==0 ) {t1=i;t2=j;F=1;}//空格位置记录 
}

if(!biao)
{
if(x==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;break;}
else if(o==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
else{
if(o==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;break;}
else if(x==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
x=o=F=0;

}
if(f)  return 1;
//列方向
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++)
{
if( (*(*(q+j)+i))==2 ) ++x;
else if( (*(*(q+j)+i))==1 ) ++o;
else if( (*(*(q+j)+i))==0 ) {t1=j;t2=i;F=1;}
}

if(!biao)
{
if(x==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;break;}
else if(o==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
else{
if(o==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;break;}
else if(x==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
x=o=F=0;

if(f)  return 1;
//右斜方向
for(int i=1;i<=3;i++)
{
  if((*(*(q+i)+i))==2) ++x;
  else if((*(*(q+i)+i))==1) ++o;
  else if((*(*(q+i)+i))==0 ) {t1=t2=i;F=1;}
    }
  if(!biao)
{
if(x==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;}
else if(o==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
else{
if(o==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;}
else if(x==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
x=o=F=0;
if(f)  return 1;
//左斜方向
for(int i=1,j=3;i<=3,j>=1;i++,j--)
{
if( (*(*(q+i)+j))==2 ) ++x;
else if( (*(*(q+i)+j))==1 ) ++o;
else if( (*(*(q+i)+j))==0 ) {t1=i;t2=j;F=1;}
}
if(!biao)
{
if(x==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;}
else if(o==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}
else{
if(o==2 && F) {*a=1;f=1;*(a+1)=t1; *(a+2)=t2;}
else if(x==2 && F) {*a=0;*(a+1)=t1; *(a+2)=t2;}
}


//if(*a!=1)
return 1;
}


//huagezi//

#include<iostream>
#include<cstdio>
using namespace std;

void huagezi(char (*p)[10])
{
//s[0][0]=' ';
    for(int i=1;i<=7;i++){
for(int j=1;j<=7;j++){
if((i+j)%2==0) (*(*(p+i)+j)) = ' ';
else {
if(i%2==0) (*(*(p+i)+j)) = '|';
else (*(*(p+i)+j)) = '-';
}
}
}
}

void shuchu(char (*p)[10])
{
for(int i=1;i<=7;i++){
for(int I=0;I<15;I++)
cout<<"  ";
cout<<"     ";
for(int j=1;j<=7;j++)
cout<<(*(*(p+i)+j));
cout<<endl;
}
cout<<"\n\n"; 
}


//renren.h//

#include<iostream>
#include<cstdlib>

//#include"gongju.h"

using namespace std;

char S[]="OX";

void renren(char (*p)[10])
{
int x,y,t,F,pp;
t=0;F=pp=1;

while(F)
{


if((t%2) == 0){
 
while(pp)
{
        cout<<"请出O: ";
cin>>x>>y;
if( ( *(*( p+(x*2) )+ (y*2) ) ) == ' ') {( *(*( p+(x*2) )+ (y*2) ) ) = 'O';break;}
else if( ( *(*( p+(x*2) )+ (y*2) ) ) != ' ' || x>3 || x<1 || y>3 || y<1 )cout<<"操作错误!"; 

}

        system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,0);
        if(panduan(p,x,y,t%2,S)) {F=0; cout<<"\n                                    O赢了!\n\n";}
        else if(t==8) {F=0;cout<<"\n                                    平局!\n\n";}
        ++t;
}

else{
while(pp)
{
        cout<<"请出X: ";
cin>>x>>y;
if( ( *(*( p+(x*2) )+ (y*2) ) ) == ' ') {( *(*( p+(x*2) )+ (y*2) ) ) = 'X';break;}
else if( ( *(*( p+(x*2) )+ (y*2) ) ) != ' ' || x>3 || x<1 || y>3 || y<1 )cout<<"操作错误!"; 

}


        system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,0);
        if(panduan(p,x,y,t%2,S)) {F=0; cout<<"\n                                    X赢了!\n\n";}
       
        ++t;
        
}
}
cout<<endl;
//cout<<x<<y<<endl;
}

//renji.h//

#include<iostream>
#include<cstdlib>

//#include"gongju.h"
#include"rjone.h"
#include"rjtwo.h"
#include"rjthree.h"
 
using namespace std;

char Sa[]="OX";

void renji(char (*p)[10])
{
int A[5][5]={0};
int pp=1,ca; 
int x,y,t=0,F=1;

//int t1,t2,t3;

while(F)
{////


if((t%2) == 0){//人落子 
 
while(pp)


        cout<<"请出O: ";
cin>>x>>y;
if( ( *(*( p+(x*2) )+ (y*2) ) ) == ' ') 
{ ( *(*( p+(x*2) )+ (y*2) ) ) = 'O';   A[x][y]=1;    break; }/// 

else if( ( *(*( p+(x*2) )+ (y*2) ) ) != ' ' || x>3 || x<1 || y>3 || y<1 ) cout<<"操作错误!"; 
}//while(pp)的括号 


system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,1);///////
        if(panduan (p,x,y,t%2,Sa) ){F=0; cout<<"\n                                    你赢了!\n\n";}
        else if(t==8) {F=0;cout<<"\n                                    平局!\n\n";}
        ++t;   //t用来记录这是第几次落子 

        if(t==1){ //分类 
        if(A[2][2]==1) ca=1;///
        else if(A[1][1] || A[1][3] || A[3][1] || A[3][3]) ca=2;
        else ca=3;
        }
 
}//大if的括号 

else{//大else 

if(ca==1)//第一步走中间
{
F=rjone(p,t,A);++t;
} //if(ca==1)

else if(ca==2)//第一步走四个角 
{
F=rjtwo(p,t,A);++t;


else if(ca==3)//第一步走四边
{
F=rjthree(p,t,A);++t;


}//大else 

}////  while(F)的括号 

}

//rjone.h//

#include<iostream>
//#include"gongju.h"
using namespace std;

int rjone(char (*p)[10],int t,int (*A)[5] )
{
int pp;
int sheng=0;


if(t==1) { ( *(*(p+2)+2) ) ='X';A[1][1]=2;  }//第一步走对角

else {//else

if(t==3 && A[3][3]==1)//特殊情况 
{

( *(*( p+2 )+ 6 ) ) = 'X';   A[1][3]=2;  

} //特殊情况

else{//f1
int B[5],f=0;
B[0]=2;
pp=sousuo(A,B,0);////
//t1=A[0];t2=A[1];t3=A[2];
if(B[0] == 1) { sheng=1; ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'X';  }
else if(B[0] == 0) { ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'X';   A[B[1]][B[2]]=2;}

else if(B[0] == 2) {//f2
for(int i=1; i<=3; i++)
{//for1
for(int j=1; j<=3 ;j++)
{

if(A[i][j]==0) 
{ ( *(*( p+2*(i) ) + 2*(j) )) = 'X';   A[i][j]=2;f=1; break; }

}
if(f) break;
}//for1
}//f2 第三种情况 

} //f1


} //else 非第一步 

system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,1);
if(sheng) {cout<<"\n\n                                  电脑赢了!\n\n";return 0;}
else return 1;
}


//rjtwo.h//

#include<iostream>
using namespace std;

int rjtwo(char (*p)[10],int t,int (*A)[5] )
{
int pp,count1=0;
int sheng=0;
int u=0;

int B[5],f=0,C[7];
B[0]=2;
pp=sousuo(A,B,0);////
//t1=A[0];t2=A[1];t3=A[2];
if(t==1)  { ( *(*( p+4 ) + 4 )) = 'X'; A[2][2]=2; }
else if(B[0] == 1) { sheng=1; ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'X';  }
else if(B[0] == 0) { ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'X';   A[B[1]][B[2]]=2;}

else if(B[0]==2){

if(t==3){
if(A[1][1] == 1) ++count1;
if(A[1][3] == 1) ++count1;
if(A[3][1] == 1) ++count1;
if(A[3][3] == 1) ++count1;

if(count1 == 2){
( *(*( p+4 ) + 2 )) = 'X'; A[2][1]=2;
}//count1 == 2

else{
for(int i=1; i<=3; i++)
                {//for1
   for(int j=1; j<=3 ;j++)
   {
    if(A[i][j] == 1) {C[u++]=i;C[u++]=j;}
   }
    if(u==4) break;
                }
                
                if( (C[0]==1&&C[3]==1) || (C[0]==1&&C[3]==3) || (C[0]==3&&C[3]==1) || (C[0]==3&&C[3]==3) )
                { ( *(*( p+(2*C[0]) ) + 2*C[3] )) = 'X'; A[C[0]][C[3]]=2; }
                
                else
                { ( *(*( p+(2*C[2]) ) + 2*C[1] )) = 'X'; A[C[2]][C[1]]=2; }
                
}// else count1 != 2

}//t==3

else{
for(int i=1; i<=3; i++)
{//for1
for(int j=1; j<=3 ;j++)
{

if(A[i][j]==0) 
{ ( *(*( p+2*(i) ) + 2*(j) )) = 'X';   A[i][j]=2;f=1; break; }

}
if(f) break;
}//for1
}//小else 

}//B[0]==2

system("cls");
    cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
    print(p,1);
if(sheng) {cout<<"\n\n                                  电脑赢了!\n\n";return 0;}
else return 1;
}


//rjthree.h//

#include<iostream>
using namespace std;

int rjthree(char (*p)[10],int t,int (*A)[5] )
{

int B[5],f=0,C[7];
int vount=0,u=0;
int pp,sheng=0;
B[0]=2;
pp=sousuo(A,B,0);////
//t1=A[0];t2=A[1];t3=A[2];
if(t==1)  { ( *(*( p+4 ) + 4 )) = 'X'; A[2][2]=2; }
else if(B[0] == 1) { sheng=1; ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'X';  }
else if(B[0] == 0) { ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'X';   A[B[1]][B[2]]=2;}

else if(B[0]==2)
{
if(t!=3 || (A[1][2]==1 && A[3][2]==1) || (A[2][1]==1 && A[2][3]==1))
for(int i=1; i<=3; i++)
{//for1
for(int j=1; j<=3 ;j++)
{

if(A[i][j]==0) 
{ ( *(*( p+2*(i) ) + 2*(j) )) = 'X';   A[i][j]=2;f=1; break; }

}
if(f) break;
}//for1

else if(t==3)
{

for(int i=1; i<=3; i++)
                {//for1
   for(int j=1; j<=3 ;j++)
   {
    if(A[i][j] == 1) {C[u++]=i;C[u++]=j;}
   }
    if(u==4) break;
                }//for1
                
                if( (C[0]==1&&C[3]==1) || (C[0]==1&&C[3]==3) || (C[0]==3&&C[3]==1) || (C[0]==3&&C[3]==3) )
                { ( *(*( p+(2*C[0]) ) + 2*C[3] )) = 'X'; A[C[0]][C[3]]=2; }
                
                else
                { ( *(*( p+(2*C[2]) ) + 2*C[1] )) = 'X'; A[C[2]][C[1]]=2; }
                

}//t==3

}//B[0]==2
system("cls");
    cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
    print(p,1);
if(sheng) {cout<<"\n\n                                  电脑赢了!\n\n";return 0;}
else return 1;
}


//jiren.h//

#include <iostream>
#include <time.h>
#include"jrone.h"
#include"jrtwo.h"
#include"jrthree.h"
 
using namespace std;

char SA[]="OX";

void jiren(char (*p)[10])
{
int f,sjs,t=0;
int A[5][5]={0};
int F=1,pp;
int x,y;
sjs=suiji();///
//sjs=2;///////////
if(!sjs){
++t; ( *(*( p+4 )+ 4 ) ) = 'O';   A[2][2]=1;  //第一步下中间 
system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,2);
        
        
while(F)
{

if((t%2) == 0) 
{ F=jrone(p,t,A); ++t; if(t==9 && F) {F=0;cout<<"\n                                    平局!\n\n";break;} }///

else////
{
while(pp)


        cout<<"请出X: ";
cin>>x>>y;
if( ( *(*( p+(x*2) )+ (y*2) ) ) == ' ') 
{ ( *(*( p+(x*2) )+ (y*2) ) ) = 'X';   A[x][y]=2;    break; }/// 

else if( ( *(*( p+(x*2) )+ (y*2) ) ) != ' ' || x>3 || x<1 || y>3 || y<1 ) cout<<"操作错误!"; 
}//while(pp)的括号 


system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,2);
        if(panduan(p,x,y,t%2,SA)) {F=0; cout<<"\n                                    你赢了!\n\n";}
       // else 
        ++t;   //t用来记录这是第几次落子 


}//大else


}//while(F)

}//第一步下中间 


else if(sjs == 1){

++t; ( *(*( p+2 )+ 2 ) ) = 'O';   A[1][1]=1;  //第一步下角落
system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,2);

while(F)
{

if((t%2) == 0) 
{ F=jrtwo(p,t,A); ++t; if(t==9 && F) {F=0;cout<<"\n                                    平局!\n\n";break;} }///

else////
{
while(pp)


        cout<<"请出X: ";
cin>>x>>y;
if( ( *(*( p+(x*2) )+ (y*2) ) ) == ' ') 
{ ( *(*( p+(x*2) )+ (y*2) ) ) = 'X';   A[x][y]=2;    break; }/// 

else if( ( *(*( p+(x*2) )+ (y*2) ) ) != ' ' || x>3 || x<1 || y>3 || y<1 ) cout<<"操作错误!"; 
}//while(pp)的括号 


system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,2);
        if(panduan(p,x,y,t%2,SA)) {F=0; cout<<"\n                                    你赢了!\n\n";}
       // else 
        ++t;   //t用来记录这是第几次落子 


}//大else

}//while(F)

}//第一步下角落


else if(sjs == 2){

++t; ( *(*( p+2 )+ 4 ) ) = 'O';   A[1][2]=1;  //第一步下边上 
system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,2);

while(F)
{

if((t%2) == 0) 
{ F=jrthree(p,t,A); ++t; if(t==9 && F) {F=0;cout<<"\n                                    平局!\n\n";break;} }///

else////
{
while(pp)


        cout<<"请出X: ";
cin>>x>>y;
if( ( *(*( p+(x*2) )+ (y*2) ) ) == ' ') 
{ ( *(*( p+(x*2) )+ (y*2) ) ) = 'X';   A[x][y]=2;    break; }/// 

else if( ( *(*( p+(x*2) )+ (y*2) ) ) != ' ' || x>3 || x<1 || y>3 || y<1 ) cout<<"操作错误!"; 
}//while(pp)的括号 

system("cls");
        cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
        print(p,2);
        if(panduan(p,x,y,t%2,SA)) {F=0; cout<<"\n                                    你赢了!\n\n";}
       // else 
        ++t;   //t用来记录这是第几次落子 


}//大else

}//while(F)

}//第一步下边上

}


//jrone.h//

#include<iostream>
using namespace std;

int jrone(char (*p)[10],int t,int (*A)[5] )
{
int B[5],f=0;
int sheng=0,pp;
B[0]=2;
pp=sousuo(A,B,1);////
//t1=A[0];t2=A[1];t3=A[2];
if(B[0] == 1) { sheng=1; ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'O';  }
else if(B[0] == 0) { ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'O';   A[B[1]][B[2]]=1;}

else if(B[0] == 2){

if(t==2){

if(A[1][1] == 2 ){
A[3][3] = 1; ( *(*( p+6 ) + 6 )) = 'O'; 

}//走了对角 

else if(A[1][3] == 2 ){
A[3][1] = 1; ( *(*( p+6 ) + 2 )) = 'O'; 
}
else if(A[3][1] == 2 ){
A[1][3] = 1; ( *(*( p+2 ) + 6 )) = 'O'; 
}
else if( A[3][3] == 2){
A[1][1] = 1; ( *(*( p+2 ) + 2 )) = 'O'; 
}

else {
A[1][1]=1; ( *(*( p+2 ) + 2 )) = 'O'; 
} //未走对角 

}//if(t==2)

else if(t==4 )
{

if(A[1][1] == 1){
if(A[2][1] == 0) {  A[3][1] = 1; ( *(*( p+6) + 2 )) = 'O'; }
else if (A[1][2] == 0) { A[1][3] = 1; ( *(*( p+2) + 6 )) = 'O'; } 
}

else if(A[1][3] == 1){
if(A[2][3] == 0) {  A[3][3] = 1;( *(*( p+6) + 6 )) = 'O'; }
else if(A[1][2] == 0) {  A[1][1] = 1;( *(*( p+2) + 2 )) = 'O'; }
}

else if(A[3][1] == 1){
if(A[2][1] == 0) {  A[1][1] = 1;( *(*( p+2) + 2 )) = 'O'; }
else if(A[3][2] == 0) {  A[3][3] = 1;( *(*( p+6) + 6 )) = 'O'; }
}

else if(A[3][3] == 1){
if(A[2][3] == 0) {  A[1][3] = 1;( *(*( p+2) + 6 )) = 'O'; }
else if(A[3][2] == 0) {  A[3][1] = 1;( *(*( p+6) + 2 )) = 'O'; }
}

}//else if(t==4 && f1==2)

else{
    for(int i=1; i<=3; i++)
{//for1
for(int j=1; j<=3 ;j++)
{

if(A[i][j]==0) 
{ ( *(*( p+2*(i) ) + 2*(j) )) = 'O';   A[i][j]=1;f=1; break; }

}
if(f) break;
}//for1
} //else
   
}//else if(B[0] == 2)

system("cls");
    cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
    print(p,2);
if(sheng) {cout<<"\n\n                                  电脑赢了!\n\n";return 0;}
else return 1;



//jrtwo.h//

#include<iostream>
using namespace std;

int jrtwo(char (*p)[10],int t,int (*A)[5] )
{
int B[5],f=0;
int sheng=0,pp;
B[0]=2;
pp=sousuo(A,B,1);////
//t1=A[0];t2=A[1];t3=A[2];
if(B[0] == 1) { sheng=1; ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'O';  }
else if(B[0] == 0) { ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'O';   A[B[1]][B[2]]=1;}

else if(B[0] == 2){

if(t==2){
if(A[2][2] == 0) { ( *(*( p+4 ) + 4 )) ='O'; A[2][2] = 1; }
else { ( *(*( p+6 ) + 6 )) ='O'; A[3][3] = 1; }
}//t==2 抢中心 

else if(t==4){
if(A[1][2] == 0) { A[1][3]=1; ( *(*( p+2 ) + 6 )) ='O'; }
else if(A[2][1] == 0) { A[3][1]=1; ( *(*( p+6 ) + 2 )) ='O'; }
}

else{

for(int i=1; i<=3; i++)
{//for1
for(int j=1; j<=3 ;j++)
{

if(A[i][j]==0) 
{ ( *(*( p+2*(i) ) + 2*(j) )) = 'O';   A[i][j]=1;f=1; break; }

}
if(f) break;
}//for1

}//第一个空 

}//B[0] == 2

system("cls");
    cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
    print(p,2);
if(sheng) {cout<<"\n\n                                  电脑赢了!\n\n";return 0;}
else return 1;

}


//jrthree.h//

#include<iostream>
using namespace std;

int jrthree(char (*p)[10],int t,int (*A)[5] )
{
    int B[5],f=0;
int sheng=0,pp;
int C[7],u=0;
B[0]=2;
pp=sousuo(A,B,1);////
//t1=A[0];t2=A[1];t3=A[2];
if(B[0] == 1) { sheng=1; ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'O';  }
else if(B[0] == 0) { ( *(*( p+(2*B[1]) ) + 2*B[2] )) = 'O';   A[B[1]][B[2]]=1;}

else if(B[0] == 2){
if(t==2){
if(A[2][2] == 0) { ( *(*( p+4 ) + 4 )) ='O'; A[2][2] = 1; }
else { ( *(*( p+2 ) + 2 )) ='O'; A[1][1] = 1; }
}//t==2 抢中心 

else if(t==4){

for(int i=1; i<=3; i++)
                {//for1
   for(int j=1; j<=3 ;j++)
   {
    if(A[i][j] == 2) {C[u++]=i;C[u++]=j;}
   }
    if(u==4) break;
                }//for1
                
                if( (C[0]==1&&C[3]==1) || (C[0]==1&&C[3]==3) || (C[0]==3&&C[3]==1) || (C[0]==3&&C[3]==3) )
                { ( *(*( p+(2*C[0]) ) + 2*C[3] )) = 'O'; A[C[0]][C[3]]=1; }
                
                else
                { ( *(*( p+(2*C[2]) ) + 2*C[1] )) = 'O'; A[C[2]][C[1]]=1; }

}//t==4

else{

for(int i=1; i<=3; i++)
{//for1
for(int j=1; j<=3 ;j++)
{

if(A[i][j]==0) 
{ ( *(*( p+2*(i) ) + 2*(j) )) = 'O';   A[i][j]=1;f=1; break; }

}
if(f) break;
}//for1

}//第一个空 

}//B[0] == 2

system("cls");
    cout<<"*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*九 宫 格*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n\n\n";
        
    print(p,2);
if(sheng) {cout<<"\n\n                                  电脑赢了!\n\n";return 0;}
else return 1;
}

C++实现九宫格游戏人机对战C++实现九宫格游戏人机对战C++实现九宫格游戏人机对战C++实现九宫格游戏人机对战