};char Matrix::element='.'; /*初始化基元素*/
class Game:public Matrix
{private:
char machine,man; /*机方和人方的棋子形标识符*/
int number; /*代表连珠数(可以是四子连珠、五子连珠,等等)*/
public:
Game(int line=7,int column=7,int num=4,char a=6,char b=2):Matrix(line,column),machine(a),man(b),number(num){}
static int flag; /*胜负表征量flag,取值0、1、-1;0值为胜负未分,1值为人方胜,-1值为机方胜*/
static int count; /*统计步数*/
void show(); /*布局输出*/
void analyse(); /*胜负性分析. 每走一步之后调用此函数,分析是否有一方获胜;人方获胜则赋flag=1,机方获胜赋flag=-1*/
void Move_by_man(); /*人走执行*/
/*下面两函数是机方分析并决定走法的关键函数*/
int reflect(char* const ptr,char ch1,char ch2,int rank,int number);
void Move_by_computer(); /*机走执行*/
void fruit(); /*胜负性执行*/
void execute(int mark); /*步棋执行函数,调用机走执行或人走执行*/
friend ostream& operator<<(ostream& output,const Game& game) /*重载输出*/
{int i,j;
void color(int);
for(i=0;i{color(13); /*设置行标(竖坐标)的颜色*/cout<for(j=0;j{if(game.ptr[i][j]==game.machine)color(10); /*双方棋子、基元素按不同颜色输出*/else if(game.ptr[i][j]==game.man)color(12);
else color(7);
output<}cout<}color(10); /*设置列标(横坐标)的颜色*/
cout<for(j=1;j<=game.columns;j++)output<cout<color(10);cout<<\"机方:\"<color(12);cout<<\" 人方:\"<color(7);return output;
}
};
int Game::flag=0;
int Game::count=0;
void Game::show()
{system(\"cls\"); /*清屏操作*/
cout<<\"~^_^~~~
~_~-~_~-~_~-~_~-~_~-~_~-~_~-~_~-~_~-~_~-~_~-~_~-~~~~^_^~\"<cout<}void Game::analyse()
{int i,j,k;
char ch=machine;
start:
for(i=0;ifor(j=0;j{k=0;for(int m=0;mif(k==number){if(ch==machine)flag=-1;else flag=1;}}
for(i=0;ifor(j=0;j{k=0;for(int m=0;mif(k==number){if(ch==machine)flag=-1;else flag=1;}}
for(i=0;ifor(j=0;j{k=0;for(int m=0;mif(k==number){if(ch==machine)flag=-1;else flag=1;}}
for(i=number-1;ifor(j=0;j{k=0;for(int m=0;mif(k==number){if(ch==machine)flag=-1;else flag=1;}}
if(ch!=man){ch=man; goto start;}
}
void Game::Move_by_man()
{int x,y;
cout<<\"当前步数为\"<start:cout<<\"请输入您的落子点(横纵坐标): \" ;
cin>>x;while(cin.peek()<'0'||cin.peek()>'9')cin.ignore();cin>>y;
if(!cin)
{cin.clear();
cin.ignore(10,'\\n');
cout<<\"-----------输入无效,请重新输入---------\"<goto start;}
if(x<1 || x>columns || y<1 ||y>lines){cout<<\"坐标输入有误,请重新输入.\"<cout<if(ptr[lines-y][x-1]!=element){cout<<\"该位置已有子,请重新输入.\"<set(x,y,man); /*步棋执行*/}
int Game::reflect(char* const ptr,char ch1,char ch2,int rank,int number)
{int i,m=0,k1=0,k2=0,k3=0;
int gravity=0;
for(i=0;i{if(ptr[i]==ch1){k1++;gravity+=i;}else if(ptr[i]==ch2)k2++;
else {k3++;m=i;}
}
for(i=0;i{if(ptr[i]!=ch1 && ptr[i]!=ch2)if(abs(i*number-gravity)}if(k1==number-rank && k3==rank)return m;
else return number;
}
void Game::Move_by_computer()
{int i,j,key_x,key_y,t=1; /* t 非零时表示未着子,k1,k2,k3分别记录ch1,ch2,ch3的个数;*/
char ch1,ch2,ch3;
ch1=machine;
ch2=man;
ch3=element;
char* p; p=new char[number];
int rank=1; /*rank 标志运算层级:三子一空、两子两空、一子三空、零子四空……*/
while(t && rank<=number)
{int mark=0; /*较为理想的算法是,交替地查找机方和人方的关键子,这种交替由mark来控制.*/
while(mark<2)
{for(i=0;ifor(j=0;j{for(int m=0;mm=reflect(p,ch1,ch2,rank,number);if(!(number-m))continue;key_x=j+m+1;key_y=lines-i;
if(t){set(key_x,key_y,machine);t=0;} /*t为零时,表示已著子 */
}
for(i=0;ifor(j=0;j{for(int m=0;mm=reflect(p,ch1,ch2,rank,number);if(!(number-m))continue;key_x=j+1;key_y=lines-i-m;
if(t){set(key_x,key_y,machine);t=0;}
}
for(i=0;ifor(j=0;j{for(int m=0;mm=reflect(p,ch1,ch2,rank,number);if(!(number-m))continue;key_x=j+m+1;key_y=lines-i-m;
if(t){set(key_x,key_y,machine);t=0;}
}
for(i=number-1;ifor(j=0;j{for(int m=0;mm=reflect(p,ch1,ch2,rank,number);if(!(number-m))continue;key_x=j+m+1;key_y=lines-i+m;
if(t){set(key_x,key_y,machine);t=0;}
}
if(t){char temp;temp=ch1;ch1=ch2;ch2=temp;}
else break;
mark++;
}
/*以上为 偏己著子,即computer方优先查找己方的关键子*/
/*computer方发现己方无关键子,则查找并占据对手(人方)的关键子*/
rank++;
}
/*如果经以上步骤,t仍为零,则可以断定平局*/
start:
cout<<\"~_~已经达到平局,无法分出胜负了;您还要继续吗?要继续请输入1,结束输入0 ; ~_~ \";
if(t)
{int sign; cin>>sign;
if(!cin || (sign!=0 && sign!=1))
{cin.clear();
cin.ignore(10,'\\n');
cout<<\"-----------输入无效,请重新输入---------\"<goto start;}
if(!sign)exit(1);
for(i=0;ifor(j=0;jif(ptr[i][j]=element){key_x=j+i;key_y=lines-i;}set(j+1,lines-i,machine);
}
}
/*××××××××××关键的函数终于写完了×××××××××*/
void Game::fruit()
{switch(flag)
{case -1: show(); cout<<\"~~~Computer WIN !! ~~_~~You're fail!~~~\"<case 0 : break;case 1 : show(); cout<<\"~~~Congratulations!~~_~~You are succeed!!~~~\"<}}
void Game::execute(int mark)
{switch(mark%2)
{case 0: if(mark==0)set(int(lines/2+1),int(columns/2+1),machine);
else Move_by_computer();break;
case 1: Move_by_man(); break;
}
count++;
analyse();/*分析查找五子连珠之后赋给flag一个值;*/
fruit(); /*判断胜负情况.*/
}
void color(int a) /*设置显示颜色.10亮绿色/;*11亮青色;12亮红色;13亮粉色;14亮黄色*/
{HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,a) ;
}
void game_on(Game& game) /*游戏执行函数*/
{int mark;
start:
game.show();
cout<<\"----- 机方先走请输入0,人方先走请输入1,退出请输入6-----\"<cin>>mark; cin.ignore(20,'\\n');if(!cin)
{cin.clear();
cin.ignore(10,'\\n');
cout<<\"-----------选择无效---------\"<goto start;}
switch(mark)
{case 6: exit(1);
case 0:
case 1: game.execute(mark); break;
default:cout<<\"-----------选择无效---------\"<goto start;}
while(!Game::flag) /*开局以后*/
{game.show();
mark++;
game.execute(mark);
}
}
int main()
{Game game(12,12,5,'@',2);/*定义一个游戏类;*/
game_on(game);
return 0;
}