如何用C++编写一个随机发牌的程序?

 我来答
yuantailing
2013-08-08 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:650万
展开全部
一个思路是(全是文字,耐心吧):

定义54个数(0~53),存在数组里。
产生N个在0~53的随机数(建议N取大一点以保证随机性,但不能太大以免效率低),交换数组的两个随机元素,相当于随机在牌堆里交换两张牌。
这样做完之后,就产生了一个随机的1~54的序列。
然后对0~53的每个数规定一个花色和点数。比如规定x属于0~53,若x/13==0则x花色为黑桃,x%13的余数加1就是点数;若x/13==1则规定x为红桃,等等;若x为52则定为小王,x为53则定为大王。这样牌堆就生成好了,发牌就是从牌堆顶取牌了,即从数组的0号元素开始取数字,然后解释它的花色、点数。
匿名用户
2013-08-08
展开全部
好麻烦,看的晕~~~
第一步:先建立一个数组装扑克牌,比如52张就是[51]
第二步:用循环把数组填满数字,1~52
第三步:从1到52中建立一个随机数i,把数组中[i]位置的数字放在数组的倒数第一个位置[51],i位置之后的数字向前移动一个位置
第四步:从1到51中建立一个随机数i,把数组中[i]位置的数字放在数组的倒数第二个位置[50],i位置之后的数字向前移动一个位置
第五步:……
循环就可以了
如果是四个人玩,把数组分成四份就好了。
其实就是提取随机数放到最后,让随机的范围越来越小,减少计算量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-08
展开全部
当年学c时做了一个,后来文件丢失了,现在都不用c了我自己现在用的是vb的,自己的算法,只记得,ASCII为个位数的2345(好像是)输出的刚好是4总花色
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-08
展开全部
比较简单的...

#include <stdlib.h>
#include <time.h>
#include <stdio.h>

void main( void )
{
int i1, j, total,n,WITH_JOKER ;
int *iArr;
int tag = 0;
char* p_C[] = { "黑桃", "红桃", "梅花", "方块" };
char* p_N[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };

printf("请输入玩家人数: ");
scanf("%d",&n);
printf("请选择是否需要大小王(需要请输入1,不需要请输入0): ");
scanf("%d",&WITH_JOKER );
printf("\n");

total = (WITH_JOKER)?54:52;
srand( (unsigned)time( NULL ) );
iArr = (int*)malloc(total*sizeof(int));

for(int i=1;i<=n;i++)
{
printf("玩家%d ",i);
}
printf("\n\n");
for( i1=0; i1<total; i1++ )
{
iArr[i1]=rand()%total;
if( i1==0 ) continue;
do {
tag = 0;
for( j=0; j<i1; j++ )
if( iArr[j] == iArr[i1] )
{
iArr[i1]=rand()%total;
tag = 1;
}
} while( tag==1 );
}

for( i1=0; i1<total; i1++ )
{
switch(iArr[i1])
{
case 53: printf("JokerB\t"); break;
case 52: printf("JokerA\t"); break;
default: printf("%s%s\t",p_C[iArr[i1]%4],p_N[iArr[i1]%13]); break;
}
if(i1%(n)==((n)-1)) printf("\n");
}

free(iArr);

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-08
展开全部
RAND()是产生随机数的一个函数~~~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式