![2010上課程設(shè)計說明書_第1頁](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526271.gif)
![2010上課程設(shè)計說明書_第2頁](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526272.gif)
![2010上課程設(shè)計說明書_第3頁](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526273.gif)
![2010上課程設(shè)計說明書_第4頁](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526274.gif)
![2010上課程設(shè)計說明書_第5頁](http://file4.renrendoc.com/view/baabf0c41d37e0cfa5585f315b352627/baabf0c41d37e0cfa5585f315b3526275.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
目錄TOC\o"1-5"\h\z\o"CurrentDocument"目錄1\o"CurrentDocument"摘要2\o"CurrentDocument"第一章內(nèi)容與要求31.1設(shè)計要求3\o"CurrentDocument"第二章設(shè)計內(nèi)容4\o"CurrentDocument"2.1類的的設(shè)計要求.4\o"CurrentDocument"2.2成員函數(shù)的設(shè)計要求.4\o"CurrentDocument"第三章設(shè)計的實現(xiàn)63.1類圖6\o"CurrentDocument"3.2實現(xiàn)流程圖6\o"CurrentDocument"3.3主要函數(shù)的實現(xiàn)8Creatboard(int):8Judge(int[],int[]).9Print():10\o"CurrentDocument"第四章實現(xiàn)結(jié)果114.1效果圖11\o"CurrentDocument"第五章結(jié)束語13\o"CurrentDocument"5.1功能上的優(yōu)勢13\o"CurrentDocument"5.2不足之處13\o"CurrentDocument"5.3心得體會13\o"CurrentDocument"參考文獻15附錄16程序源代碼16摘要本程序主要功能是實現(xiàn)一個連連看游戲,利用了,面向?qū)ο?,?shù)組,和封裝函數(shù)等相關(guān)的知識。在DEV_cpp壞境編寫而成的,運行程序后直接進入主界面;主界面的信息內(nèi)容清晰明了,用戶可以直觀的通過了解主界面的信息,進行操作。而這連連看游戲,則由玩家選擇兩個相同的棋子,此時兩棋子同時消去,而可消去的棋子之間應(yīng)該能連通,且連接時拐角不能超過兩個。通過對問題的分析細(xì)化,掌握并實現(xiàn)對函數(shù)打包。不同的函數(shù)包包含不同的內(nèi)容,并實現(xiàn)不同的功能。本設(shè)計共有8個函數(shù),分別實現(xiàn)22*22棋盤的隨機生成函數(shù),并在隨機生成時,檢測生成的棋盤的合理性(即能否全部消去);輸出的棋盤應(yīng)當(dāng)正確無誤,使用特殊指令如“85858585”可以輸出棋盤全消的全部步驟;當(dāng)玩家找不到相應(yīng)棋子時,玩家輸入“95959595”,系統(tǒng)應(yīng)該提示可消去的棋子位置;本設(shè)計的特色之一是實現(xiàn)函數(shù)打包,使用遞歸生成隨機棋盤,面向?qū)ο箢惖姆庋b,每個函數(shù)實現(xiàn)不同功能的同時,函數(shù)間又緊密銜接在一起。關(guān)鍵字:軟件工程游戲軟件連連看面向?qū)ο蟮谝徽聝?nèi)容與要求1.1設(shè)計要求本程序的主要目的是設(shè)計一款簡單的連連看游戲,實現(xiàn)兩顆棋子相同連通且拐角數(shù)不超過的消除功能;首先,構(gòu)建一個game類,類中封裝了char數(shù)組board與char數(shù)組line,board用于記錄棋盤上所有棋子,line用于保存棋盤邊上的坐標(biāo);Game類中主要的函數(shù)有voidCreatboard(int)、voidPrint()、voidCreatline()、boolJudge(int[],int[])、voidInitializer。、voidMiji()、voidTips()、voidPlay()本系統(tǒng)帶有自動提示功能:當(dāng)玩家找不到相應(yīng)棋子時,可輸入指令‘95959595’,系統(tǒng)調(diào)用Tips()函數(shù),提供并打印當(dāng)前所有能夠消掉的棋子位置;當(dāng)玩家想讓系統(tǒng)自動消掉當(dāng)前的合法棋子時,可輸入指令‘85858585’,系統(tǒng)將調(diào)用Miji()函數(shù),打印全消的步驟;用戶自己輸入的選擇,Judge(int[],int[],)函數(shù)將對其進行驗證,如果合法,則消掉用戶所選,否則提示用戶輸入有誤。在主函數(shù)中,攜帶提示用戶如何進行游戲功能,通過if判斷語句對用戶每一次輸入的選項進行判斷,從而是否決定開始游戲,繼續(xù)游戲,和結(jié)束游戲。本程序必須除上述函數(shù)外,還應(yīng)該包含對棋盤的隨機生成函數(shù)Creatboard(int),對結(jié)果的統(tǒng)一打印函數(shù)Print(),保證界面的優(yōu)美性,提示語句應(yīng)做到全面,提升游戲的實用性和玩樂性。第二章設(shè)計內(nèi)容2.1類的的設(shè)計要求在game類中封裝了用于保存棋盤的board[]數(shù)組,用于顯示坐標(biāo)的line[]數(shù)組,在game類的public中創(chuàng)建了標(biāo)記棋盤位子是否被占用的mark[]數(shù)組,以及定義了類的主要函數(shù)voidCreatboard(int)用于構(gòu)建棋盤、voidPrint()用于打印用戶界面、voidCreatline()、構(gòu)建邊界坐標(biāo)、boolJudge(int[],int[])判斷兩棋子是否能消去、voidInitializer()對棋盤進行初始化、voidMiji()打印全消步驟、voidTips()打印提示、voidPlay()用戶游戲的接口2.2成員函數(shù)的設(shè)計要求.在進入游戲時,系統(tǒng)自動調(diào)用voidInitializer()將棋盤進行初始化;在Initializer中主要調(diào)用iostream頭文件中的memset函數(shù)讀game類中的board、mark、line等數(shù)組以及全局變量record數(shù)組、conut(計數(shù)器)進行初始化;.系統(tǒng)對所有數(shù)據(jù)進行初始化后,隨即調(diào)用Creatboard函數(shù)進行構(gòu)建棋盤和棋子,Creatboard是一個遞歸函數(shù),每調(diào)用一次該函數(shù)都會隨機在棋盤上找到兩個沒用過的空位進行填子,填子后調(diào)用Judge()函數(shù)對新填的子進行判斷是否合法,若合法Creatboard()函數(shù)就會自行調(diào)用自身進行下一步填子,若遍歷棋盤上所有空位都未能找到合法的位子進行填子,Creatboard()函數(shù)調(diào)用自身修改上一步填的棋子,以保證每次填的子能被消去,在填子的同時記錄每一次填的一對棋子的坐標(biāo)保存到record[]數(shù)組中;.Print()函數(shù)在每次棋盤改變后打印游戲界面,增加游戲的及時可見性.由于還不能自己制作圖形界面,不能像Windows操作系統(tǒng)那樣,可以用鼠標(biāo)直接點擊桌面圖標(biāo)進行游戲,所以在game類中定義了Creatline(),Creatline()函數(shù)構(gòu)建棋盤邊上坐標(biāo),用戶在進行游戲時輸入兩點的坐標(biāo)就可以進行游戲了;.題目中要求程序能在用戶游戲過程中遇到苦難時,輸入特殊指令,系統(tǒng)給出下一步提示,game類中的Tips函數(shù)就是實現(xiàn)這一功能的,在用戶游戲過程中輸入“95959595”,系統(tǒng)就會調(diào)用Tips函數(shù)自動遍歷整個棋盤,當(dāng)找到一對可消去的棋子時,打印出兩點的坐標(biāo),而在遍歷完整個棋盤后發(fā)現(xiàn)找不到能消去的棋子,系統(tǒng)將提示“沒有可匹配的項目”并詢問用戶是否更新棋盤;.程序中還有一個給用戶提示的函數(shù),當(dāng)用戶輸入特殊指令'85858585”時,系統(tǒng)將給出消去棋子的全部步驟,Miji函數(shù)就是實現(xiàn)這一功能的game類的成員函數(shù);.程序中調(diào)用頻率最高的應(yīng)該就是Judge函數(shù)了,Judge函數(shù)的主要功能就是,檢查傳入的兩點的坐標(biāo)上的棋子是否能連通,且連接時拐角不能超過兩個。當(dāng)滿足條件時返回true,不滿足則返回false;第三章設(shè)計的實現(xiàn)3.1類圖Game類中主要成員有board、mark、line、voidCreatboard(int)、voidPrint()、boolJudge(int[],int[])、voidInitializer。、voidMiji()、voidTips()、voidCreatline()、voidPlay()其中只有board、line數(shù)組是私有函數(shù)封裝在類中,其它的是共有函數(shù);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實現(xiàn)流程圖各函數(shù)在程序運行時,首先在進入游戲時,系統(tǒng)自動調(diào)用voidInitializer()將棋盤進行初始化;在Initializer中主要調(diào)用iostream頭文件中的memset函數(shù)讀game類中的board、mark、line等數(shù)組以及全局變量record數(shù)組、conut(計數(shù)器)進行初始化;b).系統(tǒng)對所有數(shù)據(jù)進行初始化后,隨即調(diào)用Creatboard(int)函數(shù)進行構(gòu)建棋盤和棋子,Creatboard(int)是一個遞歸函數(shù),每調(diào)用一次該函數(shù)都會隨機在棋盤上找到兩個沒用過的空位進行填子,填子后調(diào)用Judge()函數(shù)對新填的子進行判斷是否合法,若合法Creatboard(int)函數(shù)就會自行調(diào)用自身進行下一步填子,若遍歷棋盤上所有空位都未能找到合法的位子進行填子,Creatboard()函數(shù)調(diào)用自身修改上一步填的棋子,以保證每次填的子能被消去,在填子的同時記錄每一次填的一對棋子的坐標(biāo)保存到record[]數(shù)組中;然后while循環(huán)調(diào)用Play()函數(shù)進行游戲,直到棋盤上的棋子全部消去后;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實現(xiàn)流程圖3?3主要函數(shù)的實現(xiàn)Creatboard(int):Creatboard(int)是用來隨機生成棋盤的遞歸函數(shù),傳入的是int類型的參數(shù);每次傳入的參數(shù)是conut計數(shù)器;遞歸的出口是conut>=MAX,(MAX即是棋子的對數(shù)),每一次進入Creatboard函數(shù),開始檢驗conut是否滿足小于等于MAX,滿足則進行隨機在棋盤上選則一空位,并用while語句判斷是否該點被棋子包圍,若被包圍或是已被占用,則進入while循環(huán)進行逐個偏移直到滿足條件,即找到不被包圍也沒有被占用的點,跳出while循環(huán)(如圖3.3)intt=0,tpoint1[2];inttpoint2[2];inttsum=0;//tsum記錄新棋子周圍棋子的個數(shù)以便判斷是否被舊的棋子包圍tpoint1[0]=rand()%20+1;tpoint1[1]=rand()%20+1;//隨機產(chǎn)生一個坐標(biāo)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)){〃如果隨機產(chǎn)生的坐標(biāo)已被占用或是被其他棋子包圍新的坐標(biāo)將偏移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找到一個點之后再來就是再用同樣的方法找出與之對應(yīng)的點,用Judge(tpoint1,tpoint2)判斷兩點是否是相連可消去的點,找到之后給兩點賦上相同的棋子,并把兩點的坐標(biāo)用record數(shù)組保存起來;接著就調(diào)用Creatboard(conut++)向前遞歸;而當(dāng)棋盤越來越密的時候,找完所有的點都不能發(fā)現(xiàn)有合適的兩點,說明棋盤上存在盲點,一旦出現(xiàn)這樣的情況,系統(tǒng)將調(diào)用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標(biāo)記為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()函數(shù)中主要是利用for循環(huán)進行搜索,首先判斷傳入的兩點上是否有棋子、是否是相同的棋子來決定是否進行下一步,再開一個跟棋盤一樣大小的bool類型的數(shù)組(tempboard),用memset(tempboard,false,sizeof(tempboard))初始tempboard的值;再從第一個點進行上下左右展開,即遇到空的位子就標(biāo)記為true,再往兩邊展開,即上下方向的往左右展開,而左右方向的往上下兩邊展開,這樣就能跟好的判斷轉(zhuǎn)一個彎的情況,而當(dāng)遇到有棋子的位子就用break跳出for循環(huán);(代碼如圖3.4)展開第一個點之后,接著就是對另一個點進行操作了,第二個點只要往上下左右四個方向進行試探就可以了,而不用再在展開后往兩邊展開了,如果遇到一個標(biāo)記為true的點或是第一點的話,就返回true,而當(dāng)在試探的時候一旦碰到有棋子的位子且不是第一點的話就break跳出這個方向,不再在這個方向進行試探;(代碼如圖3.5)
〃向上下方向搜索并標(biāo)記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〃向上下方向搜索并標(biāo)記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()函數(shù)主要是打印出用戶界面,可以讓用戶簡單明了的看到每一次操作后的結(jié)果,因此在Print()函數(shù)中主要是用for循環(huán)打印出邊界坐標(biāo)和棋盤;(代碼如圖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效果圖第四章實現(xiàn)結(jié)果界面是用戶與系統(tǒng)交互的主要場地,因此在游戲中好看實用的界面(如圖4.1)是很有必要的。在游戲中友好的游戲界面也是很有必要的,在用戶輸入坐標(biāo)時應(yīng)當(dāng)有提示正如圖4.2所示。******歡迎來到連連看游戲體驗系統(tǒng)****請選擇:****(1)開始游戲;****(0)退出游戲;********Tips:在游戲中輸入"0000"****結(jié)束游戲,輸入"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剩余步數(shù):140晴輸入兩點的坐標(biāo)(中間用空格隔開):圖4.2游戲運行界面當(dāng)用戶在游戲過程中遇到困難找不到下一步的步驟時,可以輸入“95959595”,系統(tǒng)將自動提示下一步游戲中可消的坐標(biāo)(如圖4.3);游戲結(jié)束時,系統(tǒng)應(yīng)當(dāng)有提示用戶是否重新再來一次游戲(如圖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—-請銃入兩舌的坐標(biāo)(中間用空格隔開):?5959595Nextstep:12113請輸入兩點的坐標(biāo)(中間用空格隔開):■GHBGJGDB游戲結(jié)束!是否重開一盤(1).重新開始;(0).退出游戲;圖4.4游戲結(jié)束圖當(dāng)然在游戲時,為了增加游戲的可靠性,中間參加游戲的秘籍也能提升游戲的可玩性和娛樂性,當(dāng)用戶想知道消去所有棋子的全部步驟時可以輸入“85858585”顯示所有提示(如圖4.5)當(dāng)然這是有前提的,秘籍只能在游戲開始時并且尚未消子時才能查看的;睛輸入兩:點的坐標(biāo)085858585414415412294647353686871424132312113455520720820320441941883731917201782843212019151916191419圖圖市■驟提20-6-—5^213117318312345678910111213141516171819201________________________________________________________________________________--------------------------------------------青按任意鍵繼續(xù)一.圖4.6消完后效果圖第五章結(jié)束語5?1功能上的優(yōu)勢功能上優(yōu)勢,主要在于程序類的各個成員函數(shù)即相對獨立又相互結(jié)合使用,Play()函數(shù)在運行時根據(jù)用戶的選擇調(diào)用了Judge()、Miji()、Tips()等函數(shù);在Play()和Creatboard()函數(shù)中均調(diào)用了Judge()判斷函數(shù),而在Judge()函數(shù)中判斷兩點是否相連可消時,另外用了一個相同大小的bool數(shù)組來標(biāo)記,這樣就使得原來的棋盤不被改動,而且可向四個方向進行展開能夠保證轉(zhuǎn)一個彎相連可消的棋子被判斷到;在生成棋子時使用遞歸與回溯,保證了棋盤在生成時能夠逐個相消完;且在生成棋盤時使用record數(shù)組記錄了全部消去的步驟,節(jié)省了程序再次搜索并打印提示的時間;5?2不足之處由于遞歸函數(shù)和隨機取數(shù)的局限性,導(dǎo)致棋盤上的棋子的對數(shù)不能開的很大,且不能完全填滿,還有在Judge()函數(shù)中語句顯得重復(fù)啰嗦。5?3心得體會在編寫這個程序幾乎使用了我在這一個學(xué)期中所學(xué)到的基礎(chǔ)編程中的所有知識點,同時也讓我學(xué)到了一些新的東西。這個程序中,使用到了類,還有函數(shù)的定義,還有循環(huán)的使用等等。在拿到這個題目的時候,我的第一想法就是如何分步實現(xiàn)這一步一步的功能,同樣在這樣的一個過程中也有不少問題等待我去實踐解決。例如在定義函數(shù)后,調(diào)用函數(shù)的時候,經(jīng)常遇到因為在調(diào)用時還在實參前面加上數(shù)據(jù)類型而引起編程錯誤。經(jīng)過多次的試驗,這種錯誤的錯誤提示語句都能夠看懂,遇到這種編程錯誤也能夠直接提手去改正。在遞歸函數(shù)使用的時候,仍然存在的一些問題,再經(jīng)過多次的試驗之后,自己摸索出來自己的門道,把運算符重載牢牢掌握在心了。經(jīng)常在編程的過程中還遇到一些邏輯上的錯誤,一些簡單的還好搞定,當(dāng)遇到復(fù)雜邏輯錯誤時,想了很久都沒有想出來錯誤出在哪里!不過最后還是在慢慢的找尋出錯誤,改正過來,那種感覺最爽。還有一些基本的錯誤,這些都能夠在提示下自己更正過來。在這次編程中,我遇到的一個問題,也是最讓我映像深刻的一個問題就是在程序執(zhí)行的過程中,一個循環(huán)輸入的時候,整個程序編完,一直過來,自己也學(xué)到一些新的東西,比如,將遞歸函數(shù)吃的更加透徹了,函數(shù)的調(diào)用也更加明白規(guī)則了,循環(huán)的邏輯也是越來越清晰了。還有學(xué)到了一些,課堂上都講得不多的知識,比如,使用while死循環(huán)判斷用戶的輸入是否按要求,雖然時一個過時的,在現(xiàn)在正規(guī)編程中少用的語句,但是還是學(xué)到了東西。函數(shù)內(nèi)部調(diào)用函數(shù)再傳值的問題也明白了其中的規(guī)則!同時,第一次編寫一個這樣的一個大程序,還讓我認(rèn)識到了編程思想在編程實現(xiàn)過程中的重要性,雖然,編程的思想不會被用戶買賬,但是在實現(xiàn)你的編程的過程中確實非常的重要!這樣的一個編程經(jīng)歷真非常值得懷念,希望下次還有這樣的機會!由衷感謝歐新良老師的指導(dǎo),謝謝!參考文獻.邱仲潘等BruceEckel.C++編程思想(第2版)[M].北京:電子工業(yè)出版社,譯.2001。.王挺、周會平等編著.C++程序設(shè)計.[M]北京:清華大學(xué)出版社,2005。.錢能著.C++程序設(shè)計教程(05版)[M]..北京:清華大學(xué)出版社,2005。附錄程序源代碼*\n"*\n";#include<iostream>#include<iomanip>#defineMAX140//MAX定義棋盤上棋子的對數(shù)usingnamespacestd;intrecord[200][4],conut=0;//record記錄生成的坐標(biāo)的次序conut記錄生成棋子的對數(shù)和削掉的棋子數(shù);classgame//構(gòu)建棋盤類{*\n"*\n";private:charboard[22][22];//棋盤intline[20];//邊界public:boolmark[22][22];//標(biāo)記voidCreatboard(int);//構(gòu)建棋盤voidPrint();//打印棋盤voidCreatline();//構(gòu)建棋盤邊界坐標(biāo)提示boolJudge(int[],int[]);//判斷函數(shù)判斷兩點是否可消voidInitializer。;//初始化棋盤voidMiji();//輸出消去的全部步驟voidTips();//給出下一步提示voidPlay();//玩};<<"\t\t****\n"<<"\t\t**歡迎來到連連看游戲體驗系統(tǒng)**\n"<<"\t\t**請選擇:**\n"<<"\t\t**(1)開始游戲;**\n"<<"\t\t**(0)退出游戲;**\n"<<"\t\t****\n"<<"\t\t**Tips:在游戲中輸入\"0000\"**\n"<<"\t\t**結(jié)束游戲,輸入\"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;//創(chuàng)建game類的對象aa.Initializer();//初始化aa.Creatline();//構(gòu)建a的棋盤邊界if(flag==0)return0;a.Creatboard(conut);//構(gòu)建a的棋盤cout<<"Ok"<<endl;//棋盤構(gòu)建完成提示OKsystem("pause");intmain(){cout<<"\n\n\n<<"\t\t*\n"while(flag)//游戲開始{gamea;//創(chuàng)建game類的對象aa.Initializer();//初始化aa.Creatline();//構(gòu)建a的棋盤邊界cout<<"游戲結(jié)束!\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()//構(gòu)建邊界編號{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)//遞歸函數(shù)構(gòu)建棋盤給出棋子{if(conut<=MAX){intt=0,tpoint1[2];inttpoint2[2];inttsum=0;//tsum記錄新棋子周圍棋子的個數(shù)以便判斷是否被舊的棋子包圍tpoint1[0]=rand()%20+1;tpoint1[1]=rand()%20+1;//隨機產(chǎn)生一個坐標(biāo)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)){〃如果隨機產(chǎn)生的坐標(biāo)已被占用或是被其他棋子包圍新的坐標(biāo)將偏移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];//暫時標(biāo)記tpoint2嘗試過的位置避免重復(fù)嘗試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標(biāo)記為0;break;}board[tpoint1[0]][tpoint1[1]]=board[tpoint2[0]][tpoint2[1]]='-';//檢驗不合格改回初始狀態(tài)'-'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標(biāo)記為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));〃向上下方向搜索并標(biāo)記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;}}//向左右搜索并標(biāo)記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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年流動式空氣質(zhì)量監(jiān)測車合作協(xié)議書
- 2025年個人門面買賣合同格式版(2篇)
- 2025年個人貨車租賃合同常用版(2篇)
- 2025年九年級英語下學(xué)期教學(xué)工作總結(jié)(二篇)
- 2025年個人貨運汽車租賃合同(4篇)
- 2025年個人雇傭協(xié)議參考范文(三篇)
- 2025年九年級教學(xué)管理工作總結(jié)樣本(2篇)
- 2013-2022年北京市中考真題物理試題匯編:電功和電功率章節(jié)綜合
- 2025年中介行業(yè)保密協(xié)議(五篇)
- 2025年個人成交租賃合同模板(三篇)
- 2024年度-脛腓骨骨折
- 2024年職業(yè)衛(wèi)生技術(shù)人員評價方向考試題庫附答案
- 應(yīng)用密碼學(xué)課件
- 紅樓夢詩詞全集
- 礦井通風(fēng)安全培訓(xùn)課件
- 2024年中國國際投資促進中心限責(zé)任公司招聘高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 苯胺合成靛紅工藝
- 質(zhì)量保證發(fā)展史和國外相關(guān)標(biāo)準(zhǔn)簡介
- 三年級上冊數(shù)學(xué)脫式計算大全600題及答案
- 魯教版(五四制)七年級數(shù)學(xué)上冊期末考試卷-附帶答案
- 南京大學(xué)儀器分析習(xí)題集
評論
0/150
提交評論