人工洗牌課程設(shè)計(jì)---模擬人工洗牌_第1頁
已閱讀1頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論