版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 設(shè)計(jì)題目:模擬人工洗牌</p><p><b> 學(xué)生姓名:</b></p><p><b> 專業(yè): </b></p><p><b> 班級(jí): </b></
2、p><p><b> 學(xué)號(hào): </b></p><p> 完成日期:2012年7月</p><p> 一:需求和規(guī)格說明:</p><p><b> ?。ㄒ唬╊}目要求:</b></p><p> 擬要求編寫一個(gè)人工洗牌的程序,將洗好的牌分別發(fā)給四個(gè)人。而且要求用結(jié)構(gòu)
3、card來描述一張牌的花色和數(shù)字(suit,num),利用C++的隨機(jī)函數(shù)void srand(unsigned seed)和int rand(void)來模擬人工洗牌的過程,最后將洗好的52張牌按順序分別發(fā)給四個(gè)人。而且對(duì)每個(gè)人的牌要按橋牌的規(guī)則輸出。即一個(gè)人的牌要先按牌的花色(順序依次為梅花,方塊,紅心和黑桃)進(jìn)行分類,同一類牌的內(nèi)部要再按A,K,Q,J,…,3,2牌的大小順序排列。另外發(fā)牌應(yīng)按四個(gè)人的順序依次分發(fā)。</p&g
4、t;<p><b> ?。ǘ┰O(shè)計(jì):</b></p><p><b> ?。保涸O(shè)計(jì)思想:</b></p><p> 第一:根據(jù)題目要求,設(shè)置一個(gè)結(jié)構(gòu)體card,因?yàn)橐粡埮朴谢ㄉ蛿?shù)字的不同,所以結(jié)構(gòu)體card包括了suit和num兩個(gè)成員,其中suit通過取0,1,2,3來分別表示梅花,方塊,紅心和黑桃四種花色;num取值2-10
5、、J(11)、Q(12)、K(13)、A(14)來表示牌上的數(shù)字。因此一張牌可以由suit和num的組合來唯一確定。</p><p> 第二:洗牌(shuffle)。由于洗牌時(shí)牌的順序是隨機(jī)的,所以用到了void srand(unsigned seed)和int rand(void)函數(shù)。通過srand函數(shù)設(shè)置rand函數(shù)所用得到隨機(jī)數(shù)產(chǎn)生算法的種子值來不斷改變r(jià)and函數(shù)的隨機(jī)數(shù)的啟動(dòng)種子值,以產(chǎn)生最佳的隨機(jī)
6、數(shù)。又由于相同的種子后面的rand()函數(shù)會(huì)出現(xiàn)一樣的隨機(jī)數(shù)。所以為了防止隨機(jī)數(shù)每次重復(fù)常常使用系統(tǒng)時(shí)間來初始化,即使用time函數(shù)來獲得系統(tǒng)的時(shí)間,將time_t型數(shù)據(jù)轉(zhuǎn)化為(unsigned)型再傳給srand函數(shù),即srand((unsigned)time(&t));而在這里所用的則是srand(time(NULL)),直接傳入一個(gè)空指針。用0到51的整數(shù)分別對(duì)應(yīng)52張牌 隨機(jī)產(chǎn)生0到51之間的一個(gè)整數(shù),將該整數(shù)所對(duì)應(yīng)的那
7、張牌與0對(duì)應(yīng)的那張牌交換,然后隨機(jī)產(chǎn)生1到51之間的一個(gè)整數(shù),重復(fù)該過程,每次隨機(jī)數(shù)的最大范圍減1,直到洗牌完畢。</p><p> 第三:排序(sort)。排序包括按花色排序和按大小排序 。在按花色排序中,利用sort函數(shù),根據(jù)冒泡排序法,從第一張牌開始依次與其后面的牌比較suit的大小,若第一張牌的suit大于后面的,則兩者交換,否則繼續(xù)。同理:在按照大小排序時(shí),按照冒泡排序法,大的值在前,小的在后。而在花
8、色排好之后,只需要在某種花色的內(nèi)部進(jìn)行大小排序即可。即函數(shù)sortNum().</p><p> 第四:牌的顯示(show())。牌的顯示包括花色和數(shù)字?;ㄉ胹witch函數(shù)分為四種情況分別輸出。數(shù)字則直接定義一個(gè)字符型數(shù)組,通過數(shù)組nums來表示輸出即可。</p><p> 第五:主函數(shù):(1)設(shè)置四個(gè)數(shù)組A[u], B[u], C[u], D[u]來反別表示四個(gè)人的牌。然后模擬出
9、52張牌。(2)洗牌。(3)發(fā)牌:發(fā)牌時(shí)是根據(jù)memcpy函數(shù)隨機(jī)將牌發(fā)給四個(gè)人。</p><p> ?。?)排序。將牌發(fā)好之后再根據(jù)排序函數(shù)分別對(duì)四個(gè)人的牌進(jìn)行花色和大小的排序。(5)輸出。即用show函數(shù)將牌輸出。</p><p><b> 結(jié)束!</b></p><p> 系統(tǒng)程序設(shè)計(jì)結(jié)構(gòu)圖:</p><p>
10、<b> 屬性和類型定義:</b></p><p> ?。ㄈ┯脩羰謨?cè) 無。</p><p> ?。ㄋ模┱{(diào)試及測(cè)試 程序驗(yàn)證結(jié)果如下截圖。</p><p> 為說明是隨機(jī)的發(fā)牌,故用三個(gè)結(jié)果來證明。</p><p><b> ?。ㄎ澹?lt;/b></p><p><
11、b> 源代碼:</b></p><p> #include <iostream.h></p><p> #include <memory.h></p><p> #include <stdlib.h></p><p> #include <time.h></p&
12、gt;<p> const int Num = 52;</p><p> const int u = 13; </p><p> enum CardType {SUIT, NUM}; </p><p> typedef struct </p><p><b> {</b></p>
13、<p> int suit; </p><p><b> int num; </b></p><p><b> } Card;</b></p><p> void shuffle(Card *card) </p><p><b> {</b><
14、/p><p> int i, n;</p><p><b> Card c;</b></p><p> srand(time(NULL));</p><p> for (i = 0; i < Num; i++)</p><p><b> {</b></p&
15、gt;<p> n = rand() % Num;</p><p> if (i!= n)</p><p><b> {</b></p><p> memcpy(&c, &card[n], sizeof(Card)); //sizeof(Card)=8</p><p> memcp
16、y(&card[n], &card[i], sizeof(Card));</p><p> memcpy(&card[i], &c, sizeof(Card));</p><p><b> }</b></p><p><b> }</b></p><p><
17、;b> }</b></p><p> void sort(Card *card, int size, CardType stype) </p><p><b> {</b></p><p> int i, j, k;</p><p><b> Card t;</b>&l
18、t;/p><p> for (i = 0; i < size-1; ++i)</p><p><b> {</b></p><p><b> k = i;</b></p><p> for (j = i + 1; j < size; ++j) {</p><p&
19、gt; if ((stype == SUIT) && (card[k].suit > card[j].suit)) </p><p><b> k = j;</b></p><p> else if ((stype == NUM) && card[k].num < card[j].num) </p>
20、<p><b> k = j;</b></p><p><b> }</b></p><p> if (k != i)</p><p><b> {</b></p><p> memcpy(&t, &card[i], sizeof(Car
21、d));</p><p> memcpy(&card[i], &card[k], sizeof(Card));</p><p> memcpy(&card[k], &t, sizeof(Card));</p><p><b> }</b></p><p><b> }&l
22、t;/b></p><p><b> }</b></p><p> void sortNum(Card *card)</p><p><b> { </b></p><p> int A[4] = {0, 0, 0, 0};</p><p><b>
23、 int i; </b></p><p> for (i = 0; i <=12; i++)</p><p> ++A[card[i].suit];</p><p> int j = 0;</p><p> for (i = 0; i <=3; i++)</p><p><b&
24、gt; {</b></p><p> sort(card + j, A[i],NUM);</p><p> j =j+ A[i];</p><p><b> }</b></p><p><b> }</b></p><p> void show(int
25、 suit, int num)</p><p><b> {</b></p><p> static char nums[] = {'2', '3', '4', '5', '6', '7', '8', '9', '10',
26、 'J', 'Q', 'K', 'A'};</p><p> switch (suit)</p><p><b> {</b></p><p><b> case 0:</b></p><p> cout << &q
27、uot;梅花 ";</p><p><b> break;</b></p><p><b> case 1:</b></p><p> cout << "方塊 ";</p><p><b> break;</b></p&g
28、t;<p><b> case 2:</b></p><p> cout << "紅心 ";</p><p><b> break;</b></p><p><b> case 3:</b></p><p> cout &
29、lt;< "黑桃 ";</p><p><b> break;</b></p><p><b> }</b></p><p> if (num == 10)</p><p> cout << "10";</p><
30、p><b> else</b></p><p> cout << nums[num-2];</p><p> cout << "\t\t"; </p><p><b> }</b></p><p> void main()</p>
31、;<p><b> {</b></p><p> Card card[Num];</p><p> Card A[u], B[u], C[u], D[u];</p><p> int i, s = 0,n = 2;</p><p> for (i = 0; i < Num; ++i)<
32、;/p><p><b> { </b></p><p> card[i].suit = s;</p><p> card[i].num = n;</p><p><b> ++n;</b></p><p> if ((i+1) % 13 == 0)</p>
33、<p><b> {</b></p><p><b> ++s;</b></p><p><b> n= 2;</b></p><p><b> }</b></p><p><b> }</b></p>
34、;<p> shuffle(card);</p><p> int j = 0;</p><p> for (i = 0; i < Num; i += 4)</p><p><b> {</b></p><p> memcpy(&A[j], &card[i], sizeof(
35、Card));</p><p> memcpy(&B[j], &card[i+1], sizeof(Card));</p><p> memcpy(&C[j], &card[i+2], sizeof(Card));</p><p> memcpy(&D[j], &card[i+3], sizeof(Card));
36、</p><p><b> ++j;</b></p><p><b> }</b></p><p> sort(A, u, SUIT);</p><p> sortNum(A);</p><p> sort(B, u, SUIT);</p><p
37、> sortNum(B);</p><p> sort(C, u, SUIT);</p><p> sortNum(C);</p><p> sort(D, u, SUIT);</p><p> sortNum(D);</p><p> cout<<"
38、 人工洗牌游戲 "<<endl<<endl;</p><p> cout << "Player 1" << "\t" << "Player 2" << "\t";</p><p> cout << &
39、quot;Player 3" << "\t" << "Player 4" << endl;</p><p> for (i = 0; i < u; ++i)</p><p><b> {</b></p><p> show(A[i].suit, A
40、[i].num);</p><p> show(B[i].suit, B[i].num);</p><p> show(C[i].suit, C[i].num);</p><p> show(D[i].suit, D[i].num);</p><p> cout << endl;</p><p>&
41、lt;b> }</b></p><p><b> }</b></p><p><b> (六)</b></p><p><b> 進(jìn)一步改進(jìn):</b></p><p> 由于程序中僅僅包含了52張牌,而且不包括大小王。對(duì)于實(shí)際中的玩牌方式有很多種,我
42、們還可以根據(jù)實(shí)際的需要添加多種玩牌的方法。在原程序的基礎(chǔ)上在加以改進(jìn),通過添加其他的函數(shù)來完成。讓用戶在使用時(shí)可以根據(jù)自己的需要來選擇。此外,對(duì)于個(gè)別函數(shù)的應(yīng)用可能回有更簡(jiǎn)便的算法,也可以考慮一下。</p><p><b> ?。ㄆ撸?lt;/b></p><p><b> 反思與體會(huì):</b></p><p> 對(duì)于這種題
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 撲克牌洗牌發(fā)牌過程模擬課程設(shè)計(jì)
- 船企洗牌在即
- led照明“后洗牌時(shí)代”
- 人工濕地課程設(shè)計(jì)
- 國(guó)際航運(yùn)市場(chǎng)加速洗牌
- 企業(yè)重組并購面臨重新洗牌
- 人工智能課程設(shè)計(jì)
- 2010藝術(shù)權(quán)力榜,重新洗牌
- 人工智能課程設(shè)計(jì)
- 中國(guó)最具潛力城市強(qiáng)勢(shì)洗牌的秘密
- 海淘新政“滿月”跨境電商洗牌
- 人工挖孔樁課程設(shè)計(jì)
- 終端洗牌4s店遭遇尷尬
- 深度洗牌 微晶玻璃盼行業(yè)創(chuàng)新
- 雷曼迷你債券促資產(chǎn)管理業(yè)洗牌
- 從嚴(yán)監(jiān)管私募進(jìn)入洗牌通道范文
- 人工智能掃雷課程設(shè)計(jì)報(bào)告
- 廚電行業(yè)洗牌加劇 新興品類放量增長(zhǎng)
- 奶粉“注冊(cè)制”將至 價(jià)格戰(zhàn)加速洗牌
- 刷單技巧-刷單行業(yè)格局重新洗牌
評(píng)論
0/150
提交評(píng)論