




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告设计题目:模拟人工洗牌学生姓名:专业: 班级: 学号: 完成日期:2012年7月一:需求和规格说明:(一)题目要求:拟要求编写一个人工洗牌的程序,将洗好的牌分别发给四个人。而且要求用结构card来描述一张牌的花色和数字(suit,num),利用C+的随机函数void srand(unsigned seed)和int rand(void)来模拟人工洗牌的过程,最后将洗好的52张牌按顺序分别发给四个人。而且对每个人的牌要按桥牌的规则输出。即一个人的牌要先按牌的花色(顺序依次为梅花,方块,红心和黑桃)进行分类,同一类牌的内部要再按A,,牌的大小顺序排列。另外发牌应按四个人的顺序依次分发。(二)设计:设计思想:第一:根据题目要求,设置一个结构体card,因为一张牌有花色和数字的不同,所以结构体card包括了suit和num两个成员,其中suit通过取0,1,2,3来分别表示梅花,方块,红心和黑桃四种花色;num取值2-10、J(11)、Q(12)、K(13)、A(14)来表示牌上的数字。因此一张牌可以由suit和num的组合来唯一确定。第二:洗牌(shuffle)。由于洗牌时牌的顺序是随机的,所以用到了void srand(unsigned seed)和int rand(void)函数。通过srand函数设置rand函数所用得到随机数产生算法的种子值来不断改变rand函数的随机数的启动种子值,以产生最佳的随机数。又由于相同的种子后面的rand()函数会出现一样的随机数。所以为了防止随机数每次重复常常使用系统时间来初始化,即使用time函数来获得系统的时间,将time_t型数据转化为(unsigned)型再传给srand函数,即srand((unsigned)time(&t);而在这里所用的则是srand(time(NULL),直接传入一个空指针。用0到51的整数分别对应52张牌 随机产生0到51之间的一个整数,将该整数所对应的那张牌与0对应的那张牌交换,然后随机产生1到51之间的一个整数,重复该过程,每次随机数的最大范围减1,直到洗牌完毕。第三:排序(sort)。排序包括按花色排序和按大小排序 。在按花色排序中,利用sort函数,根据冒泡排序法,从第一张牌开始依次与其后面的牌比较suit的大小,若第一张牌的suit大于后面的,则两者交换,否则继续。同理:在按照大小排序时,按照冒泡排序法,大的值在前,小的在后。而在花色排好之后,只需要在某种花色的内部进行大小排序即可。即函数sortNum().第四:牌的显示(show()。牌的显示包括花色和数字。花色用switch函数分为四种情况分别输出。数字则直接定义一个字符型数组,通过数组nums来表示输出即可。第五:主函数:(1)设置四个数组Au, Bu, Cu, Du来反别表示四个人的牌。然后模拟出52张牌。(2)洗牌。(3)发牌:发牌时是根据memcpy函数随机将牌发给四个人。(4)排序。将牌发好之后再根据排序函数分别对四个人的牌进行花色和大小的排序。(5)输出。即用show函数将牌输出。结束! Struct card int suit ; int num; 系统程序设计结构图:int i ,n ;Card c;void shuffle(Card *card)Srand (time(NULL))int rand(void)memcpy(void *u,void *v,unsigned int n) int i , j ,k ;card t ;void sort (Card*card,int size,CardType stype)memcpy(void*u,void*v,Unsigned int n)int i ;int j=0;int A4=0,0,0,0void sortNum(Card *card)void sort(Card*card,int size,Num)Void show(int suit,int num)switch charnums;switvh suit;属性和类型定义:类名成员类别类型成员名描述Card花色intsuit表示四种花色;当取0,1,2,3是分别表示梅花,方块,红心,黑桃数字intnum表示牌上的数字;取值为:2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13),A(14)类名成员类型类型成员名描述void main()属性const int num一副牌的总数52const int u每个玩家的牌数enumCardType表示一张牌的两个属性(suit,num)int s代表花色(从0到3表示四种花色)intn代表牌上的数字(2-10,J(11),Q(12),K(13),A(14)inti表示牌的数目(0-51)方法voidshuffle洗牌程序voidsort排序程序voidsortNum排序程序voidshow显示牌的花色和数字(三)用户手册 无。(四)调试及测试 程序验证结果如下截图。为说明是随机的发牌,故用三个结果来证明。(五)源代码:#include #include #include #include const int Num = 52;const int u = 13; enum CardType SUIT, NUM; typedef struct int suit; int num; Card;void shuffle(Card *card) int i, n; Card c; srand(time(NULL); for (i = 0; i Num; i+) n = rand() % Num; if (i!= n) memcpy(&c, &cardn, sizeof(Card); /sizeof(Card)=8 memcpy(&cardn, &cardi, sizeof(Card); memcpy(&cardi, &c, sizeof(Card); void sort(Card *card, int size, CardType stype) int i, j, k; Card t; for (i = 0; i size-1; +i) k = i; for (j = i + 1; j cardj.suit) k = j; else if (stype = NUM) & cardk.num cardj.num) k = j; if (k != i) memcpy(&t, &cardi, sizeof(Card); memcpy(&cardi, &cardk, sizeof(Card); memcpy(&cardk, &t, sizeof(Card); void sortNum(Card *card) int A4 = 0, 0, 0, 0; int i; for (i = 0; i =12; i+) +Acardi.suit; int j = 0; for (i = 0; i =3; i+) sort(card + j, Ai,NUM); j =j+ Ai; void show(int suit, int num) static char nums = 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A; switch (suit) case 0: cout 梅花 ; break; case 1: cout 方块 ; break; case 2: cout 红心 ; break; case 3: cout 黑桃 ; break; if (num = 10) cout 10; else cout numsnum-2; cout tt; void main() Card cardNum; Card Au, Bu, Cu, Du; int i, s = 0,n = 2; for (i = 0; i Num; +i) cardi.suit = s; cardi.num = n; +n; if (i+1) % 13 = 0) +s; n= 2; shuffle(card); int j = 0; for (i = 0; i Num; i += 4) memcpy(&Aj, &cardi, sizeof(Card); memcpy(&Bj, &cardi+1, sizeof(Card); memcpy(&Cj, &cardi+2, sizeof(Card); memcpy(&Dj, &cardi+3, sizeof(Card); +j; sort(A, u, SUIT); sortNum(A); sort(B, u, SUIT); sortNum(B); sort(C, u, SUIT); sortNum(C); sort(D, u, SUIT); sortNum(D); cout 人工洗牌游戏 endlendl; cout Player 1 t Player 2 t; cout Player 3 t Player 4 endl; for (i = 0; i u; +i) show(Ai.suit, Ai.num); show(Bi.suit, Bi.num); show(Ci.suit, Ci.num); show(Di.suit, Di.num); cout endl; (六)进一步改进:由于程序中仅仅包含了52张牌,而且不包括大小王。对于实际中的玩牌方式有很多种,我们还可以根据实际的需要添加多种玩牌的方法。在原程序的基础上在加以改进,通过添加其他的函数来完成。让用户在使用时可以根据自己的需要来选择。此外,对于个别函数的应用可能回有更简便的算法,也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 红酒杯知识培训内容课件
- 红酒护肤知识培训班总结课件
- 2025年国产铝锭产品购销合同
- 2025物业管理公司合同管理专员工作分析表(工程类)
- 2025资产管理协议
- 2025市区房屋买卖合同协议书
- 红色课件教学模板
- 2025合作协议种植黄瓜合同书
- 2025年北京市购销合同
- 积极的自述200字9篇范文
- 2025秋人教部编版三年级上册语文教学计划
- 妇产科护理 课件06章-正常产褥期母婴的护理
- 《劳模工匠之光》课件 第1、2单元 民族大厦的基石、改革攻坚的先锋
- 2025年全国企业员工全面质量管理知识竞赛题库及答案
- 基孔肯雅热防控指南专题课件
- 2025年中级钳工技能鉴定考核试题库(附答案)
- 2025秋教科版科学二年级上册教学课件:第一单元第1课 动物的家
- 普通高中生物学课程标准 (2025 年版 2025 年修订 )
- 美的观念(玛丽艳)
- 区委书记在全区惠企政策解读会上的讲话
- 水性烟包镀铝转移胶及直镀纸涂层
评论
0/150
提交评论