數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之紙牌游戲_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之紙牌游戲_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之紙牌游戲_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之紙牌游戲_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之紙牌游戲_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

1、羈辱鬭園質(zhì)結(jié).気超冬迓住我的 t t 網(wǎng)*大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告題目紙牌游戲院(系):計(jì)算機(jī)工程學(xué)院學(xué)生姓名:班級(jí):學(xué)號(hào):起迄日期:2011621-2011.7.1指導(dǎo)教師:2010 2011 年度 第 2 學(xué)期一、需求分析1. 問題描述:隨機(jī)產(chǎn)生 52 個(gè)數(shù)按照某一規(guī)則計(jì)算正面牌數(shù)。編號(hào)為 1-52 張牌,正面向上,從第 2 張開 始,以 2 為基數(shù),是 2 的倍數(shù)的牌翻一次,直到最后一張牌;然后,從第 3 張開始,以 3 為基數(shù),是3的倍數(shù)的牌翻一次,直到最后一張牌;然后 從第4張開始,以4為基數(shù), 是 4 的倍數(shù)的牌翻一次, 直到最后一張牌; .再依次 5 的倍數(shù)的牌翻一次, 6 的,

2、 7的 直 到 以 52 為基數(shù)的 翻過,輸出:這時(shí)正面向上的牌有哪些。2. 基本功能: 選擇紙牌是順序排序還是隨機(jī)排序隨機(jī), 1 為隨機(jī)排序,其他數(shù)字為順序排序,輸入 一個(gè)數(shù)使程序運(yùn)行,隨機(jī)產(chǎn)生 52張紙牌,運(yùn)行之后輸出正面向上的牌。之后輸入 1 重新運(yùn) 行,輸入其他數(shù)字回車停止3. 輸入輸出:1)輸入一個(gè)數(shù)字選擇是使用順序放牌還是隨機(jī)放牌,1 為隨機(jī)放牌,其他數(shù)字為順序放牌,輸入一個(gè)正整數(shù)種子值,程序運(yùn)行,輸出52 張紙牌的排列順序,列出紙牌序列,輸出正面向上的牌,進(jìn)入選擇語(yǔ)句,是否再玩一局,輸入 1,程序從新運(yùn)行,輸入其他,程序運(yùn) 行結(jié)束。二、概要設(shè)計(jì)1. 設(shè)計(jì)思路: 當(dāng)每個(gè)號(hào)碼每次遇到

3、是某個(gè)數(shù)的倍數(shù)的時(shí)候,都會(huì)相應(yīng)的翻一次牌,這樣,每張牌 翻得次數(shù)就個(gè)不一樣, 可能很多次, 也可能只有一兩次, 結(jié)果就只是要輸出在經(jīng)過各個(gè)不同 次數(shù)的反派后,正面向上的牌都有哪幾個(gè)。例如 24,第一次他是 2的倍數(shù)時(shí)要從背面翻到背面,當(dāng)進(jìn)行到 3 時(shí),又要從背面返回 來(lái)。如果他在多次翻拍后,正面還向上了,那么他就是要輸出的結(jié)果之一。/ 操作函數(shù)void operate(void)rcard rc;int i,j;rc=Random();/ 獲得紙牌不同排序方式/ 翻面游戲for(j=2;j=NUM;j+) /j為基數(shù),也是開始翻面的位置 for(i=j;i=NUM;i+)/i為紙牌位置 if(

4、%j=0) rc.ci-1.state=rc.ci-1.state?0:1;2. 基本算法:算法的主要流程為:選擇所需紙牌是隨機(jī)還是順序一建立代表52張牌的鏈表一鏈表可以選擇順序鏈表和隨機(jī)鏈表-輸出這 52張牌一調(diào)用翻牌算法按照規(guī)則進(jìn)行翻牌-輸出翻牌算法之后 的結(jié)果選擇是否從新開始。3. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):實(shí)體: card 實(shí)體: rcard其中的特征為 int info , int postion, int state它中的元素就是 card, 包涵 card 中的特征。函數(shù)名返回值類型Main()voidSelect ()voidoperate2voidoperate2

5、 ()voidrandom()rcardshunxu()rcardh_bian ()voidl_bian ()voidinformation()viod4. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):定義程序中用到的抽象數(shù)據(jù)類型;抽象數(shù)據(jù)類型線性表的定義如下:ADT card數(shù)據(jù)對(duì)象:D=ai|a i cNUM,i=1,2,3,n,n 0數(shù)據(jù)關(guān)系:R仁|a i-i ,a i D,i=1,2,3, , nADT rcard數(shù)據(jù)對(duì)象:D=ai| a i rc,i=1,2,3, n,n 0數(shù)據(jù)關(guān)系: Ri=| a i-i,ai D,i=i,2,3,, n基本操作: h_bian(void) 操作結(jié)果:構(gòu)成輸出紙牌的兩邊縱向邊框

6、。l_bian(void)操作結(jié)果:構(gòu)成輸出紙牌的橫向邊框。void information(int info)初始條件: info 已存在。操作結(jié)果: 輸出構(gòu)成所選定紙牌的編號(hào)。z_picture(int info)操作結(jié)果:輸出所選定紙牌Random()初始條件:線性表 num已存在。操作結(jié)果:形成隨機(jī)鏈表序列。shunxu()初始條件:線性表 num已存在。操作結(jié)果:形成順序鏈表序列。void operatei(void)初始條件:隨機(jī)數(shù)列存在。操作結(jié)果:輸出正面向上的紙牌。void operate2(void)初始條件:順序數(shù)列存在。操作結(jié)果:輸出正面向上的紙牌。select(void

7、)操作結(jié)果:判斷調(diào)用兩個(gè)操作函數(shù)中的一個(gè)。5. 軟件結(jié)構(gòu)設(shè)計(jì):1. 按需求分析中的功能進(jìn)行模塊劃分:1) 定義兩個(gè)實(shí)數(shù)體。2)構(gòu)造輸出紙牌的外觀和信息。3)形成順序或隨機(jī)數(shù)列4)對(duì)選擇數(shù)據(jù)進(jìn)行操作5)選擇操作函數(shù)6)主函數(shù)6. 函數(shù)原型:定義兩個(gè)實(shí)體 struct : card 圖形輸出函數(shù): z_picture()選擇函數(shù): select () 操作函數(shù): operate1 ()Operate2 ()排序函數(shù): random()Shunxu ()rcard() 調(diào)用函數(shù) l_bian調(diào)用函數(shù) random() 調(diào)用函數(shù) shunxu ()、 h_bian ()和information三、詳細(xì)

8、設(shè)計(jì)1. 詳細(xì)算法模塊1. / 定義兩個(gè)實(shí)體,其中 card 為 52 張紙牌, rcard 為被選中操作的紙牌 structint info; / 紙牌編號(hào)int postion; / 紙牌位置 , 從 1 開始計(jì)int state; / 紙牌狀態(tài), 1 表示紙牌正面向上, 0 表示紙牌背面向上 card;#define NUM 52 / 定義常量,方便調(diào)試和驗(yàn)證。 typedef structcard cNUM;rcard;2 構(gòu)造紙牌輸出界面,形成輸出的紙牌形。/ 紙牌橫向邊框void h_bian(void)int i;printf(nt); for(i=0;i10;i+) print

9、f(*);/ 紙牌列向邊框void l_bian(void)int i,j;for(i=0;i2;i+)printf(nt);printf(*); for(j=0;j8;j+) printf( );printf(*);3 輸出正面向上的紙牌信息。/ 紙牌序號(hào)信息void information(int info)printf(nt);if(info10)printf(* %d *,info);elseprintf(* %d *,info);/ 紙牌正面void z_picture(int info)h_bian();l_bian();information(info);l_bian();h_b

10、ian();printf(nn);4被調(diào)用函數(shù),分別由operate1 和 operate2 調(diào)用其中 random 形成 52 張隨機(jī)數(shù)列,shunxu 形成 52 張順序序列。/ 獲得紙牌不同排序方式rcard Random()rcard rc;int contNUM; / 將需要的數(shù)存放到數(shù)組中,然后通過調(diào)換數(shù)組中數(shù)的位置, 達(dá)到隨機(jī)排列目的。unsigned int seed; / 申明初始化器的種子,注意是 usigned int 型的 int index, i,t;/ 初始化紙牌狀態(tài) for(i=0;iNUM;i+) rc.ci.state=1;/ 對(duì)數(shù)組進(jìn)行初始化 for (i=

11、0; iNUM; i+) conti = i+1;/ 提供隨機(jī)種子printf( 請(qǐng)輸入一個(gè)正整數(shù)種子值 : n); scanf(%u,&seed);srand(seed);/ 生成隨機(jī)序列for (i=0; iNUM-1; i+)交換 NUM-1 次index=(rand()%(NUM-i-1)+i+1;產(chǎn)生從 i+1 至U NUM-1 的一個(gè)隨機(jī)數(shù)/ 交換t=conti; conti=contindex; contindex=t;printf( 紙牌編號(hào)按順序排列為: n);for(i=0;iNUM;i+)=conti; /紙牌編號(hào)rc.ci.postion=i+1;

12、/對(duì)應(yīng)紙牌位置printf(%d , );return rc;5 對(duì)選定操作對(duì)象進(jìn)行操作,即進(jìn)行選擇和翻面。/ / 操作函數(shù)void operate1(void)/ 操作函數(shù) 1,實(shí)現(xiàn)隨機(jī)序列翻牌操作rcard rc;int i,j;rc=Random();/ 獲得紙牌不同排序方式/ 翻面游戲for(j=2;j=NUM;j+) /j為基數(shù),也是開始翻面的位置 for(i=j;i=NUM;i+)/i為紙牌位置if(%j=0) rc.ci-1.state=rc.ci-1.state?0:1;/ 打印,用紙牌圖形打印。printf(n 正面向上的牌有 :)

13、;for(i=0;iNUM;i+)if(rc.ci.state)z_picture(); printf(n);void operate2(void)/ 操作函數(shù) 2,實(shí)現(xiàn)順序序列翻牌操作rcard rc;int i,j;rc=shunxu();/ 獲得紙牌不同排序方式/ 翻面游戲for(j=2;j=NUM;j+) /j為基數(shù),也是開始翻面的位置 for(i=j;i=NUM;i+)/i為紙牌位置if(%j=0) rc.ci-1.state=rc.ci-1.state?0:1;/ 打印,用紙牌圖形打印。printf(n 正面向上的牌有 :);for(i=

14、0;iNUM;i+)if(rc.ci.state)z_picture(); printf(n);6選擇函數(shù),用于程序運(yùn)行結(jié)束后選擇是否再來(lái)一局或者結(jié)束游戲。/ 選擇設(shè)計(jì)void select(void)char c;while(1)system(cls);清屏char a;printf(”請(qǐng)輸入要選擇的初始放牌序列輸入1為隨機(jī),其他為順序n);sca nf(%c, &a);if(a=1)operate1();判斷輸入else operate2();fflush(stdi n);printf(再玩一局?按1繼續(xù),按其他鍵退出!n請(qǐng)輸入選擇:);c=getchar();fflu

15、sh(stdi n);switch(c)case 1:select();default:exit(O);7主函數(shù)/定義主函數(shù)int main (i nt argc, char* argv)select();system(color 3e);return 0;2.實(shí)現(xiàn)主函數(shù)的流程圖4.函數(shù)之間的調(diào)用關(guān)系圖rl_bia n()in formati on (i ntr1l_bia n()LJinfo)結(jié)束四、調(diào)試分析1. 這題的時(shí)間復(fù)雜度是 0( 52)。按照操作指示,可以選擇順序放牌很隨機(jī)放牌,選擇 后運(yùn)行程序即可輸出相應(yīng)放牌順序下的正面向上的牌。2. 雖然本次程序的題目難度與其他問題想必不是很高

16、,但是仍有很多問題我們是很容易忽視的,其一:在理解題目要求時(shí),應(yīng)注意翻拍次數(shù)可能很多次;其二:for循環(huán)的嵌套使用在書寫是很容易漏掉大括號(hào)。3. 在程序調(diào)試期間根據(jù)提示還是很容易找出問題,但是自己編寫時(shí)就不會(huì)發(fā)現(xiàn),應(yīng)注意培養(yǎng)自己的嚴(yán)謹(jǐn)認(rèn)真,4. 編寫完程序之后,發(fā)現(xiàn)程序要求很簡(jiǎn)單,但是我應(yīng)該編寫更多的玩法,由于剛接觸MFC感覺是個(gè)很好的工程,以后有機(jī)會(huì)可以利用 游戲。MFC自己開發(fā)一個(gè)真正可以玩起來(lái)的紙牌五、測(cè)試結(jié)果1. 其輸入要選擇的初始放排序列1為隨機(jī),其他為順序。輸入:1其輸入一個(gè)正整數(shù)種子值。輸入:1紙牌序列按順序排列為。47 19 45 21 15 18 4 51 6 34 42 3

17、0 916 26 46 24 3 22 25 48 33 52 44 41 8 2920 10 28 38 17 12 14 47 13 37 32 5011 36 35 31 27 5 23 7 43 1 39 2正面向上的紙牌47 19 40 15 4 42 9 31 7 43 1 39再玩一局?按1繼續(xù),按其他鍵退出!n請(qǐng)輸入選擇:輸入:1 (從新開始游戲)輸入:其他(程序運(yùn)行結(jié)束)2. 其輸入要選擇的初始放排序列1為隨機(jī),其他為順序。輸入:2其輸入一個(gè)正整數(shù)種子值。輸入:1紙牌序列按順序排列為。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1

18、9 20 21 22 23 24 25 26 27 2829 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 正面向上的牌。1 4 9 16 25 36 49再玩一局?按1繼續(xù),按其他鍵退出!n請(qǐng)輸入選擇:輸入:1 (從新開始游戲)輸入:其他(程序運(yùn)行結(jié)束)六、用戶手冊(cè)1.輸入擺放紙牌的順序,1為隨機(jī)擺放,其他為順序擺放。并輸入一個(gè)種子值使程序運(yùn)行。4 *C: kPrograa FilesMicrosoft Visual StudioVByPiojectsVl 11 Debucl 11. exe請(qǐng)輸人婆選

19、擇的初妊放牌序列輸入丄為隨機(jī),其他為順序1情輸入一個(gè)正輕數(shù)種子值】12. 輸出紙牌的擺放順序,紙牌編號(hào)按順序排列為;47 19 4 40 21 15 1S 46 34 42 3B 9 1G 2G 4 24 3 22 25 4S 33 52 44 41 8 29 20 10 38 28 17 12 14 49 13 37 32 E0 11 3& 35 31 27 5 23 7 43 1 39 2 正面向上的牌有:梵:MKKX梵耳K耳473.對(duì)應(yīng)輸出正面向上的紙牌。4.如果選擇其他數(shù)字則紙牌為順序擺放。請(qǐng)輸入要選擇的初始放牌序輸入丄為隨機(jī),其他為順芹紙牌編號(hào)按順序排列為:1 2 3 4 5 6 7

20、 8 9 10 11 12 13 14 15 16 17 18 19 2H 21 22 23 24 25 26 2? 29 2? 3031 32 33 34 35 36 37 38 39 40 41 12 43 44 45 46 斗7 48 49 &0 51 斃5順序擺放時(shí)輸出正面向上的紙牌。M*166.程序運(yùn)行到最后,輸入 1重新運(yùn)行程序。黯漏按瞥按其他犍退曲7.輸入其他數(shù)字,例如3程序運(yùn)行結(jié)束叡醪嚴(yán)按其叫Pv&ss any kep to continue七、體會(huì)與自我評(píng)價(jià) 在為期不到兩周的課程設(shè)計(jì)中,我體會(huì)頗多,學(xué)到很多東西。我對(duì)如何用 MFC 編寫可視化界面的應(yīng)用程序還沒有完全掌握, 否

21、則我相信這次程序我可以做得更 加完美,留下了一點(diǎn)遺憾,但是自己親自動(dòng)手的機(jī)會(huì)還是使我加強(qiáng)了對(duì) C 的認(rèn) 識(shí),復(fù)習(xí)了自己以前的知識(shí), 自己的邏輯思考能力也提高不少。 從而對(duì) Microsoft Visual C+ 6.0 又有了更深入的認(rèn)識(shí)!在這次課程設(shè)計(jì)中,我還懂得了程序開發(fā) 的一些比較重要的步驟,比如需求分析、總體設(shè)計(jì)、數(shù)據(jù)庫(kù)設(shè)計(jì) (含概念設(shè)計(jì)、 邏輯設(shè)計(jì)、物理設(shè)計(jì) )、程序模塊設(shè)計(jì) (含功能需求、用戶界面設(shè)計(jì)、程序代碼設(shè) 計(jì)與分析、運(yùn)行結(jié)果 )、系統(tǒng)使用說(shuō)明等??傊ㄟ^這次課程設(shè)計(jì),我收獲頗 豐,相信會(huì)為自己以后的學(xué)習(xí)和工作帶來(lái)很大的好處。 最重要的還是激發(fā)了我編 程的興趣和熱情, 讓我

22、從一個(gè)只懂理論變成了能做一些小型程序, 讓我對(duì)編程更 加熱愛了。整體地評(píng)價(jià)這次課程設(shè)計(jì),我認(rèn)為收獲很大,正如上面所說(shuō)的那樣, 通過課程設(shè)計(jì), 既復(fù)習(xí)了以前的舊知識(shí), 又學(xué)到了一些新的知識(shí); 設(shè)計(jì)增強(qiáng)了我 們用所學(xué)知識(shí)去解決具體問題的能力, 進(jìn)一步培養(yǎng)了我們獨(dú)立思考問題和解決問 題的能力。特別是學(xué)會(huì)了在 Visual C+ 集成開發(fā)環(huán)境中如何調(diào)試程序的方法。 當(dāng)然,老師的悉心指導(dǎo)和同學(xué)的幫助也是不可忽視的, 在此感謝本次課程設(shè)計(jì)中 所有輔導(dǎo)老師對(duì)我的關(guān)心和幫助, 誠(chéng)心誠(chéng)意感謝他們對(duì)我的鼓勵(lì)與教導(dǎo), 是她們 在我迷茫的時(shí)候給了我些許提示, 激發(fā)了我編程的靈感; 在編寫過程中遇到的問 題也不再是翻不

23、過去的大山,在親手寫程序的過程中我真正體會(huì)到動(dòng)手的樂趣, 我慢慢學(xué)會(huì)了利用編程思想解決現(xiàn)實(shí)中的問題, 把理論運(yùn)用于實(shí)踐, 對(duì)于我們這 些計(jì)算機(jī)學(xué)院的本科生來(lái)說(shuō), 實(shí)際能力培養(yǎng)遠(yuǎn)至關(guān)重要, 而這種實(shí)際能力的培養(yǎng) 只從課堂上學(xué)習(xí)是遠(yuǎn)遠(yuǎn)不夠的,必須從課堂組向?qū)嵺`,也是我們學(xué)習(xí)的目的。數(shù)據(jù)結(jié)構(gòu)及其算法在解決現(xiàn)實(shí)生活中的常見問題和書寫軟件設(shè)計(jì)方面上都 有著重要的意義, 我們應(yīng)該好好掌握它的相關(guān)知識(shí), 在以后的學(xué)習(xí)過程中, 更多 的學(xué)會(huì)如何與用知識(shí)。源代碼/ strong_poker.cpp : Defines the entry point for the console application. /#

24、include stdafx.h#include stdlib.h#include stdio.h#include iostream.h typedef structint info;/紙牌編號(hào)int postion; / 紙牌位置 ,從 1 開始計(jì)int state; /紙牌狀態(tài), 1 表示紙牌正面向上, 0 表示紙牌背面向上card;#define NUM 52 / 定義常量,方便調(diào)試和驗(yàn)證。 typedef struct card cNUM;rcard;/紙牌橫向邊框void h_bian(void)int i;printf(nt); for(i=0;i10;i+) printf(*);

25、/紙牌列向邊框void l_bian(void)int i,j;for(i=0;i2;i+)printf(nt);printf(*); for(j=0;j8;j+) printf( );printf(*);/紙牌序號(hào)信息void information(int info)printf(nt);if(info10)printf(* %d *,info);elseprintf(* %d *,info);/紙牌正面void z_picture(int info)h_bian();l_bian();information(info);l_bian();h_bian();printf(nn);/獲得紙牌

26、不同排序方式rcard Random()/ 產(chǎn)生隨機(jī)序列rcard rc;int contNUM; /將需要的數(shù)存放到數(shù)組中,然后通過調(diào)換數(shù)組中數(shù)的位置,達(dá)到隨 機(jī)排列目的。unsigned int seed; / 申明初始化器的種子,注意是 usigned int 型的int index, i,t;/初始化紙牌狀態(tài)for(i=0;iNUM;i+)rc.ci.state=1;/對(duì)數(shù)組進(jìn)行初始化for (i=0; iNUM; i+)conti = i+1;/提供隨機(jī)種子printf( 請(qǐng)輸入一個(gè)正整數(shù)種子值 : n);scanf(%u,&seed);srand(seed);/生成隨機(jī)序列for

27、(i=0; iNUM-1; i+)/ 交換 NUM-1 次index=(rand()%(NUM-i-1)+i+1;/ 產(chǎn)生從 i+1 到 NUM-1 的一個(gè)隨機(jī)數(shù)/交換t=conti;conti=contindex;contindex=t;printf( 紙牌編號(hào)按順序排列為: n);for(i=0;iNUM;i+)=conti;/紙牌編號(hào)rc.ci.postion=i+1; / 對(duì)應(yīng)紙牌位置printf(%d , );return rc;rcardshunxu()/ 產(chǎn)生順序序列 rcard rc;int i;for(i=0;iNUM;i+)rc.ci.state=1;printf( 紙牌編號(hào)按順序排列為: n);for(i=0;iNUM;i+)=i+1; / 紙牌編號(hào)rc.ci.postion=i+1;/ 對(duì)應(yīng)紙牌位置printf(%d , );return rc;void operate1(

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論