C++課程設(shè)計_撲克牌21點_第1頁
C++課程設(shè)計_撲克牌21點_第2頁
C++課程設(shè)計_撲克牌21點_第3頁
C++課程設(shè)計_撲克牌21點_第4頁
C++課程設(shè)計_撲克牌21點_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-一個21點的撲克牌游戲一、課程名稱: 撲克牌二、班級和姓名: 某某三、課程設(shè)計要求(1) 所有的函數(shù)與相應(yīng)的數(shù)據(jù)封裝到類中,改寫主程序使其更加完善。(2) 程序中一共有13張撲克牌可以隨機抽取,大于10的點數(shù)全部為半點。(3) 莊家永遠(yuǎn)不會暴莊,莊家可以查看下一張牌,若大于21點,則拒絕。(4) 高級玩家可以查看下一張牌,按H鍵,然后按要求輸入密碼,密碼正確可以看牌,并決定是否要牌。(5) 每次要牌后可以設(shè)定賠率,如果開始是下的10元錢的注,如果牌好,你可以要求再下注,當(dāng)然不能超過你所有的總錢數(shù)。(6) 將界面提示說明改成中文界面,界面的解釋詳細(xì)友好,可以吸引更多玩家四、功能說明:本程序首先

2、編寫了一個類,將程序中定義的函數(shù)和數(shù)據(jù)封裝到類中。這樣不僅滿足了設(shè)計要求也使整個程序的結(jié)構(gòu)更加一目了然。然后對10以上的牌重新附值為0.5以符合題目要求。接下來設(shè)計了防止莊家暴莊的函數(shù),超級玩家看牌的函數(shù),計算累計總賭注的函數(shù)。使程序真正完善起來。數(shù)據(jù)和函數(shù)是用類封裝在一起的,五、采用的主要數(shù)據(jù)結(jié)構(gòu)類型 (1)本程序進(jìn)行了類的封裝,編寫了一個類來封裝所有相關(guān)函數(shù)和變量,把源程序封裝在類中,然后對main主函數(shù)進(jìn)行改寫,結(jié)構(gòu)清晰,條理有序,使得修改十分便捷,一目了然。題目要求把抽到的大于10點的牌的點數(shù)設(shè)為半點。按照要求將隨機取下一張牌的成員函數(shù),判斷牌的點數(shù)是否大于10的if語句中大于10的牌

3、重新賦值為0.5。例:if(playercard110)playercard1=0.5;(2)題目要求莊家永遠(yuǎn)不會暴莊,莊家取下一張之前先判定取牌后的總點數(shù)是否會大于21點,大于的話就拒絕去下一張,小于時就繼續(xù)取牌,在函數(shù)中首先隨機產(chǎn)生下一張牌,接著用條件語句判定原有點數(shù)與新牌點數(shù)之和是否大于21點,然后決定是否取牌。例:if(cpu21) /判斷莊家的點數(shù) coutttt莊家要了一張牌。endl; coutttt這牌是:cardendl; /顯示牌的點數(shù) coutttt總數(shù)是 :cpuendl; /顯示莊家的總點數(shù) else cpu=cpu-card; /如果點數(shù)超出21點,則不要牌了題目要

4、求超級玩家在輸入密碼后可以查看下一張牌,只需設(shè)計一成員函數(shù),判定玩家是否繼續(xù)要牌之前加入對玩家是否輸入H鍵的判定,如果有輸入則調(diào)用為處理玩家輸入密碼而單獨編寫的成員函數(shù),在該函數(shù)中,首先判定玩家的輸入密碼是否正確,正確后才可以看下一張牌。例:void fuctions:mima(char &ans,double&card,double&player) /定義一個密碼函數(shù) int s1=1234,m1; /定義兩個整型并對一個進(jìn)行賦值coutm1; /輸入密碼if(s1=m1) /判斷密碼是否相符coutttt下一張牌是:cardendl; /顯示下一張牌else cout密碼錯誤endl; /

5、提示密碼錯誤(3)題目要求玩家可以根據(jù)手上的牌決定是否下注,只需設(shè)計一成員函數(shù),檢查玩家的賭注累計不超過他所擁有的總資。例:void fuctions:Duzhu(int&money,int&bett) /定義一個陪率函數(shù) char ans; bett=0; /將0賦值給賭注 coutans; if(ans=y)|(ans=Y) /判斷玩家是否還要下注 coutbett; money=money-bett; /計算出剩余的總資本 while(money0) /如果資本小于0,則賭注超過了資本 /提示玩家錯了和要求重新輸入 money=money+bett; /重新計算總資本 cout你不能下這

6、么多的賭注!endl;/提示玩家下的賭注超出資本 coutbett; money=money-bett; /計算總資本 源程序:#include #include #include #include #include #include class Playing_Card /撲克牌類,表示一張撲克牌的面值、花色和與之相聯(lián)系的操作private:int m_Value; /撲克的實際面值,用整型值表示,從1開始,113char m_Face3; /撲克的數(shù)字大小,用字符串的形式表示,為A,2,3,10,J,Q,Kchar m_Suit ; /撲克的花色(黑、紅、梅、方)public:Playin

7、g_Card();/構(gòu)造函數(shù),初始化撲克對象,實際上是將對象清零void showcard();/顯示撲克牌對象的面值,花色void Card_Make(int); /為一張撲克牌對象賦予特定的面值和花色friend class PerDeck; /定義類PerDeck為類Playing_Card的友元類;class Deck /一副撲克(54張)類private:Playing_Card m_cardarray54;/一副撲克由54張撲克牌構(gòu)成int m_lastdelt; /標(biāo)記這副撲克牌刪除的張數(shù)public:Deck();/構(gòu)造函數(shù),初始化一副撲克牌對象,實際上是將其內(nèi)的54張撲克牌清

8、零void MakeDeck();/生成一副撲克,即對其內(nèi)的54張撲克賦予正確的面值及花色void ShowDeck();/依次逐張顯示這副牌void DeckShuff(int);/洗牌,其參數(shù)是洗牌的次數(shù)void Remove_Card();/將刪除的那張撲克牌的內(nèi)容清零,使這張牌在屏幕上顯示不出來friend class PerDeck; /定義類PerDeck為類Deck的友元類;class PerDeckPlaying_Card m_Card20; /最多有20張牌int nNum; /實際張數(shù)public:PerDeck()void MakeperDeck(Deck &,int);

9、 /對象初始化,參數(shù)為指定的那副牌及實際賦值個數(shù)void Show(); /顯示void SortFace(); /按面值排序void SortSuit(); /按花色排序int Delete(int n); /刪除序號為n的那一張;void PerDeck:MakeperDeck(Deck & deck_3,int n)nNum=n; /初始化當(dāng)前對象的實際張數(shù)static int i=0; /標(biāo)記為每個人發(fā)牌的其始位置for(int k=0;knNum;k+)m_Cardk=deck_3.m_cardarrayi+k; /用創(chuàng)建好的那副牌為當(dāng)前對象發(fā)牌i+=nNum; /為一個人發(fā)牌后起始

10、位置向后跳nNum個void PerDeck:Show() /顯示玩家的牌面int j=0;if(nNum=0)cout已無牌!endl; /如果玩家無牌輸出提示信息elsefor(int i=0;inNum;i+)if(j%11=0)cout=nNum)return 0; /判斷是否刪牌elsefor(int i=n;inNum;i+)m_Cardi=m_Cardi+1; /刪除指定的牌 nNum-; /刪除一張牌后將實際張數(shù)減1 return 1;void PerDeck:SortFace() /按面值排序Playing_Card record; /產(chǎn)生一個臨時對象for(int j=0;

11、jnNum-1;j+)for(int i=j+1;im_Cardi.m_Value)record=m_Cardi;m_Cardi=m_Cardj;m_Cardj=record;void PerDeck:SortSuit() /按花色排序Playing_Card record; /產(chǎn)生一個臨時對象for(int j=0;jnNum-1;j+)for(int i=j+1;im_Cardi.m_Suit)record=m_Cardi;m_Cardi=m_Cardj;m_Cardj=record;class PlayDeckPerDeck m_deck4; /一共是四個人玩牌public:PlayDe

12、ck()void PlayCard(Deck &); /用指定的那副牌對四個人分別賦值void Show(); /顯示int DeleteOne(int row,int column); /刪除一張,參數(shù)為第row個人的第column張牌int DeleteAll(int,int,int,int); /刪除一輪,參數(shù)分別代表四個人各刪除哪一張void SortDeckFace(); /對整副牌面值排序 void SortDeckSuit(); /對整副牌花色排序;void PlayDeck:PlayCard(Deck & deck_2) /給四個人發(fā)牌for(int i=0;i2;i+)m_d

13、ecki.MakeperDeck(deck_2,14); /前兩個人發(fā)14張牌for(int j=2;j4;j+)m_deckj.MakeperDeck(deck_2,13); /后兩個人發(fā)13張牌void PlayDeck:Show() /顯示四個玩家的牌for(int i=0;i4;i+)coutendl;cout玩家i+1的牌:;m_decki.Show();coutendlendl;int PlayDeck:DeleteOne(int row,int column) /刪除一張,參數(shù)為第row個人的第column張牌return m_deckrow-1.Delete(column-1)

14、;int PlayDeck:DeleteAll(int a,int b,int c,int d) /刪除一輪,參數(shù)分別代表四個人各刪除哪一張return m_deck0.Delete(a-1)+m_deck1.Delete(b-1)+m_deck2.Delete(c-1)+m_deck3.Delete(d-1);void PlayDeck:SortDeckFace() /將四個人的牌按面值排序m_deck0.SortFace();m_deck1.SortFace();m_deck2.SortFace();m_deck3.SortFace();void PlayDeck:SortDeckSuit

15、() /將四個人的牌按花色排序m_deck0.SortSuit();m_deck1.SortSuit();m_deck2.SortSuit();m_deck3.SortSuit();void Program_Init();/程序初始化,輸出初始化信息int main();void Center_Text(char );/將參數(shù)(字符串)在屏幕上顯示在一行的中間位置void Get_Key(); /接收用戶鍵入的字符void DeckMakeDriver();/*程序的主要算法,內(nèi)部調(diào)用多個函數(shù),包括生成撲克牌,洗牌,刪除,排序等主要操作*/int getRandInt(int min, int

16、 max); /取得在兩參數(shù)間的整型隨機值void prog_close();/暫停程序運行,供用戶查看中間運行結(jié)果int main() srand( (unsigned)time( NULL ) ); /初始化隨機數(shù)種子Program_Init(); /顯示程序初始化提示信息DeckMakeDriver();/調(diào)用程序的主要算法,包含程序的主要操作過程prog_close();/暫停程序運行,供用戶查看運行結(jié)果return 1;Playing_Card:Playing_Card() /撲克牌對象的構(gòu)造函數(shù)int i;for(i=0;i3;)/初始化撲克牌的面值,清零m_Facei= ;i+;

17、m_Suit= ;/初始化撲克牌的花色,清零m_Value=0;void Program_Init() /程序一開始運行的提示信息Center_Text(撲克牌游戲n);coutendlendl;Get_Key();void Get_Key() /從鍵盤接收用戶鍵入的字符coutendl;Center_Text(單擊任意鍵繼續(xù).);getch(); coutendl;void Playing_Card:showcard() /在屏幕上顯示一張撲克牌的面值及花色cout ;coutm_Face; /顯示面值 cout.width(1);cout m_Suit; /顯示花色cout ;void C

18、enter_Text(char ShellText80) /將函數(shù)參數(shù)(字符串)在屏幕上居中顯示int length;int center;length= strlen(ShellText); /取得欲顯示字符串的大小center=(80 - length)/2; /整個屏幕的列數(shù)為80,取得字符串在該行的其始位置for(;center!=0;center-) /在字符串前輸出空格cputs( );cputs(ShellText);void Playing_Card:Card_Make(int num) /*根據(jù)參數(shù)num生成一張撲克牌,num不同,生成的 面值或花色不同*/int i=0;c

19、har j;int face_num=num%13; /撲克牌的面值,從0到12if(num=52)strcpy(m_Face, ); /大王花色賦為Selse if(num=53)strcpy(m_Face, ); /小王花色賦為Belseswitch(face_num)/當(dāng)面值大于10時,用J,Q,K代替,面值為0,用A代替case 0: strcpy(m_Face, A);break;case 9: strcpy(m_Face,10);break;case 10: strcpy(m_Face, J);break;case 11: strcpy(m_Face, Q);break;case

20、12: strcpy(m_Face, K);break;default:j=char(face_num + 49);/其它的面值,用對應(yīng)的ASCII碼表示if(i3)m_Facei= ; i+;m_Facei=j;i+;m_Facei=NULL; break; /撲克牌的花色,分別用紅桃,黑桃,梅花,方塊的ASCII碼替代 if(num 12 & num 25 & num 38 & num = 51)m_Suit=4; /方塊 if(num=52)m_Suit=1; /小王if(num=53)m_Suit=2; /大王if(num=52)m_Value=14; /小王面值賦為14else if

21、(num=53)m_Value=15; /大王面值賦為15else m_Value=face_num + 1; /A的面值實際上用1表示,其余面值依次加1void DeckMakeDriver() /主要程序操作部分,調(diào)用多個函數(shù),完成生成一副牌,洗牌,顯示,刪除等操作Deck deck_1; /生成一副撲克牌對象,內(nèi)有54張牌,此時所有的撲克牌均未賦值PlayDeck man; /產(chǎn)生一局牌deck_1.MakeDeck();/對54張撲克牌賦值deck_1.ShowDeck(); /逐一顯示這54張牌 Get_Key(); /暫停運行,供用戶查看顯示結(jié)果deck_1.DeckShuff(2

22、50);/對生成的這副牌洗牌250次deck_1.ShowDeck(); /逐一顯示這洗好的54張牌Get_Key(); /暫停運行,供用戶查看顯示結(jié)果man.PlayCard(deck_1); /發(fā)牌int Memory=0;for(;)man.Show(); /顯示四個人的牌Center_Text(111撲克牌菜單111n);Center_Text(3 1:刪除一張牌 3n);Center_Text(4 2:刪除一輪牌 4n);Center_Text(5 3:花色排序 5n);Center_Text(6 4:面值排序 6n);Center_Text(1 5:退出程序 1n); coutn;

23、cin.getline(str,30);if(strlen(str)=1)cout輸入錯誤,請重新輸入:endl;goto aa; if(!cin)char str30; cin.clear();cin.getline(str,30);cout輸入錯誤,請重新輸入:endl;goto aa;switch(n) /判斷執(zhí)行的操作case 1: /執(zhí)行刪除一張牌的操作int a,b;char str30;bb:cout請輸入刪除第幾個人的第幾張牌ab; cin.getline(str,30);if(strlen(str)=2)cout輸入錯誤,請重新輸入:endl; goto bb;while(!

24、cin)char str30;cin.clear();cin.getline(str,30);cout輸入錯誤,請重新輸入:endl; goto bb;Memory+=man.DeleteOne(a,b);break;case 2: /執(zhí)行刪除一輪牌的操作int c,d,e,f;char str130;cc: cout請依次輸入刪除四個人的第幾張牌cdef;cin.getline(str1,30);if(strlen(str1)=2)cout輸入錯誤,請重新輸入:endl; goto cc;while(!cin)char str30;cin.clear();cin.getline(str,30

25、);cout輸入錯誤,請重新輸入:endl; goto cc;Memory+=man.DeleteAll(c,d,e,f);break;case 3:man.SortDeckSuit(); /執(zhí)行按花色排序break;case 4:man.SortDeckFace(); /執(zhí)行按面值排序break;case 5:exit(0); /執(zhí)行退出程序default:cout輸入錯誤,請重新輸入:endl;goto aa;system(cls); /清屏if(Memory=54)break; /判斷循環(huán)結(jié)束條件coutendlendl-1)/判斷是否產(chǎn)生完54張牌m_cardarraym_lastde

26、lt.Card_Make(m_lastdelt); /*調(diào)用每張撲克牌的生成函數(shù),依次對每張撲克牌賦值,直到生成完一副撲克牌*/m_lastdelt-;/生成完一張撲克牌后改變生成的參數(shù) void Deck:ShowDeck() /顯示一副撲克牌int index=m_lastdelt + 1; /以該位置為第一張牌,從頭顯示這副撲克牌int newline=0;Center_Text(完整的一副牌);coutendl;while(index=53)if(newline%11=0) coutendl; /每顯示11張輸出一個回車m_cardarrayindex.showcard();/按數(shù)組的

27、順序依次顯示newline+;index+;int getRandInt(int min, int max) /返回兩個參數(shù)之間的一個整型隨機值int numToReturn;numToReturn=rand(); /取得隨機值numToReturn=numToReturn%(max - min + 1) + min; /*將隨機值的范圍調(diào) 整到兩個參數(shù)之間*/ return numToReturn;void Deck:DeckShuff( int times) /洗牌,參數(shù)為洗牌次數(shù)int x, split; /split是分開成兩部分的位置,如上部分、下部分Center_Text(洗牌);

28、coutendl;for(x=0;x=times;x+)/開始循環(huán),每循環(huán)一次將牌全部重排一遍split=getRandInt(20,35);/隨機選取split的值Deck topdeck;/生成兩副撲克牌對象Deck bottomdeck;int i;int bottomdeckindex=1;int topdeckindex=1;for(i=0;im_cardarrayi;topdeckindex+;i+;for(i=(split);im_cardarrayi;bottomdeckindex+;i+;int deckoutindex=0;int numcardstomovetop;int

29、 numcardstomovebottom;int j;int h=0;bottomdeckindex=54 - split;/下部分那副撲克牌的張數(shù)topdeckindex =split;/上部分那副撲克牌的張數(shù)while(deckoutindex = 53)numcardstomovetop=getRandInt(2,7); /從上部分抽取的張數(shù),是2-7之間的隨機數(shù)numcardstomovebottom=getRandInt(2,7);/同樣從下部分抽取的張數(shù),是2-7之間的隨機數(shù)for(j=0;j 0)/當(dāng)下部分那副牌沒有循環(huán)完時繼續(xù)this-m_cardarraydeckoutin

30、dex=bottomdeck.m_cardarraybottomdeckindex;/*從下部分那副牌的最后張數(shù)開始,依次向初始的撲克牌賦值*/deckoutindex+;bottomdeckindex-;for(h=0;h 0) & (deckoutindex m_cardarraydeckoutindex=topdeck.m_cardarraytopdeckindex;deckoutindex+;topdeckindex-;this-m_lastdelt=-1;/將刪除牌的張數(shù)復(fù)原為-1(未刪除)void prog_close() /程序暫停,任按一鍵繼續(xù)coutendlendl;Get_

31、Key();coutendlendl;Deck : Deck()/初始化一副撲克牌,將54張撲克牌均清零int i;for(i=0;i=53;i+)m_cardarray1=Playing_Card(); /構(gòu)造一個臨時對象賦值#include #include#include#include#includeclass fuctions /定義了一個類fuctionsprivate:int milli,bet,money,win,lose,draw,playerturns,cputurns,bett;double card,total,cpu,player; /封裝了函數(shù)的相應(yīng)數(shù)據(jù)public

32、: /將函數(shù)封裝到類中void wait(int ); void pause(); int random(long hi,long lo); void replay(char&ans); void hit(double&,double&); void deal(double&,double&,int&,int&); void BET(int&,int&); void print(int,int,int,int); void rules(); void results(double,double,int,int&,int&,int&,int&); void mima(char&ans,doubl

33、e&,double&); /定義了一個函數(shù)找出高級玩家 void Duzhu(int&,int&); /定義了一個函數(shù)找出總賭注有沒有超出; /資本void fuctions:pause() /定義一個繼續(xù)函數(shù) cout請按任意鍵繼續(xù):endl; /提示下一步 getch(); int fuctions:random(long hi,long lo) /定義了一個函數(shù)隨機發(fā)牌 int ran; srand(unsigned)time(NULL); ran=rand()%(hi-(lo-1)+lo; return(ran);void fuctions:replay(char &ans) /定義了

34、一個輸入字符函數(shù)coutans;void fuctions:hit(double &card,double &total) /一個要牌函數(shù),可進(jìn)行傳值調(diào)用 card=random(13,1);if(card10)card=0.5; /隨機要牌后將大于10的數(shù)重新賦值total=total+card; /計算總點數(shù)void fuctions:deal(double &player,double &cpu,int &playerturns,int &cputurns) double playercard1,playercard2,cpucard1,cpucard2;playerturns=2; /

35、游戲開始先發(fā)兩張牌cputurns=2;playercard1=random(13,1);coutnttt正在洗牌10)playercard1=0.5;if(playercard210)playercard2=0.5;if(cpucard110)cpucard1=0.5;if(cpucard210)cpucard2=0.5; player=playercard1+playercard2; cpu=cpucard1+cpucard2; coutttt你的總數(shù)是:playerendl; coutplayercard1; coutplayercard2endl; coutttt莊家有一張 cpuca

36、rd1endl; coutendl; cout* cpucard1endl; void fuctions:BET(int &bet,int &money) /顯示你的資本和輸入賭注system(cls);coutttt你有 :$moneyendl; /顯示你當(dāng)前的總資本coutbet; if(bet0) bet=bet*-1; money=money-bet; /計算玩家剩余資本while(money0)money=money+bet;coutbet;money=money-bet;void fuctions:print(int win,int lose,int draw,int money)

37、 /顯示總結(jié)局couttttt贏了:win局endl;couttttt輸了:lose局endl;couttttt平了:draw局endl;couttttt總錢為 :money元endl;void fuctions:rules() couttt歡迎進(jìn)入21點游戲endl; cout 這是游戲規(guī)則:endl;cout1:你最多只能有5張牌.endl;cout2:如果你的點數(shù)超出21點或平局,你將失去你的賭注.endl;cout3:如果你贏了你將得到你賭注的兩倍.endl;cout4:如果你是高級玩家在要牌前按程序說明做即可知道下一張牌.endl;cout5:你可以在要牌前再下賭注,請注意你的賭注不能超過你的總資本.endl;couttttt;pause();void fuctions:results(double player,double cpu,int bet,int&money,int&draw,int &win,int&

溫馨提示

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

最新文檔

評論

0/150

提交評論