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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論