21點游戲——C++程序課程設(shè)計報告_第1頁
21點游戲——C++程序課程設(shè)計報告_第2頁
21點游戲——C++程序課程設(shè)計報告_第3頁
21點游戲——C++程序課程設(shè)計報告_第4頁
21點游戲——C++程序課程設(shè)計報告_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、隨機數(shù),枚舉類型c+面向?qū)ο蟪绦蛟O(shè)計課程設(shè)計報告設(shè)計題目: 21點游戲 學(xué)生學(xué)號: 學(xué)生姓名: 專業(yè)班級: 學(xué)生成績: 指導(dǎo)教師: 醫(yī)藥信息工程學(xué)院圖像處理與多媒體教研室2011-5一、 設(shè)計任務(wù)分析1、21點游戲介紹21點游戲是一個古老的撲克游戲,游戲的規(guī)則是:各個參與者設(shè)法使自己的牌達到總分21而不超過這個數(shù)值。撲克牌的分值取它們的面值,a充當1或者11分,j,q和k人頭牌都是10分。莊家vs17個玩家。在開局時,包括莊家在內(nèi)的所有參與者都有兩張牌。玩家可以看到他們的所有牌以及總分,而莊家有一張牌暫時是隱藏的。接下來,只要愿意,各個玩家都有機會依次再拿一張牌。如果是玩家的總分超過了21(稱

2、為引爆),那么這個玩家就輸了。在所有玩家都拿了額外的牌后,莊家將顯示隱藏的牌。只要莊家的總分等于或小于16,那么他就必須再拿牌。如果莊家引爆了,那么還沒有引爆的所有玩家都將獲勝,引爆的玩家打成平局。否則,將余下的各玩家的總分與莊家的總分做比較,如果玩家的總分大于莊家的總分,則玩家獲勝。如果二者的總分相同,則玩家與莊家打成平局中。2、實現(xiàn)以下功能: 1) 洗牌; 2) 發(fā)牌; 3) 隱藏或顯示牌; 4) 計算總分; 5) 判斷勝負。 二、 21點游戲流程給莊家發(fā)最初的三張牌隱藏莊家的第一張牌和總分向玩家發(fā)額外的牌并顯示牌和總分顯示莊家的牌玩家輸給玩家發(fā)最初的三張牌并顯示牌和總分玩家需要額外的牌?

3、莊家的總分莊家?洗牌nyynyynn玩家引爆?玩家輸yn平局玩家贏三、 主要數(shù)據(jù)結(jié)構(gòu)撲克版結(jié)構(gòu)體:typedef enum/撲克牌面值:ace(a),two(2)ten(10),jack(j),queen(q),king(k)ace=1,two,three,four,five,six,seven,eight,nine,ten,jack,queen,kingranktype;typedef enum/撲克牌花色:clubs(梅花),diamonds(方塊),hearts(紅桃)和spades(黑桃)clubs,diamonds,hearts,spadessuittype;struct card/

4、撲克牌結(jié)構(gòu)體ranktype rank;/撲克牌面值suittype suit;/撲克牌花色;四、 21點游戲類設(shè)計gameof21point類屬性成員變量名數(shù)據(jù)類型意 義deckcard一副撲克牌dealposeint發(fā)牌位置namechar玩家改姓名方法成員函數(shù)名屬 性函數(shù)功能shuffle()private洗牌gettotalscore()private返回總分值showstatus()private顯示當前狀態(tài)dealonecard()private發(fā)牌game()public運行游戲五、 源代碼#ifndef _card_h_#define _card_h_#include/#inc

5、ludeusing namespace std;typedef enum/撲克牌面值:ace(a),two(2)ten(10),jack(j),queen(q),king(k)ace=1,two,three,four,five,six,seven,eight,nine,ten,jack,queen,kingranktype;typedef enum/撲克牌花色:clubs(梅花),diamonds(方塊),hearts(紅桃)和spades(黑桃)clubs,diamonds,hearts,spadessuittype;struct card/撲克牌結(jié)構(gòu)體ranktype rank;/撲克牌面

6、值suittype suit;/撲克牌花色;ostream &operator(ostream &outstream,const card &card)/操作結(jié)果:重載運算符/輸出花色if(card.suit=clubs) outstream梅花;/clubs表示梅花else if(card.suit=diamonds) outstream方塊;/diamonds表示方塊else if(card.suit=hearts) outstream 紅桃;/hearts表示紅桃else if(card.suit=spades) outstream黑桃;/spades表示黑桃/輸出面值if (card.

7、rank=ace) outstreama;/ace表示aelse if(card.rank=jack) outstreamj;/jack表示jelse if(card.rank=queen) outstreamq;/jack表示qelse if(card.rank=king) outstreamk;/jack表示kelse cout(int)card.rank;return outstream;#endif#ifndef _game_of_21_point_h_#define _game_of_21_point_h_#includecard.h/撲克牌#include#define len_o

8、f_max_name 21/最大姓名長度using namespace std;/21點游戲類gameof21point聲明class gameof21pointprivate:card deck52;/一副撲克牌int dealpos;/發(fā)牌位置card hands821;/hand0保存莊家的牌,hand17保存各玩家的牌int numofcard8;/莊家(numofcard0)及玩家numofcard17的牌數(shù)char name8len_of_max_name;/莊家及玩家姓名int numofplayer;void shuffle();/洗牌int gettotalscore(car

9、d hand21,int n);/返回一手牌的總分值void showstatus(int num,bool hidefirstcardandtotalscore=false);/顯示莊家(對應(yīng)num=0)或玩家(對應(yīng)num0)的當前狀態(tài)card dealonecard()return deckdealpos+; /發(fā)一張撲克牌public:/方法聲明gameof21point();/無參構(gòu)造函數(shù)virtual gameof21point();void game();/初始化撲克牌,發(fā)牌位置,莊家與各玩家手中的撲克牌數(shù)gameof21point:gameof21point()int curpo

10、s=0;/當前撲克牌位置for(int suitpos=0;suitpos4;suitpos+)/花色for(int rankpos=1;rankpos=13;rankpos+)/面值deckcurpos.suit=(suittype)suitpos;/花色deckcurpos.rank=(ranktype)rankpos;/面值curpos+;coutnumofplayer;while (numofplayer7) /限制人數(shù)在17之間coutnumofplayer;dealpos=0;/發(fā)牌位置int i=0;/臨時變量/莊家numofcard0及玩家numofcard17手中的撲克牌張數(shù)

11、for(i=0;i=numofplayer;i+) numofcardi=0;strcpy(name0,莊家);/玩家姓名for(i=1;i=numofplayer;i+)cout輸入第inamei;cout游戲開始0;curpos-)int pos=rand()%(curpos+1);/產(chǎn)生0curpos之間的隨機數(shù)card temp;/定義一個臨時變量用于交換牌temp=deckpos;deckpos=deckcurpos;deckcurpos=temp;int gameof21point:gettotalscore(card hand21,int n)int pos;int totals

12、core=0;for(pos=0;posten)totalscore+=10;/j,q,k的分值為10else totalscore+=(int)handpos.rank;/twoten分值為210/分值大于21時,將a的分值改為1for(pos=0;totalscore21&pos0,顯示第num個玩家的當前狀態(tài),當/hidefirstcardandtotalscore為真時,將隱藏首張撲克牌與總分,否則將顯示首/張牌與總分/*coutnamenum:;/顯示莊家或玩家姓名/隱藏莊家首張牌if(hidefirstcardandtotalscore)cout;else couthandsnum

13、0;/顯示莊家的首張牌for(int i=1;inumofcardnum;i+)couthandsnumi;if(!hidefirstcardandtotalscore)cout總分值gettotalscore(handsnum,numofcardnum);cout21)coutnamenum引爆!endl;/*不使用輸出符重載時的代碼*/coutnamenum:;/顯示莊家或玩家姓名/根據(jù)莊家的狀態(tài)隱藏或顯示莊家首張牌的花色if(hidefirstcardandtotalscore)cout;/隱藏首張牌else if(handsnum0.suit=clubs) cout梅花;/clubs表

14、示梅花else if(handsnum0.suit=diamonds) cout方塊;/diamonds表示方塊else if(handsnum0.suit=hearts) cout 紅桃;/hearts表示紅桃else if(handsnum0.suit=spades) cout黑桃;/spades表示黑桃/輸出莊家首張牌的面值if(hidefirstcardandtotalscore)cout;else if(handsnum0.rank=ace) couta;/ace表示aelse if(handsnum0.rank=jack) coutj;/jack表示jelse if(handsnu

15、m0.rank=queen) coutq;/jack表示qelse if(handsnum0.rank=king) coutk;/jack表示kelse cout(int)handsnum0.rank;for(int i=1;inumofcardnum;i+)if(handsnumi.suit=clubs) cout梅花;/clubs表示梅花else if(handsnumi.suit=diamonds) cout方塊;/diamonds表示方塊else if(handsnumi.suit=hearts) cout 紅桃;/hearts表示紅桃else if(handsnumi.suit=sp

16、ades) cout黑桃;/spades表示黑桃/輸出面值if (handsnumi.rank=ace) couta;/ace表示aelse if(handsnumi.rank=jack) coutj;/jack表示jelse if(handsnumi.rank=queen) coutq;/jack表示qelse if(handsnumi.rank=king) coutk;/jack表示kelse cout(int)handsnumi.rank;if(!hidefirstcardandtotalscore)cout總分值gettotalscore(handsnum,numofcardnum);

17、cout21)coutnamenum引爆!endl; void gameof21point:game()shuffle();/洗牌int i,j;/為莊家發(fā)兩張牌for(i=0;i2;i+)hands0numofcard0+=dealonecard();showstatus(0,true);/顯示莊家狀態(tài),隱藏首張牌與總分/向各玩家發(fā)牌并顯示for(i=1;i=numofplayer;i+)for(j=0;j2;j+)handsinumofcardi+=dealonecard();showstatus(i);coutendl;/依次向各玩家發(fā)額外的牌for(i=1;i=numofplayer;

18、i+)char ans;coutnameians;/玩家選擇再要一張牌,如果玩家沒有引爆則繼續(xù)發(fā)牌/switch(ans)/while(ans!=y & ans!=n)cout你的輸入不正確,請重新輸入。endl;coutnameians;while (gettotalscore(handsi,numofcardi)21) break;coutnameians;/showstatus(0);/顯示莊家/莊家總分小于等于16,必須再拿牌while(gettotalscore(hands0,numofcard0)=16)hands0numofcard0+=dealonecard();/為莊家發(fā)1張

19、牌showstatus(0);/顯示莊家cout21)for(i=1;i=numofplayer;i+)/依次查看每位玩家if(gettotalscore(handsi,numofcardi)=21)coutnamei,恭喜你,你贏了!endl;/玩家沒有引爆else coutnamei,唉,你打平局了!endl;/玩家引爆else/莊家沒有引爆,依次查看每位玩家for(i=1;i=numofplayer;i+)/總分比莊家大if(gettotalscore(handsi,numofcardi)gettotalscore(hands0,numofcard0)/玩家未引爆,且總分比莊家大,玩家贏

20、coutnamei,恭喜你,你贏了!endl;else if(gettotalscore(handsi,numofcardi)=gettotalscore(hands0,numofcard0)/玩家總分與莊家相等,平局coutnamei,唉,你打平局了!endl;else/玩家引爆或總分比莊家小,玩家輸coutnamei,對不起,你輸了!endl;#endif#includegame_of_21_point.hint main()char againgame;dogameof21point objgame;/生成21點游戲?qū)ο髈bjgame.game();coutendlagaingame; while(againgame=y);return 0;六、 測試情況七、 小結(jié)課程設(shè)計是培養(yǎng)學(xué)生綜合運用所學(xué)知識 ,發(fā)現(xiàn),提出,分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對我們的實際工作能力的具體訓(xùn)練和考察過程.隨著科學(xué)技術(shù)發(fā)展的日新月異,當今計算機應(yīng)用在生活中可以說得是無處不在。因此作為二十一世紀的大學(xué)來說掌握程序開發(fā)技術(shù)是十分重要的,而c+語言又是最常見,功能最強大的一種高級語言,因此做好c+語言課程設(shè)計是十分必要的。通過幾天的課程設(shè)計使我們懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論