




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include#include /*输出格式控制*/#include /*窗口控制(本程序用来对输出字符的颜色进行控制)*/#include /* 清屏操作. 调用system(cls); 每次输出新的棋局动态之前,刷新窗口*/#include /*为寻找较好的走法,需进行必要的数学运算*/using namespace std;class 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;jcolumns;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=.; /*初始化基元素*/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 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;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(game.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:flag=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(ch=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)if(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)cin.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) 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() 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 charnumber;int rank=1; /*rank 标志运算层级:三子一空、两子两空、一子三空、零子四空*/while(t & rank=number)int mark=0; /*较为理想的算法是,交替地查找机方和人方的关键子,这种交替由mark来控制.*/while(mark2)for(i=0;ilines;i+) /*横向查找*/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(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)set(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;mark+;/*以上为 偏己著子,即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+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/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-mark; cin.ignore(20,n)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省宁乡县2025年上半年公开招聘辅警试题含答案分析
- 湖北省房县2025年上半年公开招聘辅警试题含答案分析
- 福建省屏南县2025年上半年公开招聘辅警试题含答案分析
- 河南省博爱县2025年上半年公开招聘辅警试题含答案分析
- 江西省大余县2025年上半年公开招聘辅警试题含答案分析
- 项目多标段安全生产协议书
- 二零二五年度道路桥梁建设项目工程承包合同
- 2025版电子商务平台劳务派遣合同书
- 二零二五年度保密协议中保密期限及保密措施合同
- 2025电动车共享租赁平台合作合同样本
- 湘潭、成都工厂VDA63-2023审核员培训考核附有答案
- 铁矿石运输合同范本
- Unit 3 Fascinating Parks Discovering Useful Structures 教学设计-2024-2025学年高中英语人教版(2019)选择性必修第一册
- DL∕T 1052-2016 电力节能技术监督导则
- 《中秋礼品方案》课件
- 创客空间的管理制度
- 物流服务方案与实施方案(2篇)
- 《钢筋桁架楼承板应用技术规程》
- 竣工财务决算审计工作底稿-实质性测试占用模板
- 《国际中文教育概论》课件全套 第1-12章 从对外汉语教学到国际中文教育- 国际中文教育前瞻
- 超声引导下神经阻滞
评论
0/150
提交评论