C++课程设计扑克牌21点.docx
- 文档编号:6257627
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:27
- 大小:28.17KB
C++课程设计扑克牌21点.docx
《C++课程设计扑克牌21点.docx》由会员分享,可在线阅读,更多相关《C++课程设计扑克牌21点.docx(27页珍藏版)》请在冰豆网上搜索。
C++课程设计扑克牌21点
-----------一个21点的扑克牌游戏
一、课程名称:
扑克牌
二、班级和姓名:
某某
三、课程设计要求
(1)所有的函数与相应的数据封装到类中,改写主程序使其更加完善。
(2)程序中一共有13张扑克牌可以随机抽取,大于10的点数全部为半点。
(3)庄家永远不会暴庄,庄家可以查看下一张牌,若大于21点,则拒绝。
(4)高级玩家可以查看下一张牌,按H键,然后按要求输入密码,密码正确可以看牌,并决定是否要牌。
(5)每次要牌后可以设定赔率,如果开始是下的10元钱的注,如果牌好,你可以要求再下注,当然不能超过你所有的总钱数。
(6)将界面提示说明改成中文界面,界面的解释详细友好,可以吸引更多玩家
四、功能说明:
本程序首先编写了一个类,将程序中定义的函数和数据封装到类中。
这样不仅满足了设计要求也使整个程序的结构更加一目了然。
然后对10以上的牌重新附值为0.5以符合题目要求。
接下来设计了防止庄家暴庄的函数,超级玩家看牌的函数,计算累计总赌注的函数。
使程序真正完善起来。
数据和函数是用类封装在一起的,
五、采用的主要数据结构类型
(1)本程序进行了类的封装,编写了一个类来封装所有相关函数和变量,把源程序封装在类中,然后对main主函数进行改写,结构清晰,条理有序,使得修改十分便捷,一目了然。
题目要求把抽到的大于10点的牌的点数设为半点。
按照要求将随机取下一张牌的成员函数,判断牌的点数是否大于10的if语句中大于10的牌重新赋值为0.5。
例:
if(playercard1>10)
{
playercard1=0.5;
}
(2)题目要求庄家永远不会暴庄,庄家取下一张之前先判定取牌后的总点数是否会大于21点,大于的话就拒绝去下一张,小于时就继续取牌,在函数中首先随机产生下一张牌,接着用条件语句判定原有点数与新牌点数之和是否大于21点,然后决定是否取牌。
例:
if(cpu<21)//判断庄家的点数
{
cout<<"\t\t\t庄家要了一张牌。
"< cout<<"\t\t\t这牌是: "< cout<<"\t\t\t总数是: "< } elsecpu=cpu-card;//如果点数超出21点,则不要牌了 } 题目要求超级玩家在输入密码后可以查看下一张牌,只需设计一成员函数,判定玩家是否继续要牌之前加入对玩家是否输入H键的判定,如果有输入则调用为处理玩家输入密码而单独编写的成员函数,在该函数中,首先判定玩家的输入密码是否正确,正确后才可以看下一张牌。 例: voidfuctions: : mima(char&ans,double&card,double&player)//定义一个密码函数 { ints1=1234,m1;//定义两个整型并对一个进行赋值 cout<<"请输入密码(四位数字): ";//提示输入密码 cin>>m1;//输入密码 if(s1==m1)//判断密码是否相符 { cout<<"\t\t\t下一张牌是: "< } elsecout<<"密码错误"< } (3)题目要求玩家可以根据手上的牌决定是否下注,只需设计一成员函数,检查玩家的赌注累计不超过他所拥有的总资。 例: voidfuctions: : Duzhu(int&money,int&bett)//定义一个陪率函数 { charans; bett=0;//将0赋值给赌注 cout<<"你还要下注吗? (是'Y'/否'N'): ";//提示玩家是否还要下注 cin>>ans; if((ans=='y')||(ans=='Y'))//判断玩家是否还要下注 { cout<<"请输入你的赌注: ";//提示玩家输入赌注 cin>>bett; money=money-bett;//计算出剩余的总资本 } while(money<0)//如果资本小于0,则赌注超过了资本 {//提示玩家错了和要求重新输入 money=money+bett;//重新计算总资本 cout<<"你不能下这么多的赌注! "< cout<<"请重新下注: ";//提示重新下注 cin>>bett; money=money-bett;//计算总资本 } } 源程序: #include #include #include #include #include #include classPlaying_Card//扑克牌类,表示一张扑克牌的面值、花色和与之相联系的操作 { private: intm_Value;//扑克的实际面值,用整型值表示,从1开始,1~13 charm_Face[3];//扑克的数字大小,用字符串的形式表示,为A,2,3,…,10,J,Q,K charm_Suit;//扑克的花色(黑、红、梅、方) public: Playing_Card();//构造函数,初始化扑克对象,实际上是将对象清零 voidshowcard();//显示扑克牌对象的面值,花色 voidCard_Make(int);//为一张扑克牌对象赋予特定的面值和花色 friendclassPerDeck;//定义类PerDeck为类Playing_Card的友元类 }; classDeck//一副扑克(54张)类 { private: Playing_Cardm_cardarray[54];//一副扑克由54张扑克牌构成 intm_lastdelt;//标记这副扑克牌删除的张数 public: Deck();//构造函数,初始化一副扑克牌对象,实际上是将其内的54张扑克牌清零 voidMakeDeck();//生成一副扑克,即对其内的54张扑克赋予正确的面值及花色 voidShowDeck();//依次逐张显示这副牌 voidDeckShuff(int);//洗牌,其参数是洗牌的次数 voidRemove_Card();//将删除的那张扑克牌的内容清零,使这张牌在屏幕上显示不出来 friendclassPerDeck;//定义类PerDeck为类Deck的友元类 }; classPerDeck { Playing_Cardm_Card[20];//最多有20张牌 intnNum;//实际张数 public: PerDeck(){} voidMakeperDeck(Deck&,int);//对象初始化,参数为指定的那副牌及实际赋值个数 voidShow();//显示 voidSortFace();//按面值排序 voidSortSuit();//按花色排序 intDelete(intn);//删除序号为n的那一张 }; voidPerDeck: : MakeperDeck(Deck&deck_3,intn) { nNum=n;//初始化当前对象的实际张数 staticinti=0;//标记为每个人发牌的其始位置 for(intk=0;k i+=nNum;//为一个人发牌后起始位置向后跳nNum个 } voidPerDeck: : Show()//显示玩家的牌面 { intj=0; if(nNum==0)cout<<"已无牌! "< else { for(inti=0;i { if(j%11==0)cout< m_Card[i].showcard(); j++; } } } intPerDeck: : Delete(intn) { if(n>=nNum)return0;//判断是否删牌 else { for(inti=n;i nNum--;//删除一张牌后将实际张数减1 return1; } } voidPerDeck: : SortFace()//按面值排序 { Playing_Cardrecord;//产生一个临时对象 for(intj=0;j for(inti=j+1;i if(m_Card[j].m_Value>m_Card[i].m_Value) {record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;} } voidPerDeck: : SortSuit()//按花色排序 { Playing_Cardrecord;//产生一个临时对象 for(intj=0;j for(inti=j+1;i if(m_Card[j].m_Suit>m_Card[i].m_Suit) {record=m_Card[i];m_Card[i]=m_Card[j];m_Card[j]=record;} } classPlayDeck { PerDeckm_deck[4];//一共是四个人玩牌 public: PlayDeck(){} voidPlayCard(Deck&);//用指定的那副牌对四个人分别赋值 voidShow();//显示 intDeleteOne(introw,intcolumn);//删除一张,参数为第row个人的第column张牌 intDeleteAll(int,int,int,int);//删除一轮,参数分别代表四个人各删除哪一张 voidSortDeckFace();//对整副牌面值排序 voidSortDeckSuit();//对整副牌花色排序 }; voidPlayDeck: : PlayCard(Deck&deck_2)//给四个人发牌 { for(inti=0;i<2;i++)m_deck[i].MakeperDeck(deck_2,14);//前两个人发14张牌 for(intj=2;j<4;j++)m_deck[j].MakeperDeck(deck_2,13);//后两个人发13张牌 } voidPlayDeck: : Show()//显示四个玩家的牌 { for(inti=0;i<4;i++) { cout< cout<<"玩家"< "; m_deck[i].Show(); } cout< } intPlayDeck: : DeleteOne(introw,intcolumn)//删除一张,参数为第row个人的第column张牌 {returnm_deck[row-1].Delete(column-1);} intPlayDeck: : DeleteAll(inta,intb,intc,intd)//删除一轮,参数分别代表四个人各删除哪一张 {returnm_deck[0].Delete(a-1)+m_deck[1].Delete(b-1)+m_deck[2].Delete(c-1)+m_deck[3].Delete(d-1);} voidPlayDeck: : SortDeckFace()//将四个人的牌按面值排序 { m_deck[0].SortFace(); m_deck[1].SortFace(); m_deck[2].SortFace(); m_deck[3].SortFace(); } voidPlayDeck: : SortDeckSuit()//将四个人的牌按花色排序 { m_deck[0].SortSuit(); m_deck[1].SortSuit(); m_deck[2].SortSuit(); m_deck[3].SortSuit(); } voidProgram_Init();//程序初始化,输出初始化信息 intmain(); voidCenter_Text(char[]);//将参数(字符串)在屏幕上显示在一行的中间位置 voidGet_Key();//接收用户键入的字符 voidDeckMakeDriver();/*程序的主要算法,内部调用多个函数,包括生成扑克牌, 洗牌,删除,排序等主要操作*/ intgetRandInt(intmin,intmax);//取得在两参数间的整型随机值 voidprog_close();//暂停程序运行,供用户查看中间运行结果 intmain() { srand((unsigned)time(NULL));//初始化随机数种子 Program_Init();//显示程序初始化提示信息 DeckMakeDriver();//调用程序的主要算法,包含程序的主要操作过程 prog_close();//暂停程序运行,供用户查看运行结果 return1; } Playing_Card: : Playing_Card()//扑克牌对象的构造函数 { inti; for(i=0;i<3;)//初始化扑克牌的面值,清零 { m_Face[i]=''; i++; } m_Suit='';//初始化扑克牌的花色,清零 m_Value=0; } voidProgram_Init()//程序一开始运行的提示信息 { Center_Text("扑克牌游戏\n"); cout< Get_Key(); } voidGet_Key()//从键盘接收用户键入的字符 { cout< Center_Text("单击任意键继续..."); getch(); cout< } voidPlaying_Card: : showcard()//在屏幕上显示一张扑克牌的面值及花色 { cout<<""; cout< cout.width (1); cout< cout<<""; } voidCenter_Text(charShellText[80])//将函数参数(字符串)在屏幕上居中显示 { intlength; intcenter; length=strlen(ShellText);//取得欲显示字符串的大小 center=(80-length)/2;//整个屏幕的列数为80,取得字符串在该行的其始位置 for(;center! =0;center--)//在字符串前输出空格 { cputs(""); } cputs(ShellText); } voidPlaying_Card: : Card_Make(intnum)/*根据参数num生成一张扑克牌,num不同,生成的 面值或花色不同*/ { inti=0; charj; intface_num=num%13;//扑克牌的面值,从0到12 if(num==52)strcpy(m_Face,"");//大王花色赋为S elseif(num==53)strcpy(m_Face,"");//小王花色赋为B else { switch(face_num)//当面值大于10时,用J,Q,K代替,面值为0,用A代替 { case0: strcpy(m_Face,"A");break; case9: strcpy(m_Face,"10");break; case10: strcpy(m_Face,"J");break; case11: strcpy(m_Face,"Q");break; case12: strcpy(m_Face,"K");break; default: j=char(face_num+49);//其它的面值,用对应的ASCII码表示 if(i<3) { m_Face[i]='';i++; m_Face[i]=j;i++; m_Face[i]=NULL; break; } } } //扑克牌的花色,分别用红桃,黑桃,梅花,方块的ASCII码替代 if(num<=12)m_Suit=6;//红桃 if(num>12&&num<=25)m_Suit=3;//黑桃 if(num>25&&num<=38)m_Suit=5;//梅花 if(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;//小王面值赋为14 elseif(num==53)m_Value=15;//大王面值赋为15 elsem_Value=face_num+1;//A的面值实际上用1表示,其余面值依次加1 } voidDeckMakeDriver()//主要程序操作部分,调用多个函数,完成生成一副牌,洗牌,显示,删除等操作 { Deckdeck_1;//生成一副扑克牌对象,内有54张牌,此时所有的扑克牌均未赋值 PlayDeckman;//产生一局牌 deck_1.MakeDeck();//对54张扑克牌赋值 deck_1.ShowDeck();//逐一显示这54张牌 Get_Key();//暂停运行,供用户查看显示结果 deck_1.DeckShuff(250);//对生成的这副牌洗牌250次 deck_1.ShowDeck();//逐一显示这洗好的54张牌 Get_Key();//暂停运行,供用户查看显示结果 man.PlayCard(deck_1);//发牌 intMemory=0; for(;;) { man.Show();//显示四个人的牌 Center_Text("\1\1\1扑克牌菜单\1\1\1\n"); Center_Text("\31: 删除一张牌\3\n"); Center_Text("\42: 删除一轮牌\4\n"); Center_Text("\53: 花色排序\5\n"); Center_Text("\64: 面值排序\6\n"); Center_Text("\15: 退出程序\1\n"); cout<<"请选择: \n"; intn; charstr[30]; aa: cin>>n; cin.getline(str,30); if(strlen(str)>=1) { cout<<"输入错误,请重新输入: "< gotoaa; } if(! cin) { charstr[30]; cin.clear(); cin.getline(str,30); cout<<"输入错误,请重新输入: "< gotoaa; } switch(n)//判断执行的操作 { case1: //执行删除一张牌的操作 inta,b; charstr[30]; bb: cout<<"请输入删除第几个人的第几张牌"< cin>>a>>b; cin.getline(str,30); if(strlen(str)>=2) { cout<<"输入错误,请重新输入: "< gotobb; } while(! cin) { charstr[30]; cin.clear(); cin.getline(str,30); cout<<"输入错误,请重新输入: "< gotobb; } Memory+=man.DeleteOne(a,b); break; case2: //执行删除一轮牌的操作 intc,d,e,f; charstr1[30]; cc: cout<<"请依次输入删除四个人的第几张牌"< cin>>c>>d>>e>>f; cin.getline(str1,30); if(strlen(str1)>=2) { cout<<"输入错误,请重新输入: "< gotocc; } while(! cin) { charstr[30]; cin.clear(); cin.getline(str,30); cout<<"输入错误,请重新输入: "< gotocc; } Memory+=man.DeleteAll(c,d,e,f); break; case3: man.SortDeckSuit();//执行按花色排序 break; case 4: man.SortDeckFace();//执行按面值排序 break; case5: exit(0);//执行退出程序 default: cout<<"输入错误,请重新输入: "< gotoaa; } system("cls");//清屏 if(Memory==54)break;//判断循环结束条件 } cout< } v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 扑克牌 21