![2010上课程设计说明书_第1页](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526271.gif)
![2010上课程设计说明书_第2页](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526272.gif)
![2010上课程设计说明书_第3页](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526273.gif)
![2010上课程设计说明书_第4页](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526274.gif)
![2010上课程设计说明书_第5页](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526275.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录TOC\o"1-5"\h\z\o"CurrentDocument"目录1\o"CurrentDocument"摘要2\o"CurrentDocument"第一章内容与要求31.1设计要求3\o"CurrentDocument"第二章设计内容4\o"CurrentDocument"2.1类的的设计要求.4\o"CurrentDocument"2.2成员函数的设计要求.4\o"CurrentDocument"第三章设计的实现63.1类图6\o"CurrentDocument"3.2实现流程图6\o"CurrentDocument"3.3主要函数的实现8Creatboard(int):8Judge(int[],int[]).9Print():10\o"CurrentDocument"第四章实现结果114.1效果图11\o"CurrentDocument"第五章结束语13\o"CurrentDocument"5.1功能上的优势13\o"CurrentDocument"5.2不足之处13\o"CurrentDocument"5.3心得体会13\o"CurrentDocument"参考文献15附录16程序源代码16摘要本程序主要功能是实现一个连连看游戏,利用了,面向对象,数组,和封装函数等相关的知识。在DEV_cpp坏境编写而成的,运行程序后直接进入主界面;主界面的信息内容清晰明了,用户可以直观的通过了解主界面的信息,进行操作。而这连连看游戏,则由玩家选择两个相同的棋子,此时两棋子同时消去,而可消去的棋子之间应该能连通,且连接时拐角不能超过两个。通过对问题的分析细化,掌握并实现对函数打包。不同的函数包包含不同的内容,并实现不同的功能。本设计共有8个函数,分别实现22*22棋盘的随机生成函数,并在随机生成时,检测生成的棋盘的合理性(即能否全部消去);输出的棋盘应当正确无误,使用特殊指令如“85858585”可以输出棋盘全消的全部步骤;当玩家找不到相应棋子时,玩家输入“95959595”,系统应该提示可消去的棋子位置;本设计的特色之一是实现函数打包,使用递归生成随机棋盘,面向对象类的封装,每个函数实现不同功能的同时,函数间又紧密衔接在一起。关键字:软件工程游戏软件连连看面向对象第一章内容与要求1.1设计要求本程序的主要目的是设计一款简单的连连看游戏,实现两颗棋子相同连通且拐角数不超过的消除功能;首先,构建一个game类,类中封装了char数组board与char数组line,board用于记录棋盘上所有棋子,line用于保存棋盘边上的坐标;Game类中主要的函数有voidCreatboard(int)、voidPrint()、voidCreatline()、boolJudge(int[],int[])、voidInitializer。、voidMiji()、voidTips()、voidPlay()本系统带有自动提示功能:当玩家找不到相应棋子时,可输入指令‘95959595’,系统调用Tips()函数,提供并打印当前所有能够消掉的棋子位置;当玩家想让系统自动消掉当前的合法棋子时,可输入指令‘85858585’,系统将调用Miji()函数,打印全消的步骤;用户自己输入的选择,Judge(int[],int[],)函数将对其进行验证,如果合法,则消掉用户所选,否则提示用户输入有误。在主函数中,携带提示用户如何进行游戏功能,通过if判断语句对用户每一次输入的选项进行判断,从而是否决定开始游戏,继续游戏,和结束游戏。本程序必须除上述函数外,还应该包含对棋盘的随机生成函数Creatboard(int),对结果的统一打印函数Print(),保证界面的优美性,提示语句应做到全面,提升游戏的实用性和玩乐性。第二章设计内容2.1类的的设计要求在game类中封装了用于保存棋盘的board[]数组,用于显示坐标的line[]数组,在game类的public中创建了标记棋盘位子是否被占用的mark[]数组,以及定义了类的主要函数voidCreatboard(int)用于构建棋盘、voidPrint()用于打印用户界面、voidCreatline()、构建边界坐标、boolJudge(int[],int[])判断两棋子是否能消去、voidInitializer()对棋盘进行初始化、voidMiji()打印全消步骤、voidTips()打印提示、voidPlay()用户游戏的接口2.2成员函数的设计要求.在进入游戏时,系统自动调用voidInitializer()将棋盘进行初始化;在Initializer中主要调用iostream头文件中的memset函数读game类中的board、mark、line等数组以及全局变量record数组、conut(计数器)进行初始化;.系统对所有数据进行初始化后,随即调用Creatboard函数进行构建棋盘和棋子,Creatboard是一个递归函数,每调用一次该函数都会随机在棋盘上找到两个没用过的空位进行填子,填子后调用Judge()函数对新填的子进行判断是否合法,若合法Creatboard()函数就会自行调用自身进行下一步填子,若遍历棋盘上所有空位都未能找到合法的位子进行填子,Creatboard()函数调用自身修改上一步填的棋子,以保证每次填的子能被消去,在填子的同时记录每一次填的一对棋子的坐标保存到record[]数组中;.Print()函数在每次棋盘改变后打印游戏界面,增加游戏的及时可见性.由于还不能自己制作图形界面,不能像Windows操作系统那样,可以用鼠标直接点击桌面图标进行游戏,所以在game类中定义了Creatline(),Creatline()函数构建棋盘边上坐标,用户在进行游戏时输入两点的坐标就可以进行游戏了;.题目中要求程序能在用户游戏过程中遇到苦难时,输入特殊指令,系统给出下一步提示,game类中的Tips函数就是实现这一功能的,在用户游戏过程中输入“95959595”,系统就会调用Tips函数自动遍历整个棋盘,当找到一对可消去的棋子时,打印出两点的坐标,而在遍历完整个棋盘后发现找不到能消去的棋子,系统将提示“没有可匹配的项目”并询问用户是否更新棋盘;.程序中还有一个给用户提示的函数,当用户输入特殊指令'85858585”时,系统将给出消去棋子的全部步骤,Miji函数就是实现这一功能的game类的成员函数;.程序中调用频率最高的应该就是Judge函数了,Judge函数的主要功能就是,检查传入的两点的坐标上的棋子是否能连通,且连接时拐角不能超过两个。当满足条件时返回true,不满足则返回false;第三章设计的实现3.1类图Game类中主要成员有board、mark、line、voidCreatboard(int)、voidPrint()、boolJudge(int[],int[])、voidInitializer。、voidMiji()、voidTips()、voidCreatline()、voidPlay()其中只有board、line数组是私有函数封装在类中,其它的是共有函数;Game-board:char[][]-line:int[]<constructor>+game()
+Judge(int[],int[]):bool
+Creatboard(int):void
+Initializer():void
+mark:bool[][]
+Print():void
+Miji():void
+Play():void
+Tips():void图3.1UML类3.2实现流程图各函数在程序运行时,首先在进入游戏时,系统自动调用voidInitializer()将棋盘进行初始化;在Initializer中主要调用iostream头文件中的memset函数读game类中的board、mark、line等数组以及全局变量record数组、conut(计数器)进行初始化;b).系统对所有数据进行初始化后,随即调用Creatboard(int)函数进行构建棋盘和棋子,Creatboard(int)是一个递归函数,每调用一次该函数都会随机在棋盘上找到两个没用过的空位进行填子,填子后调用Judge()函数对新填的子进行判断是否合法,若合法Creatboard(int)函数就会自行调用自身进行下一步填子,若遍历棋盘上所有空位都未能找到合法的位子进行填子,Creatboard()函数调用自身修改上一步填的棋子,以保证每次填的子能被消去,在填子的同时记录每一次填的一对棋子的坐标保存到record[]数组中;然后while循环调用Play()函数进行游戏,直到棋盘上的棋子全部消去后;Initializer()Creatboard(conut)[conut<=MAX][flag=0][Judge(tpoint1,tpoint2)=true,cont++;]temp1=temp2={85,85►I[M川()]temp1=temp2={95,95}[conut>MAX][Tips()][flag=1][conut>MAX][Juge(temp1,temp2)=true]/:conut<=MAX[Play()]图3.2实现流程图3・3主要函数的实现Creatboard(int):Creatboard(int)是用来随机生成棋盘的递归函数,传入的是int类型的参数;每次传入的参数是conut计数器;递归的出口是conut>=MAX,(MAX即是棋子的对数),每一次进入Creatboard函数,开始检验conut是否满足小于等于MAX,满足则进行随机在棋盘上选则一空位,并用while语句判断是否该点被棋子包围,若被包围或是已被占用,则进入while循环进行逐个偏移直到满足条件,即找到不被包围也没有被占用的点,跳出while循环(如图3.3)intt=0,tpoint1[2];inttpoint2[2];inttsum=0;//tsum记录新棋子周围棋子的个数以便判断是否被旧的棋子包围tpoint1[0]=rand()%20+1;tpoint1[1]=rand()%20+1;//随机产生一个坐标tsum+=mark[tpoint1[0]][tpoint1[1]+1]+mark[tpoint1[0]][tpoint1[1]-1];tsum+=mark[tpoint1[0]+1][tpoint1[1]]+mark[tpoint1[0]-1][tpoint1[1]];while(!(mark[tpoint1[0]][tpoint1[1]]&&tsum)){〃如果随机产生的坐标已被占用或是被其他棋子包围新的坐标将偏移tpoint1[1]++;if(tpoint1[1]>=21){tpoint1[1]=1;tpoint1[0]++;if(tpoint1[0]>=21){tpoint1[0]=1;}}tsum=0;tsum+=mark[tpoint1[0]][tpoint1[1]+1]+mark[tpoint1[0]][tpoint1[1]-1];图3.3找到一个点之后再来就是再用同样的方法找出与之对应的点,用Judge(tpoint1,tpoint2)判断两点是否是相连可消去的点,找到之后给两点赋上相同的棋子,并把两点的坐标用record数组保存起来;接着就调用Creatboard(conut++)向前递归;而当棋盘越来越密的时候,找完所有的点都不能发现有合适的两点,说明棋盘上存在盲点,一旦出现这样的情况,系统将调用Creatboard(conut--)向后回溯;(如图3.3.1.2)t++;if(t>(200*2-(conut*2+1))){//Print();〃回溯Creatboard(conut--);mark[record[conut][0]][record[conut][1]]=mark[record[conut][2]][record[conut][3]]=true;board[record[conut][0]][record[conut][1]]=board[record[conut][2]][record[conut][3]]='-';for(inti=0;i<4;i++)record[conut][i]=0;break;}〃在所有空位置上没找到合适的temp标记为2;}if(temp==0){record[conut][0]=tpoint1[0];record[conut][1]=tpoint1[1];record[conut][2]=tpoint2[0];record[conut][3]=tpoint2[1];mark[tpoint1[0]][tpoint1[1]]=mark[tpoint2[0]][tpoint2[1]]=false;conut++;Creatboard(conut);}图3.3.1.2Judge(int[],int[])在Judge()函数中主要是利用for循环进行搜索,首先判断传入的两点上是否有棋子、是否是相同的棋子来决定是否进行下一步,再开一个跟棋盘一样大小的bool类型的数组(tempboard),用memset(tempboard,false,sizeof(tempboard))初始tempboard的值;再从第一个点进行上下左右展开,即遇到空的位子就标记为true,再往两边展开,即上下方向的往左右展开,而左右方向的往上下两边展开,这样就能跟好的判断转一个弯的情况,而当遇到有棋子的位子就用break跳出for循环;(代码如图3.4)展开第一个点之后,接着就是对另一个点进行操作了,第二个点只要往上下左右四个方向进行试探就可以了,而不用再在展开后往两边展开了,如果遇到一个标记为true的点或是第一点的话,就返回true,而当在试探的时候一旦碰到有棋子的位子且不是第一点的话就break跳出这个方向,不再在这个方向进行试探;(代码如图3.5)
〃向上下方向搜索并标记for(inti=s[0]-1;i>=0;i--)//向上搜索{if(board[i][s[1]]!='-')break;tempboard[i][s[1]]=true;for(intj=s[1]+1;j<22;j++)//向右展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}for(intj=s[1]-1;j>=0;j--)//向左展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}}图3.4for(inti=e[0]-1;i>=0;i--)//向上尝试{if(!(board[i][e[1]]=='-'||(i==s[0]&&e[1]==s[1])))break;if(tempboard[i][e[0]]||(i==s[0]&&e[1]==s[1]))returntrue;}for(inti=e[0]+1;i<22;i++)//向下尝试{if(!(board[i][e[1]]=='-'||(i==s[0]&&e[1]==s[1])))break;if(tempboard[i][e[0]]||board[i][e[1]]==board[e[0]][e[1]])returntrue;}for〃向上下方向搜索并标记for(inti=s[0]-1;i>=0;i--)//向上搜索{if(board[i][s[1]]!='-')break;tempboard[i][s[1]]=true;for(intj=s[1]+1;j<22;j++)//向右展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}for(intj=s[1]-1;j>=0;j--)//向左展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}}图3.4Print()函数主要是打印出用户界面,可以让用户简单明了的看到每一次操作后的结果,因此在Print()函数中主要是用for循环打印出边界坐标和棋盘;(代码如图3.6)voidgame::Print(){cout<<endl<<"";for(inti=0;i<20;i++)cout<<line[i]<<setw(3);cout<<endl<<endl;for(inti=0;i<20;i++){cout<<line[i]<<setw(5);for(intj=0;j<20;j++)cout<<board[i+1][j+1]<<setw(3);cout<<endl;}}图3.64.1效果图第四章实现结果界面是用户与系统交互的主要场地,因此在游戏中好看实用的界面(如图4.1)是很有必要的。在游戏中友好的游戏界面也是很有必要的,在用户输入坐标时应当有提示正如图4.2所示。******欢迎来到连连看游戏体验系统****请选择:****(1)开始游戏;****(0)退出游戏;********Tips:在游戏中输入"0000"****结束游戏,输入"95959595"****查看下一步提示;****在游戏开始时输入"88888888"****可查看全消的步骤的哦!******图4.1游戏开始界面12345678910111213141516171819201—FCC—BJDJ--CFBBG—IFD2J—CCGA—JB--FIF—AAACG3JDDGGGCEc--D—BFHH—FG4CA—DAAABc--BCFFHHAAG5CBJHAFF—A--—AHGB—IEF6I—EECFBFC--C—GA—GEG—7GGBF—AFFF--—FJAC—GAG8DHBHIIIBI--H—DDEJ—JF9CJECJ—CA———DCDDGIDII10————————————————————11————————————————————12GHDHAJGHG--EGJAHJEF—13HABI—DEF———AHABEG—EA14DAI—HDEGH--CBAJHCB—G15JJ—DCBCGB--HB—CF—CGF16DCAJ—DBGc--HAGJCEC—C17—IIAAGCD———EJ—AAD—GF18DAIAG—DIA--—CHFGBJH—19BIEJHHCJ———BCACCJ—AD20AJCCHJGGJ--—CHBGJGDB剩余步数:140晴输入两点的坐标(中间用空格隔开):图4.2游戏运行界面当用户在游戏过程中遇到困难找不到下一步的步骤时,可以输入“95959595”,系统将自动提示下一步游戏中可消的坐标(如图4.3);游戏结束时,系统应当有提示用户是否重新再来一次游戏(如图4.4)12345678910111213141516171819201-FGC-BJDJ--CFBBG-IFD2J—CCGA一JB--FIF一AAACG3JDDGGGCEG--D—BFHH—FG4CA—DAAABC--BCFFHHAAG5CBJHAFF—fi--—AHGB—IEF6I—EECFBFc--C—CA—GEG—7CCBF—AFFF--—FJAC—CAG8DHBHIIIBI--H—DDEJ—JF9CJECJ—CA——-DCDDGIDII10———-——-———-———-———-—11———-——-———-———-———-—12GHDHAJGHG--EGJAHJEF—13HABI—DEF——-AHABEG—EA14DAI-HDEGH--CBAJHCB-G15JJ—DCBCCB--HB—CF—CGF16DCAJ—DBGc--HACJCEC-C17—IIAAGCD———EJ—AAD—GF18DAIAG—DIA--—GHFGBJH—19BIEJHHCJ———BCACCJ—AD20flJCCHJGGJ—-请铳入两舌的坐标(中间用空格隔开):?5959595Nextstep:12113请输入两点的坐标(中间用空格隔开):■GHBGJGDB游戏结束!是否重开一盘(1).重新开始;(0).退出游戏;图4.4游戏结束图当然在游戏时,为了增加游戏的可靠性,中间参加游戏的秘籍也能提升游戏的可玩性和娱乐性,当用户想知道消去所有棋子的全部步骤时可以输入“85858585”显示所有提示(如图4.5)当然这是有前提的,秘籍只能在游戏开始时并且尚未消子时才能查看的;睛输入两:点的坐标085858585414415412294647353686871424132312113455520720820320441941883731917201782843212019151916191419图图市■骤提20-6-—5^213117318312345678910111213141516171819201________________________________________________________________________________--------------------------------------------青按任意键继续一.图4.6消完后效果图第五章结束语5・1功能上的优势功能上优势,主要在于程序类的各个成员函数即相对独立又相互结合使用,Play()函数在运行时根据用户的选择调用了Judge()、Miji()、Tips()等函数;在Play()和Creatboard()函数中均调用了Judge()判断函数,而在Judge()函数中判断两点是否相连可消时,另外用了一个相同大小的bool数组来标记,这样就使得原来的棋盘不被改动,而且可向四个方向进行展开能够保证转一个弯相连可消的棋子被判断到;在生成棋子时使用递归与回溯,保证了棋盘在生成时能够逐个相消完;且在生成棋盘时使用record数组记录了全部消去的步骤,节省了程序再次搜索并打印提示的时间;5・2不足之处由于递归函数和随机取数的局限性,导致棋盘上的棋子的对数不能开的很大,且不能完全填满,还有在Judge()函数中语句显得重复啰嗦。5・3心得体会在编写这个程序几乎使用了我在这一个学期中所学到的基础编程中的所有知识点,同时也让我学到了一些新的东西。这个程序中,使用到了类,还有函数的定义,还有循环的使用等等。在拿到这个题目的时候,我的第一想法就是如何分步实现这一步一步的功能,同样在这样的一个过程中也有不少问题等待我去实践解决。例如在定义函数后,调用函数的时候,经常遇到因为在调用时还在实参前面加上数据类型而引起编程错误。经过多次的试验,这种错误的错误提示语句都能够看懂,遇到这种编程错误也能够直接提手去改正。在递归函数使用的时候,仍然存在的一些问题,再经过多次的试验之后,自己摸索出来自己的门道,把运算符重载牢牢掌握在心了。经常在编程的过程中还遇到一些逻辑上的错误,一些简单的还好搞定,当遇到复杂逻辑错误时,想了很久都没有想出来错误出在哪里!不过最后还是在慢慢的找寻出错误,改正过来,那种感觉最爽。还有一些基本的错误,这些都能够在提示下自己更正过来。在这次编程中,我遇到的一个问题,也是最让我映像深刻的一个问题就是在程序执行的过程中,一个循环输入的时候,整个程序编完,一直过来,自己也学到一些新的东西,比如,将递归函数吃的更加透彻了,函数的调用也更加明白规则了,循环的逻辑也是越来越清晰了。还有学到了一些,课堂上都讲得不多的知识,比如,使用while死循环判断用户的输入是否按要求,虽然时一个过时的,在现在正规编程中少用的语句,但是还是学到了东西。函数内部调用函数再传值的问题也明白了其中的规则!同时,第一次编写一个这样的一个大程序,还让我认识到了编程思想在编程实现过程中的重要性,虽然,编程的思想不会被用户买账,但是在实现你的编程的过程中确实非常的重要!这样的一个编程经历真非常值得怀念,希望下次还有这样的机会!由衷感谢欧新良老师的指导,谢谢!参考文献.邱仲潘等BruceEckel.C++编程思想(第2版)[M].北京:电子工业出版社,译.2001。.王挺、周会平等编著.C++程序设计.[M]北京:清华大学出版社,2005。.钱能著.C++程序设计教程(05版)[M]..北京:清华大学出版社,2005。附录程序源代码*\n"*\n";#include<iostream>#include<iomanip>#defineMAX140//MAX定义棋盘上棋子的对数usingnamespacestd;intrecord[200][4],conut=0;//record记录生成的坐标的次序conut记录生成棋子的对数和削掉的棋子数;classgame//构建棋盘类{*\n"*\n";private:charboard[22][22];//棋盘intline[20];//边界public:boolmark[22][22];//标记voidCreatboard(int);//构建棋盘voidPrint();//打印棋盘voidCreatline();//构建棋盘边界坐标提示boolJudge(int[],int[]);//判断函数判断两点是否可消voidInitializer。;//初始化棋盘voidMiji();//输出消去的全部步骤voidTips();//给出下一步提示voidPlay();//玩};<<"\t\t****\n"<<"\t\t**欢迎来到连连看游戏体验系统**\n"<<"\t\t**请选择:**\n"<<"\t\t**(1)开始游戏;**\n"<<"\t\t**(0)退出游戏;**\n"<<"\t\t****\n"<<"\t\t**Tips:在游戏中输入\"0000\"**\n"<<"\t\t**结束游戏,输入\"95959595\"**\n"<<"\t\t**查看下一步提示;**\n"<<"\t\t**在游戏开始时输入\"88888888\"**\n"<<"\t\t**可查看全消的步骤的哦!**\n"<<"\t\t****\n"<<"\t\t*\n"<<"\t\t<<"\t\tintflag;cin>>flag;while(flag!=0&&flag!=1)//判断玩家输入是否正确{cout<<"输入有误!请重新选择:";cin>>flag;}intmain(){cout<<"\n\n\n<<"\t\t*\n"while(flag)//游戏开始{gamea;//创建game类的对象aa.Initializer();//初始化aa.Creatline();//构建a的棋盘边界if(flag==0)return0;a.Creatboard(conut);//构建a的棋盘cout<<"Ok"<<endl;//棋盘构建完成提示OKsystem("pause");intmain(){cout<<"\n\n\n<<"\t\t*\n"while(flag)//游戏开始{gamea;//创建game类的对象aa.Initializer();//初始化aa.Creatline();//构建a的棋盘边界cout<<"游戏结束!\n是否重开一盘\n(1).重新开始;\n(0).退出游戏;";cin>>flag;while(flag!=0&&flag!=1){cout<<"输入有误!请重新选择:";cin>>flag;}if(flag==0)break;}return0;}****/voidgame::Initializer()//初始化棋盘{memset(board,'-',sizeof(board));memset(mark,true,sizeof(mark));memset(line,0,sizeof(line));memset(record,0,sizeof(record));for(inti=10;i<=11;i++)for(intj=1;j<=21;j++){mark[i][j]=mark[j][i]=false;}for(inti=0;i<22;i++){mark[i][0]=mark[0][i]=mark[i][21]=mark[21][i]=false;}conut=1;record[1][0]=record[1][1]=1;mark[1][1]=false;}*****/voidgame::Creatline()//构建边界编号{for(inti=1;i<=20;i++)line[i-1]=i;}*****/voidgame::Print(){cout<<endl<<"";for(inti=0;i<20;i++)cout<<line[i]<<setw(3);cout<<endl<<endl;for(inti=0;i<20;i++){cout<<line[i]<<setw(5);for(intj=0;j<20;j++)cout<<board[i+1][j+1]<<setw(3);cout<<endl;}}voidgame::Creatboard(intconut)//递归函数构建棋盘给出棋子{if(conut<=MAX){intt=0,tpoint1[2];inttpoint2[2];inttsum=0;//tsum记录新棋子周围棋子的个数以便判断是否被旧的棋子包围tpoint1[0]=rand()%20+1;tpoint1[1]=rand()%20+1;//随机产生一个坐标tsum+=mark[tpoint1[0]][tpoint1[1]+1]+mark[tpoint1[0]][tpoint1[1]-1];tsum+=mark[tpoint1[0]+1][tpoint1[1]]+mark[tpoint1[0]-1][tpoint1[1]];while(!(mark[tpoint1[0]][tpoint1[1]]&&tsum)){〃如果随机产生的坐标已被占用或是被其他棋子包围新的坐标将偏移tpoint1[1]++;if(tpoint1[1]>=21){tpoint1[1]=1;tpoint1[0]++;if(tpoint1[0]>=21){tpoint1[0]=1;}}tsum=0;tsum+=mark[tpoint1[0]][tpoint1[1]+1]+mark[tpoint1[0]][tpoint1[1]-1];tsum+=mark[tpoint1[0]+1][tpoint1[1]]+mark[tpoint1[0]-1][tpoint1[1]];}mark[tpoint1[0]][tpoint1[1]]=false;booltemp=true;booltempflag[22][22];//暂时标记tpoint2尝试过的位置避免重复尝试memset(tempflag,true,sizeof(tempflag));while(temp){booltemp1=true;while(temp1){tpoint2[0]=rand()%20+1;tpoint2[1]=rand()%20+1;if(mark[tpoint2[0]][tpoint2[1]]&&tempflag[tpoint2[0]][tpoint2[1]]){tempflag[tpoint2[0]][tpoint2[1]]=false;board[tpoint1[0]][tpoint1[1]]=board[tpoint2[0]][tpoint2[1]]=rand()%10+'A';//随机生成一个符号作为棋子temp1=false;}}if(Judge(tpoint1,tpoint2)){temp=0;//找到合适的位置就将temp标记为0;break;}board[tpoint1[0]][tpoint1[1]]=board[tpoint2[0]][tpoint2[1]]='-';//检验不合格改回初始状态'-'t++;if(t>(200*2-(conut*2+1))){//Print();//回溯Creatboard(conut--);mark[record[conut][0]][record[conut][1]]=mark[record[conut][2]][record[conut][3]]=true;
board[record[conut][0]][record[conut][1]]=board[record[conut][2]][record[conut][3]]='-';for(inti=0;i<4;i++)record[conut][i]=0;board[record[conut][0]][record[conut][1]]=board[record[conut][2]][record[conut][3]]='-';for(inti=0;i<4;i++)record[conut][i]=0;break;}〃在所有空位置上没找到合适的temp标记为2;}if(temp==0){record[conut][0]=tpoint1[0];record[conut][1]=tpoint1[1];record[conut][2]=tpoint2[0];record[conut][3]=tpoint2[1];mark[tpoint1[0]][tpoint1[1]]=mark[tpoint2[0]][tpoint2[1]]=false;conut++;Creatboard(conut);}}}if((s[0]==e[0]&&s[1]==e[1])||board[s[0]][s[1]]!=board[e[0]][e[1]]||board[s[0]][s[1]]=='-')returnfalse;booltempboard[22][22];memset(tempboard,false,sizeof(tempboard));〃向上下方向搜索并标记for(inti=s[0]-1;i>=0;i--)//向上搜索{if(board[i][s[1]]!='-')break;tempboard[i][s[1]]=true;for(intj=s[1]+1;j<22;j++)//向右展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}for(intj=s[1]-1;j>=0;j--)//向左展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}}for(inti=s[0]+1;i<22;i++)//向下搜索{if(board[i][s[1]]!='-')break;tempboard[i][s[1]]=true;for(intj=s[1]+1;j<22;j++)//向右展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}for(intj=s[1]-1;j>=0;j--)//向左展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}}//向左右搜索并标记for(intj=s[1]-1;j>=0;j--)//向左搜索{if(board[s[0]][j]!='-')break;tempboard[s[0]][j]=true;for(inti=s[0]-1;i>=0;i--)//向上展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}for(inti=s[0]+1;i<22;i++)//向下展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}}for(intj=s[1]+1;j<22;j++)//向右搜索{
if(board[s[0]][j]!='-')break;tempboard[s[0]][j]=true;for(inti=s[0]-1;i>=0;i--)//向上展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}for(inti=s[0]+1;i<22;i++)//向下展开{if(board[i][j]!='-')break;tempboard[i][j]=true;}}for(inti=e[0]-1;i>=0;i--)//向上尝试{if(!(board[i][e[1]]=='-'||(i==s[0]&&e[1]==s[1])))break;if(tempboard[i][e[0]]||(i==s[0]&&e[1]==s[1]))returntrue;}for(inti=e[0]+1;i<22;i++)//向下尝试{if(!(board
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代交通枢纽的铁路货运效率优化
- 深度解读如何用云计算构建高效智能制造平台
- 国庆节巡航摩旅活动方案
- 小学趣味运动会活动方案策划
- 2024年春七年级地理下册 第九章 第二节 巴西说课稿 (新版)新人教版
- 23 梅兰芳蓄须说课稿-2024-2025学年四年级上册语文统编版001
- 8 千年梦圆在今朝(说课稿)2023-2024学年部编版语文四年级下册
- 5 协商决定班级事务 说课稿-2024-2025学年道德与法治五年级上册统编版
- 2023八年级英语上册 Module 9 Population Unit 3 Language in use说课稿(新版)外研版
- 《10天然材料和人造材料》说课稿-2023-2024学年科学三年级下册青岛版
- 文档协同编辑-深度研究
- 七年级数学新北师大版(2024)下册第一章《整式的乘除》单元检测习题(含简单答案)
- 2024-2025学年云南省昆明市盘龙区高一(上)期末数学试卷(含答案)
- 五年级上册寒假作业答案(人教版)
- 2024年财政部会计法律法规答题活动题目及答案一
- 2025年中考语文复习热搜题速递之说明文阅读(2024年7月)
- 班组现场5S与目视化管理
- 和达投资集团(杭州)有限公司招聘笔试冲刺题2025
- 政企单位春节元宵猜灯谜活动谜语200个(含谜底)
- 综治工作培训课件
- 2024年云网安全应知应会考试题库
评论
0/150
提交评论