C++课程设计_扑克牌21点_第1页
C++课程设计_扑克牌21点_第2页
C++课程设计_扑克牌21点_第3页
C++课程设计_扑克牌21点_第4页
C++课程设计_扑克牌21点_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-一个21点的扑克牌游戏一、课程名称: 扑克牌二、班级和姓名: 某某三、课程设计要求(1) 所有的函数与相应的数据封装到类中,改写主程序使其更加完善。(2) 程序中一共有13张扑克牌可以随机抽取,大于10的点数全部为半点。(3) 庄家永远不会暴庄,庄家可以查看下一张牌,若大于21点,则拒绝。(4) 高级玩家可以查看下一张牌,按H键,然后按要求输入密码,密码正确可以看牌,并决定是否要牌。(5) 每次要牌后可以设定赔率,如果开始是下的10元钱的注,如果牌好,你可以要求再下注,当然不能超过你所有的总钱数。(6) 将界面提示说明改成中文界面,界面的解释详细友好,可以吸引更多玩家四、功能说明:本程序首先

2、编写了一个类,将程序中定义的函数和数据封装到类中。这样不仅满足了设计要求也使整个程序的结构更加一目了然。然后对10以上的牌重新附值为0.5以符合题目要求。接下来设计了防止庄家暴庄的函数,超级玩家看牌的函数,计算累计总赌注的函数。使程序真正完善起来。数据和函数是用类封装在一起的,五、采用的主要数据结构类型 (1)本程序进行了类的封装,编写了一个类来封装所有相关函数和变量,把源程序封装在类中,然后对main主函数进行改写,结构清晰,条理有序,使得修改十分便捷,一目了然。题目要求把抽到的大于10点的牌的点数设为半点。按照要求将随机取下一张牌的成员函数,判断牌的点数是否大于10的if语句中大于10的牌

3、重新赋值为0.5。例:if(playercard110)playercard1=0.5;(2)题目要求庄家永远不会暴庄,庄家取下一张之前先判定取牌后的总点数是否会大于21点,大于的话就拒绝去下一张,小于时就继续取牌,在函数中首先随机产生下一张牌,接着用条件语句判定原有点数与新牌点数之和是否大于21点,然后决定是否取牌。例:if(cpu21) /判断庄家的点数 coutttt庄家要了一张牌。endl; coutttt这牌是:cardendl; /显示牌的点数 coutttt总数是 :cpuendl; /显示庄家的总点数 else cpu=cpu-card; /如果点数超出21点,则不要牌了题目要

4、求超级玩家在输入密码后可以查看下一张牌,只需设计一成员函数,判定玩家是否继续要牌之前加入对玩家是否输入H键的判定,如果有输入则调用为处理玩家输入密码而单独编写的成员函数,在该函数中,首先判定玩家的输入密码是否正确,正确后才可以看下一张牌。例:void fuctions:mima(char &ans,double&card,double&player) /定义一个密码函数 int s1=1234,m1; /定义两个整型并对一个进行赋值coutm1; /输入密码if(s1=m1) /判断密码是否相符coutttt下一张牌是:cardendl; /显示下一张牌else cout密码错误endl; /

5、提示密码错误(3)题目要求玩家可以根据手上的牌决定是否下注,只需设计一成员函数,检查玩家的赌注累计不超过他所拥有的总资。例:void fuctions:Duzhu(int&money,int&bett) /定义一个陪率函数 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 /扑克牌类,表示一张扑克牌的面值、花色和与之相联系的操作private:int m_Value; /扑克的实际面值,用整型值表示,从1开始,113char m_Face3; /扑克的数字大小,用字符串的形式表示,为A,2,3,10,J,Q,Kchar m_Suit ; /扑克的花色(黑、红、梅、方)public:Playin

7、g_Card();/构造函数,初始化扑克对象,实际上是将对象清零void showcard();/显示扑克牌对象的面值,花色void Card_Make(int); /为一张扑克牌对象赋予特定的面值和花色friend class PerDeck; /定义类PerDeck为类Playing_Card的友元类;class Deck /一副扑克(54张)类private:Playing_Card m_cardarray54;/一副扑克由54张扑克牌构成int m_lastdelt; /标记这副扑克牌删除的张数public:Deck();/构造函数,初始化一副扑克牌对象,实际上是将其内的54张扑克牌清

8、零void MakeDeck();/生成一副扑克,即对其内的54张扑克赋予正确的面值及花色void ShowDeck();/依次逐张显示这副牌void DeckShuff(int);/洗牌,其参数是洗牌的次数void Remove_Card();/将删除的那张扑克牌的内容清零,使这张牌在屏幕上显示不出来friend class PerDeck; /定义类PerDeck为类Deck的友元类;class PerDeckPlaying_Card m_Card20; /最多有20张牌int nNum; /实际张数public:PerDeck()void MakeperDeck(Deck &,int);

9、 /对象初始化,参数为指定的那副牌及实际赋值个数void Show(); /显示void SortFace(); /按面值排序void SortSuit(); /按花色排序int Delete(int n); /删除序号为n的那一张;void PerDeck:MakeperDeck(Deck & deck_3,int n)nNum=n; /初始化当前对象的实际张数static int i=0; /标记为每个人发牌的其始位置for(int k=0;knNum;k+)m_Cardk=deck_3.m_cardarrayi+k; /用创建好的那副牌为当前对象发牌i+=nNum; /为一个人发牌后起始

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-; /删除一张牌后将实际张数减1 return 1;void PerDeck:SortFace() /按面值排序Playing_Card record; /产生一个临时对象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; /产生一个临时对象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); /删除一张,参数为第row个人的第column张牌int DeleteAll(int,int,int,int); /删除一轮,参数分别代表四个人各删除哪一张void SortDeckFace(); /对整副牌面值排序 void SortDeckSuit(); /对整副牌花色排序;void PlayDeck:PlayCard(Deck & deck_2) /给四个人发牌for(int i=0;i2;i+)m_d

13、ecki.MakeperDeck(deck_2,14); /前两个人发14张牌for(int j=2;j4;j+)m_deckj.MakeperDeck(deck_2,13); /后两个人发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) /删除一张,参数为第row个人的第column张牌return m_deckrow-1.Delete(column-1)

14、;int PlayDeck:DeleteAll(int a,int b,int c,int d) /删除一轮,参数分别代表四个人各删除哪一张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 );/将参数(字符串)在屏幕上显示在一行的中间位置void Get_Key(); /接收用户键入的字符void DeckMakeDriver();/*程序的主要算法,内部调用多个函数,包括生成扑克牌,洗牌,删除,排序等主要操作*/int getRandInt(int min, int

16、 max); /取得在两参数间的整型随机值void prog_close();/暂停程序运行,供用户查看中间运行结果int main() srand( (unsigned)time( NULL ) ); /初始化随机数种子Program_Init(); /显示程序初始化提示信息DeckMakeDriver();/调用程序的主要算法,包含程序的主要操作过程prog_close();/暂停程序运行,供用户查看运行结果return 1;Playing_Card:Playing_Card() /扑克牌对象的构造函数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(单击任意键继续.);getch(); coutendl;void Playing_Card:showcard() /在屏幕上显示一张扑克牌的面值及花色cout ;coutm_Face; /显示面值 cout.width(1);cout m_Suit; /显示花色cout ;void C

18、enter_Text(char ShellText80) /将函数参数(字符串)在屏幕上居中显示int length;int center;length= strlen(ShellText); /取得欲显示字符串的大小center=(80 - length)/2; /整个屏幕的列数为80,取得字符串在该行的其始位置for(;center!=0;center-) /在字符串前输出空格cputs( );cputs(ShellText);void Playing_Card:Card_Make(int num) /*根据参数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)/当面值大于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);/其它的面值,用对应的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() /主要程序操作部分,调用多个函数,完成生成一副牌,洗牌,显示,删除等操作Deck deck_1; /生成一副扑克牌对象,内有54张牌,此时所有的扑克牌均未赋值PlayDeck man; /产生一局牌deck_1.MakeDeck();/对54张扑克牌赋值deck_1.ShowDeck(); /逐一显示这54张牌 Get_Key(); /暂停运行,供用户查看显示结果deck_1.DeckShuff(2

22、50);/对生成的这副牌洗牌250次deck_1.ShowDeck(); /逐一显示这洗好的54张牌Get_Key(); /暂停运行,供用户查看显示结果man.PlayCard(deck_1); /发牌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) /判断执行的操作case 1: /执行删除一张牌的操作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: /执行删除一轮牌的操作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(); /执行按花色排序break;case 4:man.SortDeckFace(); /执行按面值排序break;case 5:exit(0); /执行退出程序default:cout输入错误,请重新输入:endl;goto aa;system(cls); /清屏if(Memory=54)break; /判断循环结束条件coutendlendl-1)/判断是否产生完54张牌m_cardarraym_lastde

26、lt.Card_Make(m_lastdelt); /*调用每张扑克牌的生成函数,依次对每张扑克牌赋值,直到生成完一副扑克牌*/m_lastdelt-;/生成完一张扑克牌后改变生成的参数 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();/按数组的

27、顺序依次显示newline+;index+;int getRandInt(int min, int max) /返回两个参数之间的一个整型随机值int numToReturn;numToReturn=rand(); /取得随机值numToReturn=numToReturn%(max - min + 1) + min; /*将随机值的范围调 整到两个参数之间*/ return numToReturn;void Deck:DeckShuff( int times) /洗牌,参数为洗牌次数int x, split; /split是分开成两部分的位置,如上部分、下部分Center_Text(洗牌);

28、coutendl;for(x=0;x=times;x+)/开始循环,每循环一次将牌全部重排一遍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;/下部分那副扑克牌的张数topdeckindex =split;/上部分那副扑克牌的张数while(deckoutindex = 53)numcardstomovetop=getRandInt(2,7); /从上部分抽取的张数,是2-7之间的随机数numcardstomovebottom=getRandInt(2,7);/同样从下部分抽取的张数,是2-7之间的随机数for(j=0;j 0)/当下部分那副牌没有循环完时继续this-m_cardarraydeckoutin

30、dex=bottomdeck.m_cardarraybottomdeckindex;/*从下部分那副牌的最后张数开始,依次向初始的扑克牌赋值*/deckoutindex+;bottomdeckindex-;for(h=0;h 0) & (deckoutindex m_cardarraydeckoutindex=topdeck.m_cardarraytopdeckindex;deckoutindex+;topdeckindex-;this-m_lastdelt=-1;/将删除牌的张数复原为-1(未删除)void prog_close() /程序暂停,任按一键继续coutendlendl;Get_

31、Key();coutendlendl;Deck : Deck()/初始化一副扑克牌,将54张扑克牌均清零int i;for(i=0;i=53;i+)m_cardarray1=Playing_Card(); /构造一个临时对象赋值#include #include#include#include#includeclass fuctions /定义了一个类fuctionsprivate:int milli,bet,money,win,lose,draw,playerturns,cputurns,bett;double card,total,cpu,player; /封装了函数的相应数据public

32、: /将函数封装到类中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&); /定义了一个函数找出高级玩家 void Duzhu(int&,int&); /定义了一个函数找出总赌注有没有超出; /资本void fuctions:pause() /定义一个继续函数 cout请按任意键继续:endl; /提示下一步 getch(); int fuctions:random(long hi,long lo) /定义了一个函数随机发牌 int ran; srand(unsigned)time(NULL); ran=rand()%(hi-(lo-1)+lo; return(ran);void fuctions:replay(char &ans) /定义了

34、一个输入字符函数coutans;void fuctions:hit(double &card,double &total) /一个要牌函数,可进行传值调用 card=random(13,1);if(card10)card=0.5; /随机要牌后将大于10的数重新赋值total=total+card; /计算总点数void fuctions:deal(double &player,double &cpu,int &playerturns,int &cputurns) double playercard1,playercard2,cpucard1,cpucard2;playerturns=2; /

35、游戏开始先发两张牌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你的总数是:playerendl; coutplayercard1; coutplayercard2endl; coutttt庄家有一张 cpuca

36、rd1endl; coutendl; cout* cpucard1endl; void fuctions:BET(int &bet,int &money) /显示你的资本和输入赌注system(cls);coutttt你有 :$moneyendl; /显示你当前的总资本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、 /显示总结局couttttt赢了:win局endl;couttttt输了:lose局endl;couttttt平了:draw局endl;couttttt总钱为 :money元endl;void fuctions:rules() couttt欢迎进入21点游戏endl; cout 这是游戏规则:endl;cout1:你最多只能有5张牌.endl;cout2:如果你的点数超出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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论