《五子棋C++代码.doc》由会员分享,可在线阅读,更多相关《五子棋C++代码.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date五子棋C+代码五子棋C+代码#include#include /*输出格式控制*/#include /*窗口控制(本程序用来对输出字符的颜色进行控制)*/#include /* 清屏操作. 调用system(cls); 每次输出新的棋局动态之前,刷新窗口*/#include /*为寻找较好的走法,需进行必要的数学运算*/using namespace std;clas
2、s Matrix /*基类Matrix,Matrix的行列数决定棋盘的大小*/protected:int lines,columns; char* ptr; /*二重指针,用来定义动态二维数组*/public:static char element; /*棋局的基元素,即空白子标识符*/Matrix(int li,int col):lines(li),columns(col)int i,j;ptr=new char*lines; for(i=0;ilines;i+)ptri=new charcolumns; /*创建动态二维数组*/for(i=0;ilines;i+)for(j=0;jcolu
3、mns;j+)ptrij=element; /*在构造函数中将棋局的基元素初始化为element*/Matrix()int i;for(i=0;ilines;i+)delete ptri;delete ptr; /*析构函数中,释放动态二维数组*/void set(int x,int y,char ch)ptrlines-yx-1=ch; /*变元控制,用于步棋*/virtual void show()int i,j; for(i=0;ilines;i+)for(j=0;jcolumns;j+)coutsetw(4)ptrij;coutendl;char Matrix:element=.; /
4、*初始化基元素*/class Game:public Matrixprivate: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
5、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(in
6、t mark); /*步棋执行函数,调用机走执行或人走执行*/friend ostream& operator(ostream& output,const Game& game) /*重载输出*/int i,j; void color(int);for(i=0;igame.lines;i+)color(13); /*设置行标(竖坐标)的颜色*/coutsetw(10)game.lines-i; /*输出行标*/for(j=0;jgame.columns;j+)if(game.ptrij=game.machine)color(10); /*双方棋子、基元素按不同颜色输出*/else if(gam
7、e.ptrij=game.man)color(12);else color(7);outputsetw(5)game.ptrij;coutendlendl;color(10); /*设置列标(横坐标)的颜色*/coutendlsetw(10) ; for(j=1;j=game.columns;j+)outputsetw(5)j; /*输出列标*/coutendlendl;color(10);cout机方:game.machine; /*机方棋子*/color(12);cout 人方:game.manendl;/*人方棋子*/color(7); return output;int Game:fl
8、ag=0;int Game:count=0;void Game:show() system(cls); /*清屏操作*/cout_-_-_-_-_-_-_-_-_-_-_-_-_endl;coutendl平行number子棋盘:endl*thisendlendl;void Game:analyse() int i,j,k;char ch=machine;start:for(i=0;ilines;i+) /*横向分析*/for(j=0;jcolumns-number+1;j+)k=0;for(int m=0;mnumber;m+)if(ptrij+m=ch)k+;if(k=number)if(c
9、h=machine)flag=-1;else flag=1;for(i=0;ilines-number+1;i+) /*纵向分析*/for(j=0;jcolumns;j+)k=0;for(int m=0;mnumber;m+)if(ptri+mj=ch)k+;if(k=number)if(ch=machine)flag=-1;else flag=1;for(i=0;ilines-number+1;i+) /*斜向分析*/for(j=0;jcolumns-number+1;j+)k=0;for(int m=0;mnumber;m+)if(ptri+mj+m=ch)k+;if(k=number)i
10、f(ch=machine)flag=-1;else flag=1;for(i=number-1;ilines;i+) /*斜向分析*/for(j=0;jcolumns-number+1;j+)k=0;for(int m=0;mnumber;m+)if(ptri-mj+m=ch)k+;if(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当前步数为countendl;start:coutx;while(cin.peek()9)ci
11、n.ignore();ciny;if(!cin)cin.clear();cin.ignore(10,n);cout-输入无效,请重新输入-endl;goto start;if(xcolumns | ylines)cout坐标输入有误,请重新输入.endl;goto start;coutendl;if(ptrlines-yx-1!=element)cout该位置已有子,请重新输入.endl;goto start;set(x,y,man); /*步棋执行*/int Game:reflect(char* const ptr,char ch1,char ch2,int rank,int number)
12、 int i,m=0,k1=0,k2=0,k3=0;int gravity=0; for(i=0;inumber;i+)if(ptri=ch1)k1+;gravity+=i;else if(ptri=ch2)k2+;else k3+;m=i;for(i=0;inumber;i+)if(ptri!=ch1 & ptri!=ch2)if(abs(i*number-gravity)abs(m*number-gravity)m=i;if(k1=number-rank & k3=rank)return m;else return number;void Game:Move_by_computer() i
13、nt 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 charnumber;int rank=1; /*rank 标志运算层级:三子一空、两子两空、一子三空、零子四空*/while(t & rank=number)int mark=0; /*较为理想的算法是,交替地查找机方和人方的关键子,这种交替由mark来控制.*/while(mark2)for(i=0;ilines;i+) /*横向
14、查找*/for(j=0;jcolumns-number+1;j+)for(int m=0;mnumber;m+)pm=ptrij+m;m=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;icolumns-number+1;i+) /*纵向查找*/for(j=0;jcolumns;j+)for(int m=0;mnumber;m+)pm=ptri+mj;m=reflect
15、(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;ilines-number+1;i+) /*斜向分析*/for(j=0;jcolumns-number+1;j+)for(int m=0;mnumber;m+)pm=ptri+mj+m;m=reflect(p,ch1,ch2,rank,number);if(!(number-m)continue;key_x=j+m+1;key_y=lines-i-m;if(t)se
16、t(key_x,key_y,machine);t=0; for(i=number-1;ilines;i+) /*斜向分析*/for(j=0;jcolumns-number+1;j+)for(int m=0;mnumber;m+)pm=ptri-mj+m;m=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;m
17、ark+;/*以上为 偏己著子,即computer方优先查找己方的关键子*/*computer方发现己方无关键子,则查找并占据对手(人方)的关键子*/rank+; /*如果经以上步骤,t仍为零,则可以断定平局*/start:coutsign;if(!cin | (sign!=0 & sign!=1)cin.clear();cin.ignore(10,n);cout-输入无效,请重新输入-endl;goto start;if(!sign)exit(1);for(i=0;ilines;i+)for(j=0;jcolumns;j+) /*随机著子*/if(ptrij=element)key_x=j+
18、i;key_y=lines-i;set(j+1,lines-i,machine);/*关键的函数终于写完了*/void Game:fruit()switch(flag)case -1: show(); coutComputer WIN ! _Youre fail!endl;exit(1);case 0 : break;case 1 : show(); coutCongratulations!_You are succeed!endl;exit(1);void Game:execute(int mark)switch(mark%2)case 0: if(mark=0)set(int(lines/
19、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) ;
20、void game_on(Game& game) /*游戏执行函数*/int mark;start:game.show();cout- 机方先走请输入0,人方先走请输入1,退出请输入6-mark; cin.ignore(20,n);if(!cin)cin.clear();cin.ignore(10,n);cout-选择无效-endl;goto start;switch(mark)case 6: exit(1);case 0: case 1: game.execute(mark); break; default:cout-选择无效-endl;goto start; while(!Game:flag) /*开局以后*/game.show();mark+;game.execute(mark);int main()Game game(12,12,5,2);/*定义一个游戏类;*/game_on(game);return 0;-