2010上課程設(shè)計(jì)說(shuō)明書(shū)_第1頁(yè)
2010上課程設(shè)計(jì)說(shuō)明書(shū)_第2頁(yè)
2010上課程設(shè)計(jì)說(shuō)明書(shū)_第3頁(yè)
2010上課程設(shè)計(jì)說(shuō)明書(shū)_第4頁(yè)
2010上課程設(shè)計(jì)說(shuō)明書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

評(píng)論

0/150

提交評(píng)論