编写一段C++单片机程序编写教程,将一副扑克牌随机发给三个玩家,并显示三个玩家手中的牌

用C++编写一个洗牌发牌的函数,玩家可能有两个、三个和四个_百度知道
用C++编写一个洗牌发牌的函数,玩家可能有两个、三个和四个
我有更好的答案
几乎所有的程序员都写过类似于“洗牌”的算法,也就是将一个数组随机打乱后输出,虽然很简单,但是深入研究起来,这个小小的算法也是大有讲究。我在面试程序员的时候,就会经常让他们当场写一个洗牌的函数,从中可以观察到他们对于这个问题的理解和写程序的基本功。
在深入讨论之前,必须先定义出一个基本概念:究竟洗牌算法的本质是什么?也就是说,什么样的洗牌结果是“正确”的?
云风曾经有一篇博文,专门讨论了这个问题,他也给出了一个比较确切的定义,在经过洗牌函数后,如果能够保证每一个数据出现在所有位置的概率是相等的,那么这种算法是符合要求的。在这个前提下,尽量降低时间复杂度和空间复杂度就能得到好的算法。
第一个洗牌算法:随机抽出一张牌,检查这张牌是否被抽取过,如果已经被抽取过,则重新抽取,直到找到没被抽出过的牌,然后把这张牌放入洗好的队列中,重复该过程,直到所有的牌被抽出。
大概是比较符合大脑对于洗牌的直观思维,这个算法经常出现在我遇到的面试结果中,虽然它符合我们对于洗牌算法的基本要求,但这个算法并不好,首先它的复杂度为O(N2),而且需要额外的内存空间保存已经被抽出的牌的索引。所以当数据量比较大时,会极大降低效率。
第二个算法:设牌的张数为n,首先准备n个不容易碰撞的随机数,然后进行排序,通过排序可以得到一个打乱次序的序列,按照这个序列将牌打乱。这也是一个符合要求的算法,但是同样需要额外的存储空间,在复杂度上也会取决于所采用的排序算法,所以仍然不是一个好的算法。
第三个算法:每次随机抽出两张牌交换,重复交换一定次数次后结束void shuffle(int* data, int length){
for(int i=0; i&SWAP_COUNTS; i++)
//Rand(min, max)返回[min, max)区间内的随机数
int index1 = Rand(0, length);
int index2 = Rand(0, length);
std::swap(data[index1], data[index2]);
这又是一个常见的洗牌方法,比较有意思的问题是其中的“交换次数”,我们该如何确定一个合适的交换次数?简单的计算,交换m次后,具体某张牌始终没有被抽到的概率为((n-2)/n)^m,如果我们要求这个概率小于1/1000,那么 m&-3*ln(10)/ln(1-2/n),对于52张牌,这个数大约是176次,需要注意的是,这是满足“具体某张牌”始终没有被抽到的概率,如果需要满足“任意一张牌”没被抽到的概率小于1/1000,需要的次数还要大一些,但这个概率计算起来比较复杂,有兴趣的朋友可以试一下。
Update: 这个概率是,推算过程可以参考这里,根据这个概率,需要交换280次才能符合要求
第四个算法:从第一张牌开始,将每张牌和随机的一张牌进行交换void shuffle(int* data, int length){
for(int i=0; i& i++)
int index = Rand(0, length);
std::swap(data[i], data[index]);
很明显,这个算法是符合我们先前的要求的,时间复杂度为O(N),而且也不需要额外的临时空间,似乎我们找到了最优的算法,然而事实并非如此,看下一个算法。
第五个算法:void shuffle(int* data, int length){
for(int i=1; i& i++)
int index = Rand(0, i);
std::swap(data[i], data[index]);
一个有意思的情况出现了,这个算法和第三种算法非常相似,从直觉来说,似乎使数据“杂乱”的能力还要弱于第三种,但事实上,这种算法要强于第三种。要想严格的证明这一点并不容易,需要一些数学功底,有兴趣的朋友可以参照一下这篇论文,或者matrix67大牛的博文,也可以这样简单理解一下,对于n张牌的数据,实际排列的可能情况为n! 种,但第四种算法能够产生n^n种排列,远远大于实际的排列情况,而且n^n不能被n!整除,所以经过算法四所定义的牌与牌之间的交换程序,很可能一张牌被换来换去又被换回到原来的位置,所以这个算法不是最优的。而算法五输出的可能组合恰好是n!种,所以这个算法才是完美的。
事情并没有结束,如果真的要找一个最优的算法,还是请出最终的冠军吧!
第六个算法:void shuffle(int* data, int length){
std::random_shuffle(data, data+length);}
没错,用c++的标准库函数才是最优方案,事实上,std::random_shuffle在实现上也是采取了第四种方法,看来还是那句话,“不要重复制造轮子”不想写 - -
采纳率:41%
我也是学习“十步天下”算法写的如下代码,希望对你有帮助!#include &iomanip.h&//与#include &iostream&有定义的冲突,这里是为stew()函数提供头文件//#include &iostream&#include &time.h&#include &algorithm&#define NUM 52void reset(int* data,int N){ for (int i=0;i&N;i++) {
data[i]=i+1; }}void prn(int* data,int N){ for (int i=0;i&N;) {
cout&&setw(3)&&data[i++]&&&
if (i%10==0)
} } cout&&}int SWAP_COUNTS=140;//洗牌次数,越大其排序越乱void shuffle3(int* data, int length){
for(int i=0; i&SWAP_COUNTS; i++)
//Rand(min, max)返回[min, max)区间内的随机数
int index1 = rand()%
int index2 = rand()%
std::swap(data[index1], data[index2]);
}}void shuffle2(int* data, int length){
for(int i=1; i& i++)
int index = rand()%i;
std::swap(data[i], data[index]); }}void shuffle1(int* data, int length){
std::random_shuffle(data, data+length); }void main(){ int Data[NUM]; //算法一 cout&&&算法一:&&& reset(Data,NUM); for (int i=0;i#i++) {
shuffle1(Data,i); } prn(Data,NUM); //算法二 cout&&&算法二:&&& reset(Data,NUM); shuffle2(Data,NUM); prn(Data,NUM); //算法三 cout&&&算法三:&&& reset(Data,NUM); shuffle3(Data,NUM); prn(Data,NUM);
//此为算法三的牌分发,可改变上面三种的顺序,这里为最后一个算法的排序分发的 const NUMBER=4;//分牌的人数 const number=NUM/NUMBER;//每个人的牌的张数 int shuffle[NUMBER][number]; for (int j=0;j&NUMBER;j++) {
for (i=0;i&i++)
shuffle[j][i]=Data[i*NUMBER+j];
} } for (j=0;j&NUMBER;j++) {
cout&&&第&&&j+1&&&人的牌为:&&&
for (i=0;i&i++)
cout&&setw(5)&&shuffle[j][i];
#include &stdio.h&#include &stdlib.h&#include &time.h&#define N 10#define M 4#define INVALID -1void xi(int A[N], int nplayer, int player[M][N]){
int n = N;
if(nplayer & 2)
if(nplayer & M)
for(i = 0; i & i ++) {
for(j = 0; j & N; j ++) player[i][j] = INVALID;
while(n & 0){
for(i = 0; i & i ++){
k = rand()%n;
player[i][j] = A[k];
tmp = A[n-1];
A[n-1] = A[k];
if(n == 0) //not divided
}}void show(int nplayer, int player[M][N]){
if(nplayer & M)
for(i = 0; i & i ++){
printf(&player %d: &, i);
for(j = 0; j & N; j++){
if(player[i][j] == INVALID)
printf(& %d&, player[i][j]);
printf(&\n&);
printf(&\n&);}int main(){
int A[N]={1,2,3,4,1,6,7,8,9,0};
int player[M][N];
srand(time(NULL));
xi(A, 2, player);
show(2, player);
xi(A, 3, player);
show(3, player);
xi(A, 4, player);
show(4, player);
return 0;}
为您推荐:
其他类似问题
函数的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。练习题(最新)_文档库
文档库最新最全的文档下载
当前位置: & 练习题(最新)
练习题(最新)
1:控制台提示输入玩家名字,打印出名字的第一个字符2:从控制台输入三个玩家的名字,分别以字符串连接符号和格式化符号连接输出,要求前两个相隔一个制表符显示,第三个换行显示3:用求余和整除操作符完成24小时和12小时之间的转换4:输入年份和月份,输出当月的天数5:从键盘输入三角形的三边长,判断这三边是否能构成三角形,如果可以输出三角形类型和面积6:从控制台输入两个数字和运算符(如:+-*/%),计算出结果7:从键盘输入一个大于2的整数,判断该数是否是素数8:编写一个程序,输入年,月,日。输出是当年的第几天9:找出1-99之间7的倍数或者个位是7或者十位是7的数字,统计其个数并打印出来10:输出99乘法表(要求工整)11:计算1到100之间的自然数之和,奇数之和,偶数之和12:求1+2!+3!+…..+10!的和13:0-9能构成多少个不重复数字的三位奇数,并且统计打印出来14:编写一个程序,求12+22+32+42+….+202的值15:1/1+2/3+3/5+4/7+...+99/197+100/199=?16:找出100-999之间的所有“水仙花数”。所谓水仙花数是指一个三位 数,各位数字的立方和等于该数本身。(如153=13+53+33)并输出这些数字,统计有多少个。并求出这些数字之和。17:输入一个数,判断它是不是回文数。如12321是回文数18:从10到100中随机抽取20个不一样的数据,统计其中素数的数量按升序打印出来19:计算九九乘法表中各行各列的和20:输入矩阵的行和列,要求都大于2。从0-9之间随机生成矩阵数据。求矩阵中的最大二维矩阵,打印出来21:从键盘输入数字N,输出一个菱形图形21:用户输入杨辉三角的行数,以金字塔形状打印出来,要求任意行的数据可以自动整齐排列22:编写一个程序,在0-9之间随机生成100个整数,求出生成每一个数的数量23:输入一个字符串,找出字符串中最长字符相同的字串24:从M个数中找出N个数的所有可能组合25:socket通讯中经常会用到数组自动扩容,实现如下功能,从控制台输入任意多的整数存入到数组中,按Q退出输入数据,并且把数组中数据按升序打印出来26:定义一副扑克牌,洗完牌之后,从中提取三张牌出来。剩下的牌依次分发给三个玩家,随机选择一个玩家为地主,把之前的三张牌分给地主。判断地主手中是否有顺子,如果有请找出来。(2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字 )27:从键盘输入一个数N,表示有N个学生,每个学生的数据包括学号、姓名、英语、数学、物理三门课的成绩,从键盘输入这N个学生数据,打印所有学生课程的平均成绩及平均成
Word文档免费下载:
2017年最新人教版语文一年级下册期末阅读专项练习题(50篇) - 快乐阅读: (一) 在我国青海湖的西部,有一个中外闻名的鸟岛。每年 5 月下旬,一批又一批的候鸟从...最新高三地理-单元练习题(.6) 精品 - 单元练习题 ( 一 ) 一、单项选择题:本大题共 20 小题,每小题 2 分,共 40 分。在每小题给出的四个选项中, ...多变的价格高考题练习(含2015最新)带答案 - 即墨二中政治练习题 学科:政治 编写人:高一政治 审核人:迟永 编号 习题内容:多变的价格练习题 编写时间: 2015-10...中考名著《西游记》阅读练习题(最新整理 精华版 含答案) 一、填空题 1、 《西游记》 ,长篇 章回体神话 小说,是 神话小说 中成就最高、最受喜爱的小说,但这部...一年级下册数学解决问题练习题人教版(2018最新编辑) - 解决问题的练习题(三) 姓名: 一、 我再跳 4 下就 和小红跳的数 量一样了 班级: 我跳了 43 下。 ...2017年生物中考最新练习题(全部都是选择题) - 2017 年生物会考模拟练习题 1.下列关于无性生殖的说法正确的是( A.能保持亲本的优良性状 C.能增强生物对环境的...计量经济学练习题(同学-最新答案整理--供参考)--2015.10 - 计量经济学练习题 一、单项选择(每题 2 分) 1、计量经济学是___C A、统计学 B、数学 ...2017地理新课标测试题(最新) - 2017 地理新课标测试题与参考答案(16 页) 一、填空题(每空 1 分,共 45 分) 1、义务教育地理课程是一门兼有(自然学科)和(...党的十九大测试题及答案(最新) - 党的十九大知识测试题 姓名 分数 量。 一、单选题(共 35 题,每题 2 分) 1、中国共产党第十九次全国代表大会,是在全面...练习题(最新)2015新版PEP四年级英语下册期末测试题(可打印版)_英语_小学教育_教育专区。 文档贡献者 CWBONABA 贡献于 ...扑克牌 - 触屏版 - 阿里云
多人在线扑克游戏源码带服务端完整版,本项目源码是一套网络版的扑克牌项目源码,带服务器端源码,服务器端也是用java做的,打开游戏以后需要配置IP服务器端的IP和端口,服务端默认监听9999端口,客户端ip填写10.0.2.2,端口信息不用管直接点连接就可以连接到电脑上的服务端。项目源码注释比较丰富,可以研究一下里面的算法之类的。搭建这个服务端环境废了我半天劲,不知道是不是我运行的方法不对,打开前两个游戏客户端没有问题,打开第三个就开始直接强制退出。游戏没玩成所以没有截那部分的
importjava.util.ArrayLimportjava.util.Cimportjava.util.HashMimportjava.util.HashSimportjava.util.Limportjava.util.Mimportjava.util.R/***(c)2010华润(集团)有限公司版权所有.保留所有权利.**文件名称:Chains.java*程序说明:*创建日期:Jun18,2010*
经常遇到这个问题,自己做了一下,随机发52张牌,分给4个人,每个人手中的牌是13张无重复,花色S代表黑桃,H代表红桃,D代表方块,C代表梅花。发完牌后4组牌由小到大排序(依数字的大小从1-13)。若有同一数字牌出现则依照S、H、D、C顺序。1.Puke.javapackagepack3;importjava.util.*;publicclassPuke{intpoke[]=newint[52];intpoke_a1[]=newint[13];intpoke_a2[]=newi
最近看到javaEye上有一位仁兄帖出来取扑克牌乱序算法。看过还是有问题,都没有人想到而纠正过来,本想直接回复的,可以已经结帖了。我又最近比较空,所以自己博客里也写写,算是给一些新手和老手一点新的算法思路。packagecom.importjava.util.Eimportjava.util.H/***乱序扑克牌洗牌方法**@authorvirture**/publicclassCards{HashtablehtMember
packagecom.tengfei.lesson06;&&&importjava.util.V&&importjava.util.LinkedL&&importjava.util.R&&importjava.util.ListI&&&publicclassDealCards{&&&
扑克发牌算法是棋牌游戏中常用的基础算法,也是游戏开发人员需要熟悉的基础算法之一。下面介绍一下该算法的一种实现方式。首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下:u红桃按照从小到大依次为:1-13u方块按照从小到大依次为:14-26u黑桃按照从小到大依次为:27-39u梅花按照从小到大依次为:40-52u小王为53,大王为54算法实现如下:u首先按照以上编号规则初始化一个包含108个数字的数组u每次随机从该数组中抽取一个数字,分配给保存玩家数据的数组实现该功能的
前一段时间找实习,腾讯面试中一轮面试官被问到这个题目,我回答了下面解法中的第一种,太搓了,直接遭面试官鄙视了,回来搜了搜,发现一种更好的解法(下面解法中的第二种),今天偶尔发现解法2其实有毛病,于是改进了,有了算法3和算法4.前提:一副扑克牌有54张,因此我们可以一个整型数组array[54]或者map来存储,&A&用0~3,&2&用4~7,&3&用8~11......&K&用48~51,小鬼用5
程序中常常会用到常量值来定义一些相对固定的有实际意义值。比如,你要定义一个扑克牌的类,扑克牌有花色和数字两种属性,然而花色只有红桃(红心)、方块、黑梅、黑桃四种,这时你就可以定义四个常量分别表示这四种花色,这样定义的好处是:每次给花色赋值时只用到常量值的名称就可以,不易出错;如果某一天扑克出现新玩法需增加一个花色,只有增加一个常量值就可以,扩展性强;Java中常量的定义Java中常量的定义,最常见的就是以下形式:publicstaticfinalT[CONSTNAME]=[V
小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:他手里握着一叠扑克牌:A,2,....J,Q,K一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K请你计算一下
趁着过年这段时间,我将算法导论这本书看了一遍,感觉受益匪浅。着这里也根据算法导论中所涉及到的算法用java实现了一遍。第一篇我们就从排序开始,插入排序的原理很简单,就像我们玩扑克牌时一样。如果手里拿的牌比他前一张小,就继续向前比较,知道这张牌比他前面的牌打时候就可以插在他的后面。当然在计算机中我们相应的也需要将对比过的牌向后移一位才可以。这里直接给出算法,相信很多程序员都感觉有些程序比我们的自然语言都要好理解。publicclassSort{publicvoidsort(in
一.概念&&&&&&&基数排序也不是基于比较和元素移位的,又称桶子法;数据结构课本上首先由扑克牌的排序引入,继而引出多关键字比较。&&&&&&&本文是基于计数排序的基数排序,只介绍最低位优先(LeastSignificantDigitFirst),谷歌之发现就几乎没有介绍MSD的,所谓LSD就是从数字的最低位逐个比较,比较的趟数就是最大数
罗大佑有歌云:“无聊的日子总是会写点无聊的歌曲......”,我不是歌手,我是程序员,于是无聊的日子总是会写点无聊的程序。程序不能太大,不然没有时间完成;程序应该有趣,不然就达不到消磨时间的目的;程序应该有那么一点挑战性,不然即使写完了也没有进步。金钩钓鱼游戏是我儿时经常玩的一种扑克牌游戏,规则非常简单,两个玩家,一旦牌发到手里之后,接下来每个人出什么牌基本上已经就定了,玩家没有自己做决策的机会,所以这个游戏很容易用程序自动模拟出来。(一)关于金钩钓鱼游戏基本规则(简化版):
&摘要:A.扑克发牌算法是棋牌游戏中常用的基础算法,也是游戏开发人员需要熟悉的基础算法之一。下面介绍一下该算法的一种实现方式。首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下:u红桃按照从小到大依次为:1-13u方块按照从小到大依次为:14-26u黑桃按照从小到大依次为:27-39u梅花按照从小到大依次为:40-52u小王为53,大王为54算法实现如下:u首先按照以上编号规则初始化一个包含108个数字的数组u每次随机从该数组中抽取一个数字,分配给保存玩家
2012年,哪些开发商的收入最多?AppAnnie整理了2012年全年的收入数据,并以扑克牌的方式展现给各位,作为您的参考。RevenueTop52的开发商,找到你了么?2个中国开发商、11个日本开发商、3个韩国开发商、23个美国开发商......&&&来源:appannie&
前几天在闲逛的时候,突然看到了一个关于扑克牌的题目,感觉还挺有意思,就试着分析了一下并用Python实现了一下。贴出原题:手中一幅扑克牌,假设顺序为ABCDEF,把第一张放到桌面上,第二张挪到最后,第三张放到桌面,第四张挪到最后,一直到所有牌都在桌面BCDEFACDEFBDEFBACEFBD…把最后在桌面上的这副牌给你,求出原始牌的顺序分析一下:1.排序牌面获得原始牌面排序牌面:ACEBFD桌面扑克牌原始扑克牌说明ACEBFD拿出末尾最后一个DACEBFD拿出末尾最后一个F,
现在我们开始一个一个例子学习,把学习到的正则表达式进行综合使用。这个例子使用正则表达式来检查5张扑克牌是否有效,为了显示更好看,先写一个输出函数:def&displaymatch(match):&&&&if&match&is&None:&&&&&&&&return&print(None)&&
&版权所有野比2012原文地址:点击查看作者:NazmiAltun&&下载源代码-148.61KB&下载demo-3.1MB&介绍(图片上的字:方块4,方块J,黑桃2)用机器人配上扑克牌识别系统,就可以在二十一点一类的扑克游戏中扮演荷官或是人类玩家的角色。实现这样的程序同样也是学习计算机视觉和模式识别的好途径。本文涉及到的AForge.NET框架技术有二值化、边缘检测、仿射变换、BLOB处理和模板匹配算法等。需要注意的是,这篇
UITypeEdit“我要红桃”假如,你现在在做一个“扑克”控件,扑克牌有个属性--花色,你想在用户选择花色这个属性后,属性窗口呈现的不仅仅是文字,还有一个小小的花色图标来表示花色,“红桃”就有个小“红桃”图标在前面显示,“黑桃”就有个“黑桃”图标在前面显示,就像你选择其它控件的BackColor时,颜色前还有个小方色块来表示选定的颜色,多体贴人的设计啊。现在,我们就来做这件事:publicclassSqueezer{.publicCardTypesCardType{}}[E
更详细的讲解和代码调试演示过程,请点击链接上一节我们完成了右边扑克牌向左边扑克牌发出冲击波后的动画特效,现在我们接着完成余下的动画效果,接下来左边扑克牌将向右边扑克牌发出冲击波,然后右边扑克牌也要展现颤动效果。在template标签中添加如下代码:我们要增加三个变量:cardAShake,cardBShake,cardCShake,当某个变量的值设定为true时,对应的div元素其class属性会添加上shake,这样的话,他就会像左边的扑克牌一样,产生左右摇摆的颤抖效果。在
&!DOCTYPEhtmlPUBLIC&-//W3C//DTDXHTML1.0Transitional//EN&&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&&htmlxmlns=&http://www.w3.org/1999/xhtml&&&head&&metahttp-equiv=&Conte
@2017 Ailiyun Allright reserver扑克牌加减乘除游戏_C语言中文网
&&C语言辅导班&&&&
&&C++辅导班&&&&
&&算法/数据结构辅导班&&&&
读者QQ交流群:loading...
&&/&&&&/&&
扑克牌加减乘除游戏,是一种集技巧性和运气性于一体的扑克牌游戏。
现实中可以单人玩,也可以不定人数对抗,用若干副扑克牌去掉王即可游戏,推荐用一副牌双人对抗,乐趣无穷。
本程序利用Card类数组模拟扑克牌,定义3个数组分别表示玩家手中的牌,电脑手中的牌和底牌,用srand((unsigned)time(NULL))产生随机数字,将底牌数组中随机的一项从底牌中移动到其他的数组中,模拟从洗好底牌中抓牌。表示出牌。
单人练习模式中,首先记下一个 1到13之间的随机数字,然后玩家抓牌,当手中的牌的点数恰与记下的随机数字相等,或用手中有的任意两张牌,通过加减乘除四则运算可以凑出该随机数字相等的点数,则停止抓牌并将这一张或两张出出去,随即记下一个新的随机数字,开始下一轮,直道手中的全部牌出完,游戏结束。
人机对抗模式中,首先玩家和计算机各分的5张牌,然后比较玩家和计算机手中最小的牌,谁的小谁就打出这张最小的牌,另一方认为自己的牌凑不出这张牌的点数则开始抓牌,直道手中的牌的点数恰与第一个人出的牌相等,或者用手中有的任意两张牌,通过加减乘除四则运算可以凑出第一个人出的牌相等的点数,则停止抓牌并将这一张或两张出出去,然后要求对方以同样的规则,开始下一轮,直道某一方手中的全部牌出完,游戏结束。
电脑的计算能力使得它肯定会以最优的策略出牌,就让我们看看你的运气如何吧!
压缩包下载:
------------------------------以下是程序源码---------------------------------------
//扑克牌加减乘除游戏
#include&iostream&
#include&string&
#include&ctime&
#include&iomanip&
//================================================================================================
class Card
//定义扑克牌Card类
& & //点数
Card() //默认构造方法
& & void creatCard(int i=1) //带参初始化方法
& & & & number=i;
& & & & if(i&=1&&i&=13)
& & & & & & design=3;
& & & & else if(i&=14&&i&=26)
& & & & & & design=4;
& & & & else if(i&=27&&i&=39)
& & & & & & design=5;
& & & & else if(i&=40&&i&=52)&
& & & & & & design=6;
& & void shownumber() //显示牌
& & & & int i=number%13;
& & & & switch(i)
& & & & {&
& & & & & & case 1: cout&&&[&&&design&&&A]&;
& & & & & & & & &
& & & & & & case 2: cout&&&[&&&design&&&2]&;
& & & & & & & & &
& & & & & & case 3: cout&&&[&&&design&&&3]&;
& & & & & & & & &&
& & & & & & case 4: cout&&&[&&&design&&&4]&;
& & & & & & & & &
& & & & & & case 5: cout&&&[&&&design&&&5]&;
& & & & & & & & &
& & & & & & case 6: cout&&&[&&&design&&&6]&;
& & & & & & & & &
& & & & & & case 7: cout&&&[&&&design&&&7]&;
& & & & & & & & &
& & & & & & case 8: cout&&&[&&&design&&&8]&;
& & & & & & & & &
& & & & & & case 9: cout&&&[&&&design&&&9]&;
& & & & & & & & &
& & & & & & case 10:cout&&&[&&&design&&&10]&;
& & & & & & & & &
& & & & & & case 11:cout&&&[&&&design&&&J]&;
& & & & & & & & &
& & & & & & case 12:cout&&&[&&&design&&&Q]&;
& & & & & & & & &
& & & & & & default: cout&&&[&&&design&&&K]&;
& & int getnumber() //得到牌的真实点数
& & & & if(number%13)
& & & & & & return number%13;
& & & & else
& & & & & & return 13;
& & ~Card(){} //析构方法
//================================================================================================
const int CARDS=52; //扑克牌总数
//函数声明
void welcome(); //欢迎界面
void start(Card *rc); //初始化底牌
void siglegame(); //单人游戏欢迎界面
void sigleplay(Card *pc,Card *rc,int& pcn,int& rcn,int want); //单人游戏执行算法
void vsgame(); //对抗游戏欢迎界面
void playerplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want);//对抗时玩家算法
void AIplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want); //对抗时计算机算法
void upminu(); //返回上一级菜单
void gameinfo(); //游戏简介
void maker(); //制作者
void exit(); //退出游戏
//================================================================================================
int main()
srand((unsigned)time(NULL)); //随机种子发生器
& & welcome();&
& & return 0;&
//================================================================================================
void welcome()
//欢迎界面
& & //申请变量接受用户输入
& & cout&&setfill('*')&&setw(47)&&&*&&&
& & cout&&&    欢迎体您验扑克牌加减乘除游戏&&&
& & cout&&setfill('*')&&setw(47)&&&*&&&
& & cout&&& & & & & & (1) 单人练习。&&& //显示菜单
& & cout&&& & & & & & &(2) 人机对抗。&&&
& & cout&&& & & & & & & (3) 游戏介绍。&&&
& & cout&&& & & & & & & &(4) 开发成员。 &&&
& & cout&&& & & & & & & & (5) 退出游戏。&&&
& & while(1) //接受用户输入
cout&&&&&&setfill('=')&&setw(47)&&&=&&&
& & & & cout&&&请选择1|2|3|4|5:&;
& & & & cin&&
& & & & if(choice&=1&&choice&=5) //遇到合法输入时跳出循环
& & & & & &
cout&&setfill('=')&&setw(47)&&&=&&&
& & switch(choice)
& & & & case 1: siglegame(); //跳转到各个函数
& & & & & & &
& & & & case 2: vsgame();&
& & & & & & &
& & & & case 3: gameinfo();
& & & & & & &
& & & & case 4: maker();&
& & & & & & &
& & & & default: exit();&
//================================================================================================
void start(Card *rc)
//初始化底牌
& & for(int i=0;i&CARDS;i++)
rc[i].creatCard(i+1); //循环给52张底牌赋值
void siglegame()
//单人游戏欢迎界面
& & cout&&& & & & & &单人练习模式&&&&
& & cout&&setfill('=')&&setw(47)&&&=&&&
& & Card rc[CARDS]; //底牌数组
& & Card pc[CARDS]; //玩家牌数组
& & int rcn=CARDS; //初始化底牌数
int pcn=0; //初始化玩家牌数
//申请变量接受随机数
& & start(rc); //初始化底牌
& & want=rand()%13+1; //生成1-13的随机数
& & sigleplay(pc,rc,pcn,rcn,want); //调用单人游戏执行算法
//================================================================================================
void sigleplay(Card *pc,Card *rc,int& pcn,int& rcn,int want)
//单人游戏执行算法
& & int choice,p,q,i,j; //申请辅助变量&
& & cout&&&你需要凑的随机点数是 &&&&want&&
& & if(pcn&0) //手中有牌,则显示出来
cout&&&你现有&&&pcn&&&张牌:&&&
for(i=0;i&i++)
pc[i].shownumber();
if((i+1)%5==0) //显示5张牌换一次行
& & & & }&
& & cout&&setfill('=')&&setw(47)&&&=&&&
& & cout&&& & & & & & (1) 出1张牌。&&&
& & cout&&& & & & & & &(2) 出2张牌。&&&
& & cout&&& & & & & & & (3) 抓牌。&&&
& & cout&&& & & & & & & &(4) 玩法提示。&&&
& & cout&&& & & & & & & & (5) 回主界面。&&&
& & cout&&setfill('=')&&setw(47)&&&=&&&
& & while(1) //接受用户输入
& & & & cout&&&请选择1|2|3|4|5:&;
& & & & cin&&
& & & & if(choice&=1&&choice&=5) //遇到合法输入时跳出循环
& & & & & &
cout&&setfill('=')&&setw(47)&&&=&&&
& & if(choice==3) //抓牌算法
if(rcn) //有底牌
int temp=rand()% //产生一个小于底牌数的随机数
pc[pcn]=rc[temp]; //赋给玩家牌
pcn++; //玩家牌数加1
for(int r=r&r++)
rc[r]=rc[r+1]; //从底牌里删掉这张牌
rcn--; //底牌数减1
cout&&&没底牌了。&&&
cout&&setfill('=')&&setw(47)&&&=&&&
sigleplay(pc,rc,pcn,rcn,want); //递归调用
else if(choice==1) //出一张牌算法
& & & & &if(pcn) //手中有牌
& & & & &{&
int flag=1; //定义监视哨
cout&&&请输入出第几张牌:&;
p=pc[i].getnumber();
if(p==want) //满足条件
cout&&&你出了一张牌:&;
pc[i].shownumber();
& & rc[rcn]=pc[i]; //将这张牌插回底牌中
& & & & & & & & &rcn++; //底牌数+1
for(int o=i;o&o++)//从玩家牌里删掉这张牌
pc[o]=pc[o+1]; //玩家牌数-1
& & if(pcn) //没出净
want=rand()%13+1; //产生新的随机数,进入下一轮
sigleplay(pc,rc,pcn,rcn,want);
else //出净了
cout&&&你牌出完了,你赢了!&&&
upminu();&
if(flag) //监视哨没有被改值
cout&&&出牌有误!&&&
else & & & & & //第一次必须先抓牌哦
cout&&&手中没有牌啊,请先抓牌哦!&&&
& & & & &cout&&setfill('=')&&setw(47)&&&=&&&&
& & & & &sigleplay(pc,rc,pcn,rcn,want);
else if(choice==2) //出两张牌算法
& & & & &if(pcn&=2) //手中有2张以上的牌
& & & & &{&
int flag=1;
cout&&&请分别输入2张牌的次序:&;
cin&&i&&j;
if(i!=j) //两张牌可不能是同一张哦
p=pc[i].getnumber();
q=pc[j].getnumber();
& & if(p*q==want||(p%q==0&&p/q==want)||(q%p==0&&q/p==want)||p+q==want||p-q==want||q-p==want)&
{ //满足条件
cout&&&你出2张牌:&;
pc[i].shownumber();
pc[j].shownumber();
rc[rcn]=pc[i]; & //插回底牌
rc[rcn+1]=pc[j];
if(i&j) //如果不是按增序输入则交换牌次序
for(int k=j;k&k++) //删除第2张
pc[k]=pc[k+1];
for(int m=i;m&m++) //删除第1张
pc[m]=pc[m+1];
pcn--; & & & & &
& &if(pcn) //没出净
want=rand()%13+1; //产生新的随机数,进入下一轮
sigleplay(pc,rc,pcn,rcn,want);
else //出净了
cout&&&你牌出完了,你赢了!&&&
if(flag) //监视哨没有被改值
cout&&&出牌有误!&&&
& & & & &else
cout&&&手中没有2张牌啊,请先抓牌哦!&&&
& & & & &cout&&setfill('=')&&setw(47)&&&=&&&&
& & & & &sigleplay(pc,rc,pcn,rcn,want);
else if(choice==4) //玩法提示
cout&&& & &首先记下一个 1到13之间的随机数字,然后玩家&&&&
cout&&&抓牌,当手中的牌的点数恰与记下的随机数字相等,或&&&
cout&&&用手中有的任意两张牌,通过加减乘除四则运算可以&&&&
cout&&&凑出该随机数字相等的点数,则停止抓牌并将这一张&&&
cout&&&或两张出出去,随即记下一个新的随机数字,开始下一&&&
cout&&&轮,直道手中的全部牌出完,游戏结束。&&&
cout&&setfill('=')&&setw(47)&&&=&&&
& & & & sigleplay(pc,rc,pcn,rcn,want);
& & & & welcome();&
//================================================================================================
void vsgame()
//对抗游戏欢迎界面
& & cout&&& & & & & &人机对抗模式:&&&&
& & cout&&setfill('=')&&setw(47)&&&=&&&
& & Card rc[CARDS]; //底牌数组
& & Card pc[CARDS]; //玩家牌数组
& & Card cc[CARDS]; //电脑牌数组
& & int rcn=CARDS; //初始化底牌数
int pcn=0; //初始化玩家牌数
int ccn=0; //初始化计算机牌数
int temp,want,i,pci, //申请辅助变量
int min=13,whofirst=0;&
& & start(rc); //初始化底牌
& & cout&&&您和计算机各抽5张牌决定谁先出:&&&
& & cout&&&您抽到的牌是&;&
& & for(i=0;i&5;i++) //开始的5张牌
temp=rand()%
& & & & pc[i]=rc[temp];
& & & & pc[i].shownumber();&
& & & & pcn++;&
& & & & for(int k=k&k++)
rc[k]=rc[k+1];
cout&&setfill('=')&&setw(47)&&&=&&&
for(i=0;i&5;i++)
temp=rand()%
cc[i]=rc[temp];
for(int k=k&k++)
rc[k]=rc[k+1];
for(i=0;i&5;i++) //寻找最小的牌
if(min&cc[i].getnumber())
min=cc[i].getnumber();
cout&&&计算机最小的牌点数&&&min&&
for(i=0;i&5;i++)
& & & & if(min&pc[i].getnumber())
min=pc[i].getnumber();
whofirst=1; //最小牌在玩家手中,则把whofirst标志置1
cout&&setfill('=')&&setw(47)&&&=&&&
if(whofirst) //最小牌在玩家手中
& & & & cout&&&您拥有最小的牌:&&&
& & & & cout&&&所以您先出一张:&;&
& & & & pc[pci].shownumber();
& & & & cout&&&
& & & & rc[rcn]=pc[pci];&
& & & & rcn++;&
& & & & for(i=i&i++)
pc[i]=pc[i+1];
& & & & pcn--;
AIplay(pc,cc,rc,pcn,ccn,rcn,want);
else //最小牌在计算机手中
cout&&&计算机拥有最小的牌:&&&
& & & & cout&&&所以计算机先出一张:&;
& & & & cc[cci].shownumber();
& & & & cout&&&
& & & & rc[rcn]=cc[cci];
& & & & rcn++;&
& & & & for(i=i&i++)
cc[i]=cc[i+1];
playerplay(pc,cc,rc,pcn,ccn,rcn,want);
//================================================================================================ & &
void AIplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want)
//对抗时计算机算法
cout&&&电脑现有&&&ccn&&&张牌:&&&
//电脑优先考虑出两张牌算法
for(int i=0;i&i++) //循环访问计算机所有的牌
for(int j=i;j&j++)
p=cc[i].getnumber();
& & & & & & q=cc[j].getnumber();
& & & & & & if(p*q==want||(p%q==0&&p/q==want)||(q%p==0&&q/p==want)||p+q==want||p-q==want||q-p==want)&
& & & & & & { //满足条件
& & & & & & & & temp=rand()%2; //电脑随机选一张让玩家凑
temp?want=p:want=q;
& & & & & & & & cout&&&电脑出2张牌:&;
& & & & & & & & cc[i].shownumber();
& & & & & & & & cc[j].shownumber();
& & & & & & & & cout&&&
& & & & & & & & rc[rcn]=cc[i]; //插回底牌
& & & & & & & & rc[rcn+1]=cc[j];
& & & & & & & & rcn+=2;
& & & & & & & & for(int k=j;k&k++) //删除第2张
& & & & & & & & & & cc[k]=cc[k+1];
& & & & & & & & & & ccn--;&
& & & & & & & & for(int m=i;m&m++) //删除第1张
& & & & & & & & & & cc[m]=cc[m+1];
& & & & & & & & & & ccn--;
& & & & & & & & if(ccn) //没出净
& & & & & & & & & & playerplay(pc,cc,rc,pcn,ccn,rcn,want);//进入玩家部分
& & & & & & & & else
& & & & & & & & {
& & cout&&&电脑牌出完了,你输了!&&&
& & & & & & & & }&
& & & & & & &}
& & & & &}
//出一张牌算法
& & & & &for(int n=0;n&n++)
& & & & &{
p=cc[n].getnumber();
& & & & & & &if(p==want)
& & & & & & &{
cout&&&电脑出1张牌:&;
cc[n].shownumber();
rc[rcn]=cc[n]; //插回底牌
rcn++; //底牌数+1
for(int o=n;o&o++) //从电脑牌里删掉这张牌
cc[o]=cc[o+1];
ccn--; //电脑牌数-1
if(ccn) //没出净
playerplay(pc,cc,rc,pcn,ccn,rcn,want);//进入玩家部分
& & & & & & & & & & cout&&&电脑牌出完了,你输了!&&&
& & & & & & &}
cout&&&电脑抓牌,&; //抓牌算法
if(rcn) //有底牌
int temp=rand()% //产生一个小于底牌数的随机数
cc[ccn]=rc[temp]; & & & //赋给电脑牌
ccn++; //电脑牌数+1
for(int r=r&r++)
rc[r]=rc[r+1]; //从底牌里删掉这张牌
rcn--; //底牌数-1
AIplay(pc,cc,rc,pcn,ccn,rcn,want); //递归调用
//================================================================================================
void playerplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want)
//对抗时玩家算法
& & int choice,p,q,i,j; &
& & cout&&&你需要凑的牌的点数 &&&want&&&
& & cout&&&你现有&&&pcn&&&张牌:&&&
for(i=0;i&i++)
pc[i].shownumber();
if((i+1)%5==0) //显示5张牌换一次行
cout&&setfill('=')&&setw(47)&&&=&&&
& & cout&&& & & & & & (1) 出1张牌。&&&
& & cout&&& & & & & & &(2) 出2张牌。&&&
& & cout&&& & & & & & & (3) 抓牌。&&&
& & cout&&& & & & & & & &(4) 玩法提示。&&&
& & cout&&& & & & & & & & (5) 回主界面。&&&
& & cout&&setfill('=')&&setw(47)&&&=&&&
& & while(1) //接受用户输入
& & & & cout&&&请选择1|2|3|4|5:&;
& & & & cin&&
& & & & if(choice&=1&&choice&=5) //遇到合法输入时跳出循环
& & & & & &
cout&&setfill('=')&&setw(47)&&&=&&&
& & if(choice==3)
if(rcn) //有底牌
int temp=rand()% //产生一个小于底牌数的随机数
pc[pcn]=rc[temp]; //赋给玩家牌
pcn++; //玩家牌数加1
for(int r=r&r++)
rc[r]=rc[r+1]; //从底牌里删掉这张牌
rcn--; //底牌数减1
cout&&&没底牌了。&&&
cout&&setfill('=')&&setw(47)&&&=&&&
playerplay(pc,cc,rc,pcn,ccn,rcn,want); //递归调用
& & else if(choice==1) //出一张牌算法
& & & & int flag=1; //定义监视哨
cout&&&请输入出第几张牌:&;
p=pc[i].getnumber();
if(p==want) //满足条件&
cout&&&你出了一张牌:&;
pc[i].shownumber();
rc[rcn]=pc[i]; //将这张牌插回底牌中
& & & & & & rcn++; //底牌数+1
for(int o=i;o&o++) &//从玩家牌里删掉这张牌
pc[o]=pc[o+1];&
& & & & & & pcn--; //玩家牌数-1
if(pcn) //没出净
& & & & & & & & AIplay(pc,cc,rc,pcn,ccn,rcn,want);//进入电脑部分
cout&&&你牌出完了,你赢了!&&&
& & & & & & }
if(flag) //监视哨没有被改值
cout&&&出牌有误!&&&
cout&&setfill('=')&&setw(47)&&&=&&&
& & & & playerplay(pc,cc,rc,pcn,ccn,rcn,want);
else if(choice==2) //出两张牌算法
if(pcn&=2) //手中有2张以上的牌
& & & & {&
int flag=1;
cout&&&请分别输入2张牌的次序:&;
cin&&i&&j;
p=pc[i].getnumber();
q=pc[j].getnumber();
if(p*q==want||(p%q==0&&p/q==want)||(q%p==0&&q/p==want)||p+q==want||p-q==want||q-p==want)&
{ //满足条件
cout&&&你出2张牌:&;
pc[i].shownumber();
pc[j].shownumber();
rc[rcn]=pc[i]; & //插回底牌
rc[rcn+1]=pc[j];
if(i&j) //如果不是按增序输入则交换牌次序
for(int k=j;k&k++) //删除第2张
pc[k]=pc[k+1];
for(int m=i;m&m++) //删除第1张
pc[m]=pc[m+1];
if(pcn) //没出净
& & & &while(1) //两张选一张让电脑凑
cout&&&你选哪张牌让电脑凑?&&&
cout&&&选第一张请按1,选第二张请按2:&;
if(choice==1)
else if(choice==2)
cout&&&输入有误&&&
cout&&setfill('=')&&setw(47)&&&=&&&
AIplay(pc,cc,rc,pcn,ccn,rcn,want);//进入电脑部分
cout&&&你牌出完了,你赢了!&&&
cout&&&出牌有误!&&&
cout&&setfill('=')&&setw(47)&&&=&&&
playerplay(pc,cc,rc,pcn,ccn,rcn,want);
else if(choice==4) //玩法提示
cout&&& & &首先玩家和计算机各分的5张牌,然后比较玩家和&&&
cout&&&计算机手中最小的牌,谁的小谁就打出这张最小的牌,&&&
cout&&&另一方认为自己的牌凑不出这张牌的点数则开始抓牌,&&&
cout&&&直道手中的牌的点数恰与第一个人出的牌相等,或者&&&
cout&&&用手中有的任意两张牌,通过加减乘除四则运算可以凑&&&&
cout&&&出第一个人出的牌相等的点数,则停止抓牌并将这一张&&&
cout&&&或两张出出去,然后要求对方以同样的规则,开始下一&&&
cout&&&轮,直道某一方手中的全部牌出完,游戏结束。&&&
cout&&setfill('=')&&setw(47)&&&=&&&
& & & & playerplay(pc,cc,rc,pcn,ccn,rcn,want);
& & & & welcome();&
//================================================================================================ &
void upminu()
//返回上一级菜单
cout&&setfill('=')&&setw(47)&&&=&&&
cout&&& & & & & & (1) 回主界面&&&
cout&&& & & & & & &(2) 退出游戏&&&
cout&&&&&&setfill('=')&&setw(47)&&&=&&&
cout&&&请选择1|2:&;
cout&&&&&&setfill('=')&&setw(47)&&&=&&&
welcome();
else if(e==2)
cout&&&&&&setfill('=')&&setw(47)&&&=&&&
}while(e!=1||e!=2);&
//================================================================================================ &
void gameinfo()
//游戏简介
& & &cout&&& & &扑克牌加减乘除游戏,是一种集技巧性和运气性&&&
& & &cout&&&于一体的扑克牌游戏。&&&
& & &cout&&& & &现实中可以单人玩,也可以不定人数对抗,用若干&&&
& & &cout&&&副扑克牌去掉王即可游戏,推荐用一副牌双人对抗,乐&&&
cout&&&趣无穷。本程序利用Card类数组模拟扑克牌,设定了单&&&
cout&&&人练习模式和人机对抗模式,如有不懂操作请参考具体&&&
& & &cout&&&提示。&&&
cout&&& & &电脑的计算能力使得它肯定会以最优的策略出牌,&&&
cout&&&就让我们看看你的运气如何吧!&&&&
//================================================================================================ &
void maker()
cout&&&制作组均来自西北大学软件学院2007级4班:&&&
& & &cout&&& & &总策划: & & 谢峥丹&&&
cout&&& & &源代码编者: 曲振波&&&
cout&&& & &技术支持: & 刘伦椿&&&
cout&&&特别鸣谢:&&&
cout&&& & &王建忠,在游戏设计阶段试玩并提出了宝贵的意见。&&&
//================================================================================================ &
void exit()
//退出游戏
& & cout&&&确认退出吗?(Y/N)&;
& & & & cin&&e;
& & & & if(e=='y'||e=='Y')
& & & & & &
& & & & else if(e=='N'||e=='n') & & & &
& & & & & & welcome();
& & }while(e!='y'||e!='Y'||e!='N'||e!='n');
& & cout&&&再见!&&&
& & cout&&&按回车键退出...&&&
& & getchar();
& & getchar();
& & exit(0);
编程帮,一个分享编程知识的公众号。跟着一起学习,每天都有进步。
通俗易懂,深入浅出,一篇文章只讲一个知识点。
文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。
文章不涉及代码,不烧脑细胞,人人都可以学习。
当你决定关注「编程帮」,你已然超越了90%的程序员!
微信扫描二维码关注
本站精品教程
loading...
验证消息:严长生

我要回帖

更多关于 扑克牌发牌程序 的文章

 

随机推荐