标题:[求助]洗牌函数
只看楼主
xiaoxu135
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-10-29
 问题点数:0 回复次数:9 
[求助]洗牌函数
设用两维函数deck[52][2]表示一副扑克牌,数组的一行用于存储一张牌的花色和面值。另外引入以下字符指针数组用于存储牌的花色名称:
char *suit[4]={"Spades","Hearts","Diamonds","Clude"};
char *face[13]={"Ace","Deduce","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Qween","King"};
试按以下要求编写洗牌模拟函数。令52张牌按顺序排序于0~51对应。首先顺序地将花色和面值天如数组deck中,然后逐一考察这52张牌,并为每一张牌随机产生一个0~51的一个数字。并将当前正在考察的牌于随机产生的整数对应的牌对换。直至每张牌都被考察后停止洗牌。


怎么样控制随机数的范围呢?
搜索更多相关主题的帖子: 函数 扑克牌 洗牌 deck 
2006-11-10 13:16
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 
rand()%n

将产生0-(n-1)的随机数


2006-11-10 14:45
xiaoxu135
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-10-29
得分:0 

谢谢你


2006-11-11 13:31
xiaoxu135
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-10-29
得分:0 

可以把代码写一下吗?我在下面调了很久没有弄好
谢谢


2006-11-11 21:24
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 

把你的代码发出来看看


2006-11-11 22:02
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
char *suit[4]={"Spades","Hearts","Diamonds","Clude"};
char *face[13]={"Ace","Deduce","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Qween","King"};
int main()
{
char *deck[52][2];
int temp[52],i,j,tem;
for(i=0;i<52;i++)
temp[i]=i;
srand(time(NULL));
for(i=0;i<52;i++)
{
tem=rand()%(52-i);
j=temp[52-i-1];
temp[52-i-1]=temp[tem];
temp[tem]=j;
}
for(i=0;i<52;i++)
{
deck[i][0]=suit[temp[i]/13];
deck[i][1]=face[temp[i]%13];
}
for(i=0;i<52;i++)
{
if(i%13==0)
printf("\nPlay %d: ",i/13+1);
printf("%s %s ",deck[i][0],deck[i][1]);
}
printf("\n");
return 0;
}

2006-11-11 22:30
小小贝
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-9-21
得分:0 

大家看下我做的.不知道有错误没..做的我头疼..
*#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void main()
{
int sz[52];
char *deck[52][2];
char *suit[4]={"Spades","Hearts","Diamonds","Clude"};
char *face[13]={"Ace","Deduce","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Qween","King"};
static int i;
int j=0,p,q,k;
for(p=0;p<13;p++)
{
for(q=0;q<4;q++)
{
deck[i][j]=suit[q];
deck[i][j+1]=face[p];
i++;
}
}
printf("产生52个随即数");
srand((unsigned)time(NULL));
for(k=0;k<52;k++)
{
sz[k]=rand()%52;
}
for(k=0;k<52;k++)
{
char *temp,*temp1;
temp=deck[sz[k]][j];
temp1=deck[sz[k]][j+1];
deck[sz[k]][j]=deck[k][j];
deck[sz[k]][j+1]=deck[k][j+1];
deck[k][j]=temp;
deck[k][j+1]=temp1;
}
for(p=0;p<52;p++)
{
for(q=0;q<2;q++)
printf("%s\t",deck[p][q]);
printf("\n");
}
}

2006-11-11 23:23
xiaoxu135
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-10-29
得分:0 
srand(time(NULL));
这句话是什么意思

2006-11-12 15:01
xiaoxu135
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-10-29
得分:0 
deck[i][0]=suit[temp[i]/13];
为什么不是deck[i][0]=suit[temp[i]%4];呢

2006-11-12 15:06
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 
以下是引用xiaoxu135在2006-11-12 15:06:43的发言:
deck[i][0]=suit[temp[i]/13];
为什么不是deck[i][0]=suit[temp[i]%4];呢

srand(time(NULL));这个是为随机数产生种子.
temp[i]存放的是0-51的数,他们分别代表一张牌.
我们可以规定0-12对应红桃
13-25对应...


2006-11-12 19:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-101992-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051668 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved