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

2、為引爆),那么這個(gè)玩家就輸了。在所有玩家都拿了額外的牌后,莊家將顯示隱藏的牌。只要莊家的總分等于或小于16,那么他就必須再拿牌。如果莊家引爆了,那么還沒有引爆的所有玩家都將獲勝,引爆的玩家打成平局。否則,將余下的各玩家的總分與莊家的總分做比較,如果玩家的總分大于莊家的總分,則玩家獲勝。如果二者的總分相同,則玩家與莊家打成平局中。2、實(shí)現(xiàn)以下功能: 1) 洗牌; 2) 發(fā)牌; 3) 隱藏或顯示牌; 4) 計(jì)算總分; 5) 判斷勝負(fù)。 二、 21點(diǎn)游戲流程給莊家發(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點(diǎn)游戲類設(shè)計(jì)GameOf21Point類屬性成員變量名數(shù)據(jù)類型意 義DeckCard一副撲克牌dealPoseint發(fā)牌位置Namechar玩家改姓名方法成員函數(shù)名屬 性函數(shù)功能Shuffle()private洗牌GetTotalScore()private返回總分值ShowStatus()private顯示當(dāng)前狀態(tài)DealOneCard()private發(fā)牌Game()public運(yùn)行游戲五、 源代碼#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é)果:重載運(yùn)算符/輸出花色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/最大姓名長(zhǎng)度using namespace std;/21點(diǎn)游戲類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);/顯示莊家(對(duì)應(yīng)num=0)或玩家(對(duì)應(yīng)num0)的當(dāng)前狀態(tài)Card DealOneCard()return deckdealPos+; /發(fā)一張撲克牌public:/方法聲明GameOf21Point();/無(wú)參構(gòu)造函數(shù)virtual GameOf21Point();void Game();/初始化撲克牌,發(fā)牌位置,莊家與各玩家手中的撲克牌數(shù)GameOf21Point:GameOf21Point()int curPo

10、s=0;/當(dāng)前撲克牌位置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;/臨時(shí)變量/莊家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之間的隨機(jī)數(shù)Card temp;/定義一個(gè)臨時(shí)變量用于交換牌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時(shí),將A的分值改為1for(pos=0;totalScore21&pos0,顯示第num個(gè)玩家的當(dāng)前狀態(tài),當(dāng)/hideFirstCardAndTotalScore為真時(shí),將隱藏首張撲克牌與總分,否則將顯示首/張牌與總分/*coutnamenum:;/顯示莊家或玩家姓名/隱藏莊家首張牌if(hideFirstCardAndTotalScore)cout;else couthandsnum

13、0;/顯示莊家的首張牌for(int i=1;inumOfCardnum;i+)couthandsnumi;if(!hideFirstCardAndTotalScore)cout總分值GetTotalScore(handsnum,numOfCardnum);cout21)coutnamenum引爆!endl;/*不使用輸出符重載時(shí)的代碼*/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你的輸入不正確,請(qǐng)重新輸入。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,對(duì)不起,你輸了!endl;#endif#includegame_of_21_point.hint main()char AgainGame;doGameOf21Point objGame;/生成21點(diǎn)游戲?qū)ο髈bjGame.Game();coutendlAgainGame; while(AgainGame=y);return 0;六、 測(cè)試情況七、 小結(jié)課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí) ,發(fā)現(xiàn),提出,分析和解決實(shí)際問題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)我們的實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程.隨著科學(xué)技術(shù)發(fā)展的日新月異,當(dāng)今計(jì)算機(jī)應(yīng)用在生活中可以說(shuō)得是無(wú)處不在。因此作為二十一世紀(jì)的大學(xué)來(lái)說(shuō)掌握程序開發(fā)技術(shù)是十分重要的,而C+語(yǔ)言又是最常見,功能最強(qiáng)大的一種高級(jí)語(yǔ)言,因此做好C+語(yǔ)言課程設(shè)計(jì)是十分必要的。通過(guò)幾天的課程設(shè)計(jì)使我們懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的

溫馨提示

  • 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)論