九宫格游戏是大家熟悉的“草稿纸”游戏。记得曾经经常和同学在草稿纸上画着玩。规则很简单,就是在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;
}