版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual C+课程设计报告VC+课程设计报告(扑克牌游戏 难度等级:A)程序设计者:指导教师:1 课程设计的解答说明创建一副扑克,并完成洗牌、发牌、显示、花色排序、面值排序、删除一张牌、删除一轮牌等操作。本程序新建了PerDeck和PlayDeck两个类,类PerDeck表示某个人拿的牌,类PlayDeck表示四个人玩牌的过程,对原程序的修改较小。程序中用到了包含在头文件stdlib.h中的函数srand(),用来初始化随机数种子,以使每次执行程序时函数rand()产生不同的随机数,从而使程序每次产生不同的运行结果,用到了包含在头文件time.h中的函数time(),用到了包含在头文件co
2、nio.h中的函数getch()用来接收用户从键盘键入的任意键,以起到暂停程序供用户查看运行结果的作用,还用到了包含在头文件stdlib.h中的函数system(),其参数为字符串,字符串cls代表清屏操作。2 课程设计的任务分解为了完成要求(1)增加大小王,须将类Deck中的成员数据m_cardarray由52增加到54,用来创建一副包含大小王在内54张牌的扑克,并在创建扑克时为大小王重新赋值,如果num=52,则这张牌为小王并将这张牌的花色赋为1,面值赋为S,实际面值赋为14。如果num=53,则这张牌为大王并将这张牌的花色赋为2,面值赋为B,实际面值赋为15。为了完成要求(2)删去一张牌
3、后显示余牌,需先定义int DeleteAll(int,int,int,int)、int DeleteOne(int,int)、int Delete(int)和void PerDeck:Show()、void PlayDeck:Show()函数,并在程序执行期间调用int DeleteAll(int,int,int,int)、int DeleteOne(int,int)、int Delete(int)函数后调用void PerDeck:Show()、void PlayDeck:Show()函数。为了完成要求(3)显示一副扑克,需在原来的基础上把函数ShowDeck()改成显示54张牌,洗牌函数
4、也应改成对54张牌进行洗牌,用函数void PlayCard(Deck & )来给玩家发牌,并调用函数void PerDeck:Show()、void PlayDeck:Show()显示玩家牌面。3 课程设计的新增函数void PerDeck:MakeperDeck(Deck & ,int)函数用来给每个玩家发牌,给第一个玩家和第二个玩家发14张牌,第三和第四个玩家发13张牌,其整型参数是发给玩家牌的张数,另一个引用参数是洗好的那副牌的对象,用来给玩家发牌。void PerDeck:Show() 函数用来显示当前玩家手中的牌。int PerDeck:Delete(int)函数用
5、来删除一张牌void PerDeck:SortFace()函数用来把玩家手中的牌进行面值排序void PerDeck:SortSuit()函数用来把玩家手中的牌进行花色排序PerDeck:PerDeck()类PerDeck的构造函数void PlayDeck:PlayCard(Deck & )函数用来调用函数 MakeperDeck(Deck & ,int)给玩家发牌,参数为洗好的那副牌的对象的引用。void PlayDeck:Show()用来显示四个玩家手中的牌。int PlayDeck:DeleteAll(int,int,int,int)用来删除一轮牌,参数分别为四个玩家的
6、第几张牌。int PlayDeck:DeleteOne(int,int)用来删除一张牌,参数分别为第几个玩家的第几张牌。void PlayDeck:SortDeckFace()完成对四个玩家手中的牌按面值排序。void PlayDeck:SortDeckSuit()完成对四个玩家手中的牌按花色排序。PlayDeck:PlayDeck()类PlayDeck的构造函数4 课程设计的源代码实现及详细注解#include <iostream.h>#include <string.h>#include <conio.h>#include <stdlib.h>
7、;#include <stdio.h>#include <time.h>class Playing_Card /*扑克牌类,表示一张扑克牌的面值、花色和与之相联系的操作*/private:int m_Value; /扑克的实际面值,用整型值表示,从1开始,113char m_Face3; /*扑克的数字大小,用字符串的形式表示,为A,2,3,10,J,Q,K*/char m_Suit ; /扑克的花色(黑、红、梅、方)public:Playing_Card();/构造函数,初始化扑克对象,实际上是将对象清零void showcard();/显示扑克牌对象的面值,花色vo
8、id Card_Make(int); /为一张扑克牌对象赋予特定的面值和花色friend class PerDeck; /定义类PerDeck为类Playing_Card的友元类;class Deck /一副扑克(54张)类private:Playing_Card m_cardarray54;/一副扑克由54张扑克牌构成int m_lastdelt; /标记这副扑克牌删除的张数public:Deck(); /*构造函数,初始化一副扑克牌对象,实际上是将其内的54张扑克牌清零*/void MakeDeck(); /*生成一副扑克,即对其内的54张扑克赋予正确的面值及花色*/void ShowDe
9、ck();/依次逐张显示这副牌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); /*对象初始化,参数为指定的那副牌及实际赋值个数*/void Show(); /显示void S
10、ortFace(); /按面值排序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;k<nNum;k+)m_Cardk=deck_3.m_cardarrayi+k;/用创建好的那副牌为当前对象发牌i+=nNum; /为一个人发牌后起始位置向后跳nNum个void PerDeck:Show() /显示玩家的牌面i
11、nt j=0;if(nNum=0)cout<<"已无牌!"<<endl; /如果玩家无牌输出提示信息elsefor(int i=0;i<nNum;i+)if(j%11=0)cout<<endl; /每行输出11张牌m_Cardi.showcard(); j+;int PerDeck:Delete(int n)if(n>=nNum)return 0; /判断是否删牌elsefor(int i=n;i<nNum;i+)m_Cardi=m_Cardi+1; /删除指定的牌 nNum-; /删除一张牌后将实际张数减1 retur
12、n 1;void PerDeck:SortFace() /按面值排序Playing_Card record; /产生一个临时对象for(int j=0;j<nNum-1;j+)for(int i=j+1;i<nNum;i+)if(m_Cardj.m_Value>m_Cardi.m_Value)record=m_Cardi;m_Cardi=m_Cardj;m_Cardj=record;void PerDeck:SortSuit() /按花色排序Playing_Card record; /产生一个临时对象for(int j=0;j<nNum-1;j+)for(int i=j
13、+1;i<nNum;i+)if(m_Cardj.m_Suit>m_Cardi.m_Suit)record=m_Cardi;m_Cardi=m_Cardj;m_Cardj=record;class PlayDeckPerDeck m_deck4; /一共是四个人玩牌public:PlayDeck()void PlayCard(Deck &); /用指定的那副牌对四个人分别赋值void Show(); /显示int DeleteOne(int row,int column); /*删除一张,参数为第row个人的第column张牌*/int DeleteAll(int,int,i
14、nt,int); /*删除一轮,参数分别代表四个人删除哪一张*/void SortDeckFace(); /对整副牌面值排序 void SortDeckSuit(); /对整副牌花色排序;void PlayDeck:PlayCard(Deck & deck_2) /给四个人发牌for(int i=0;i<2;i+)m_decki.MakeperDeck(deck_2,14);/前两个人发14张牌for(int j=2;j<4;j+)m_deckj.MakeperDeck(deck_2,13); /后两个人发13张牌void PlayDeck:Show() /显示四个玩家的牌
15、for(int i=0;i<4;i+)cout<<endl;cout<<"玩家"<<i+1<<"的牌:"m_decki.Show();cout<<endl<<endl;int PlayDeck:DeleteOne(int row,int column) /*删除一张,参数为第row个人的第column张牌*/return m_deckrow-1.Delete(column-1);int PlayDeck:DeleteAll(int a,int b,int c,int d) /*
16、删除一轮,参数分别代表四个人各删除哪一张*/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() /将四个人的牌按花色排序m_deck0.SortSuit();m_deck1.SortSu
17、it();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 max); /取得在两参数间的整型随机值void prog_close();/暂停程序
18、运行,供用户查看中间运行结果int main() srand( (unsigned)time( NULL ) ); /初始化随机数种子Program_Init(); /显示程序初始化提示信息DeckMakeDriver();/调用程序的主要算法,包含程序的主要操作过程prog_close();/暂停程序运行,供用户查看运行结果return 1;Playing_Card:Playing_Card() /扑克牌对象的构造函数int i;for(i=0;i<3;)/初始化扑克牌的面值,清零m_Facei = ' 'i+;m_Suit = ' '/初始化扑克牌的花
19、色,清零m_Value = 0;void Program_Init() /程序一开始运行的提示信息Center_Text("扑克牌游戏n"); Center_Text("程序设计:");cout << endl << endl;Get_Key();void Get_Key() /从键盘接收用户键入的字符cout<<endl;Center_Text("单击任意键继续.");getch(); cout << endl;void Playing_Card:showcard() /在屏幕上显示一
20、张扑克牌的面值及花色cout << " "cout << m_Face; /显示面值cout.width(1);cout << m_Suit; /显示花色cout << " "void Center_Text(char ShellText80) /*将函数参数(字符串)在屏幕上居中显示*/int length;int center;length= strlen(ShellText); /取得欲显示字符串的大小center = (80 - length)/2; /*整个屏幕的列数为80,取得字符串在该行的其始
21、位置*/for(;center!=0;center-) /在字符串前输出空格cputs(" ");cputs(ShellText);void Playing_Card:Card_Make(int num) /*根据参数num生成一张扑克牌,num不同,生成的面值或花色不同*/int i = 0;char j;int face_num = num % 13; /扑克牌的面值,从0到12if(num=52)strcpy(m_Face," S"); /大王花色赋为Selse if(num=53)strcpy(m_Face," B"); /小
22、王花色赋为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 12: strcpy(m_Face," K");break;default:j = char(face_n
23、um + 49);/其它的面值,用对应的ASCII码表示if(i<3)m_Facei = ' ' i+;m_Facei = j;i+;m_Facei = 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 &
24、lt;= 51)m_Suit = 4; /方块 if(num=52)m_Suit=1; /小王if(num=53)m_Suit=2; /大王if(num=52)m_Value=14; /小王面值赋为14else if(num=53)m_Value=15; /大王面值赋为15else m_Value = face_num + 1; /*A的面值实际上用1表示,其余面值依次加1*/void DeckMakeDriver() /*主要程序操作部分,调用多个函数,完成生成一副牌,洗牌,显示,删除等操作*/Deck deck_1; /*生成一副扑克牌对象,内有54张牌,此时所有的扑克牌均未赋值*/Pla
25、yDeck man; /产生一局牌deck_1.MakeDeck();/对54张扑克牌赋值deck_1.ShowDeck(); /逐一显示这54张牌 Get_Key(); /暂停运行,供用户查看显示结果system("cls"); /清屏deck_1.DeckShuff(250);/对生成的这副牌洗牌250次deck_1.ShowDeck(); /逐一显示这洗好的54张牌Get_Key(); /暂停运行,供用户查看显示结果system("cls"); /清屏man.PlayCard(deck_1); /发牌int Memory=0;for(;)man.S
26、how(); /显示四个人的牌Center_Text("*菜单*n");Center_Text("* 1:删除一张牌 *n");Center_Text("* 2:删除一轮牌 *n");Center_Text("* 3:花色排序 *n");Center_Text("* 4:面值排序 *n");Center_Text("* 5:退出程序 *n");Center_Text("*n"); cout<<"请选择菜单里对应功能的一个整数:n&qu
27、ot;int n;char str30;aa:cin>>n;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
28、:cout<<"请输入删除第几个人的第几张牌"<<endl; cin>>a>>b; cin.getline(str,30);if(strlen(str)>=2)cout<<"输入错误,请重新输入:"<<endl; goto bb;while(!cin)char str30;cin.clear();cin.getline(str,30);cout<<"输入错误,请重新输入:"<<endl; goto bb;Memory+=man.Del
29、eteOne(a,b);break;case 2: /执行删除一轮牌的操作int c,d,e,f;char str130;cc: cout<<"请依次输入删除四个人的第几张牌"<<endl;cin>>c>>d>>e>>f;cin.getline(str1,30);if(strlen(str1)>=2)cout<<"输入错误,请重新输入:"<<endl; goto cc;while(!cin)char str30;cin.clear();cin.getli
30、ne(str,30);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"); /
31、清屏if(Memory=54)break; /判断循环结束条件cout<<endl<<endl<<endl;void Deck:MakeDeck()/对生成的54张牌逐个赋值m_lastdelt = 53;/赋初值,该值作为生成每张扑克牌的参数while(m_lastdelt >-1)/判断是否产生完54张牌m_cardarraym_lastdelt.Card_Make(m_lastdelt); /*调用每张扑克牌的生成函数,依次对每张扑克牌赋值,直到生成完一副扑克牌*/m_lastdelt-;/生成完一张扑克牌后改变生成的参数void Deck:Sh
32、owDeck() /显示一副扑克牌int index = m_lastdelt + 1; /*以该位置为第一张牌,从头显示这副扑克牌*/int newline = 0;Center_Text("完整的一副牌");cout << endl;while(index<=53)if(newline % 11 = 0) cout << endl; /每显示11张输出一个回车m_cardarrayindex.showcard();/按数组的顺序依次显示newline+;index+;int getRandInt(int min, int max) /返回两
33、个参数之间的一个整型随机值int numToReturn;numToReturn = rand(); /取得随机值numToReturn = numToReturn % (max - min + 1) + min; /*将随机值的范围调整到两个参数之间*/ return numToReturn;void Deck:DeckShuff( int times) /洗牌,参数为洗牌次数int x, split; /split是分开成两部分的位置,如上部分、下部分Center_Text("洗牌");cout << endl;for(x=0;x<=times;x+)
34、 /开始循环,每循环一次将牌全部重排一遍split = getRandInt(20,35);/随机选取split的值Deck topdeck;/生成两副扑克牌对象Deck bottomdeck;int i;int bottomdeckindex = 1;int topdeckindex = 1;for(i=0;i<=split - 1;)/*将初始的那副扑克牌的上边部分的张数赋值到新生成的扑克牌对象中*/topdeck.m_cardarraytopdeckindex = this->m_cardarrayi;topdeckindex+;i+;for(i=(split);i< 54;) /*同样将初始那副扑克牌的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 税务干部个人总结
- 2025技术持股合同书模板
- 2024猕猴桃树苗批发与农业废弃物资源化利用合作合同3篇
- 无抵押个人借款合同
- 电力公司弱电布线工程合同
- 餐饮中心租赁合同样本
- 2025赠与合同赠与合同(企业类附义务)
- 饮料生产净化系统建设合同
- 河堤加固水泥搅拌桩工程合同
- 港口航道监理协议
- 专业技术职务聘任表(2017年版) 人才引进 居转户 中级职称 高级职称 技师 上海户口
- GB/T 21835-2008焊接钢管尺寸及单位长度重量
- 消防安全风险辨识清单
- GB 19079.6-2005体育场所开放条件与技术要求第6部分:滑雪场所
- 1超分子化学简介
- 聚酯合成副反应介绍
- DB37-T 1342-2021平原水库工程设计规范
- 电除颤教学课件
- 广东省药品电子交易平台结算门户系统会员操作手册
- DB32T 3960-2020 抗水性自修复稳定土基层施工技术规范
- 大断面隧道设计技术基本原理
评论
0/150
提交评论