当前位置:首页 » 编程语言 » C语言冼牌

C语言冼牌

发布时间: 2022-07-28 00:38:45

c语言 编写洗牌的问题

洗牌就随机排序的问题,所以就需要使用库函数rand(),或者自己编写一个伪随机数来实现。

C++里STL里有一个函数random_shuffle()就能实现这样的功能。

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

//洗牌函数
voidrandom_shuffle(int*array,intlen)
{
int*p=array,temp,pos;
for(inti=1;i<len;++i)
{
pos=rand()%i;
temp=*p;
*p++=array[pos];
array[pos]=temp;
}
}

//显示函数
voidprint(int*array)
{
inti;
constcharsign1[][4]={"红","黑","方","草"};
constcharsign2[][4]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

for(i=0;i<52;++i)
{
printf("%s%2s",sign1[array[i]/13],sign2[array[i]%13]);
if(i%13==12)printf(" ");
}
printf(" ");
}




intmain()
{
srand(time(NULL));//初始化随机数
intcard[52],i;
for(i=0;i<52;++i)card[i]=i;//初始化牌
print(card);


random_shuffle(card,52);//洗牌

print(card);

return0;
}


㈡ C语言编程——发牌洗牌模拟,求帮助

实现了2副牌的发牌,和每个人的牌和底牌
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

struct CARD //牌
{
char suit[10]; /*花色*/
char face[10]; /*牌面*/
};
enum { posA, posB, posC, posD};//定义好每个人的位置
struct Postion
{
struct CARD getcard[25];//每人获得的牌
};
struct Postion postion[4];//分配四个位置

struct CARD leftCard[8]; //底牌
struct CARD card[54]; //54张牌
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","jack","Queen","King"};
/* 函数功能:将52张牌的顺序打乱,
函数参数:结构体数组wCard,表示52张牌
函数返回值:无
*/
void Shuffle(struct CARD *wCard)
{
int i,j;
struct CARD temp;

for (i=0; i<54; i++)
{
j=rand()%54;
temp=wCard[i];
wCard[i]=wCard[j];
wCard[j]=temp;
}
}
/*函数功能:发牌结果
函数参数:结构体数组wCard,表示有54张牌
函数返回值:无
*/
void Deal(struct CARD *wCard)
{
int i,aidx=0,bidx=0,cidx=0,didx=0;

Shuffle(card);//将牌打乱
/*************发第一副牌,只发50张,分别分给A,B,C,D四个位置 4张留底**************/
// 第一次发完50张后,A,B多一张,所以下面第二次让C,D排在前面,两次发完刚好各40张 */
for (i=0; i<50; i++)//发牌数
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==1)
postion[posB].getcard[bidx++]=wCard[i];
else if(i%4==2)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==3)
postion[posD].getcard[didx++]=wCard[i];
}

/**********剩下的四张作为底牌*********/
leftCard[0]=wCard[i++];
leftCard[1]=wCard[i++];
leftCard[2]=wCard[i++];
leftCard[3]=wCard[i++];

Shuffle(card);//再次将牌打乱
/*************发第二副牌,也只发50张,分别分给A,B,C,D四个位置,4张留底,一共8张底**************/
for (i=0; i<50; i++)//发牌数
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==1)
postion[posD].getcard[didx++]=wCard[i];
else if(i%4==2)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==3)
postion[posB].getcard[bidx++]=wCard[i];
}

/**********剩下的四张作为底牌,这样就一共为8张底牌*********/
leftCard[4]=wCard[i++];
leftCard[5]=wCard[i++];
leftCard[6]=wCard[i++];
leftCard[7]=wCard[i++];

}

/* 函数功能:将52张牌按黑桃、红桃、草花、方块花色顺序,面值按A~K顺序排列
函数参数:结构体数组wCard,表示不同花色和面值的52张牌
指针数组wFace,指向面值字符串
指针数组wSuit,指向花色字符串
函数返回值:无
*/
void FillCard(struct CARD wCard[],char *wSuit[], char *wFace[])
{
int i;

for (i=0; i<52; i++)
{
strcpy(wCard[i].suit, wSuit[i/13]);
strcpy(wCard[i].face, wFace[i%13]);
}
// wCard[53].face="Big"; //大小王
strcpy(wCard[52].suit, "Small");
strcpy(wCard[52].face, "ghost");
strcpy(wCard[53].suit, "Big");
strcpy(wCard[53].face, "ghost");
}

void print(char ch)//输出牌
{
int i;
switch(ch)
{
case 'A': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posA].getcard[i].suit, postion[posA].getcard[i].face);
}
break;
case 'B': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posB].getcard[i].suit, postion[posB].getcard[i].face);
}
break;
case 'C': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posC].getcard[i].suit, postion[posC].getcard[i].face);
}
break;
case 'D': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posD].getcard[i].suit, postion[posD].getcard[i].face);
}
break;
}

}

void outputLeftCard()//输出底牌
{
int i;
for(i=0; i<8; i++)
printf("%10s %5s\n", leftCard[i].suit, leftCard[i].face);
}

int main()
{
char pos;
srand(time(NULL));
FillCard(card,suit,face);
//Shuffle(card);
Deal(card);

printf("Please choose your position(A、B、C、D):");
scanf("%c", &pos);
print(pos);//输出你所在位置的牌
/**********下面输出的是,除了你之外其他人的牌**********/
if(pos !='A')
{
printf("A:\n");
print('A');
}
if(pos !='B')
{
printf("B:\n");
print('B');
}
if(pos !='C')
{
printf("C:\n");
print('C');
}
if(pos !='D')
{
printf("D:\n");
print('D');
}

printf("底牌为:\n");
outputLeftCard();//输出底牌

return 0;
}

㈢ 洗牌C语言问题

12345678(假定有8张牌),牌分别是1-8,现在的次序也是1-8
51627384(第一次洗牌,把1-4的牌放入第2、4、6、8的位置,把5-8的牌放到1、3、5、7的位置)
75318642(同上,第二次洗牌,5162放到2、4、6、8,7384放到1、3、5、7)
整个过程如下
12345678(原始)
51627384
75318642
87654321
48372615
24681357
12345678

㈣ C语言 洗牌

下面是正确的代码,没有用链表,通过4个数组来做的,必要的注释我都加了。不理解可以问我。

cout相当于printf,cin相当于scanf。

#include "iostream"

using namespace std;

int main()
{
int num;
cout << "请输入特定数n:";
cin >> num;

int *arry = new int[2*num];
int *temp = new int[2*num];
int *t1 = new int[num];
int *t2 = new int[num];
//初始化数组
for(int j=0;j<2*num;j++)
{
arry[j] = temp[j] = j;
}

//以下是循环部分
bool gogo = true;
int count = 0;

while(gogo)
{
//更新奇、偶数组
for(int i=0; i<2*num; i++)
{
if(i<num)
t1[i] = temp[i];
else
t2[(i-num)] = temp[i];
}

//重组temp数组
for(i=0; i<2*num; i++)
{
if(i%2==0)
temp[i] = t2[i/2] ;
else
temp[i] = t1[(i-1)/2];
}

//判断重组后的数组temp是否和原来的数组一样
for(i=0; i<2*num; i++)
{
if(arry[i] != temp[i])
{
break;
}
}
//如果完全相同,则此时 i==2n;
if(i==2*num)
gogo = false;

count++;
}

cout << count << "次后数组恢复到原来的次序。";

return 0;
}

㈤ c语言洗牌程序。将一副新的除去大王小王,52张扑克牌随机洗牌并输出#include<stdio.h


for(i=1;i<=N;i++)
{
if(i%13==0)poker[i]=13;
elsepoker[i]=i%13;
}
输入牌错误

㈥ C语言 洗牌算法

/*洗牌程序:用任何语言,随机分配52张扑克牌到52个位置上,每个位置只容许放一张牌
用1-13表示红心A--K
14-26表示黑桃A,2,3-,Q,K
27-39表示方块A,2,3-,Q,K
40-52表示黑桃A,2,3-,Q,K
也就是生成1-52不重复的随机数,放到数组中*/

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

const int N=52;
static int a[N];

int create(int n)
{
return (1+rand()%52);
}

int main()
{
int i,j;
srand(time(0));
for(i=0;i<N;++i)
{
a[i]=create(N);
for(j=0;j<i;++j)
{
if(a[j]==a[i])
{
a[i]=(a[i]+1)%52;
}
}
cout<<setw(5)<<a[i];
}
cout<<endl;
return 0;
}

㈦ C语言完全洗牌程式

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intn,a[20],b[20],c[20],n2;
voidinit()
{inti,j,k,t;
for(i=0;i<n2;i++)
a[i]=i+1;
srand(time(0));
for(i=0,j=n2;i<j;j--)
{k=rand()%j;
t=a[j-1];a[j-1]=a[k];a[k]=t;
}
for(i=0;i<n2;i++)
c[i]=a[i];
}
voidprt()
{for(inti=0;i<n2;i++)
{printf("%3d",a[i]);
if(i==n-1)printf("||");
}
printf(" ");
}
voidwork()
{inti,t;
for(i=1;i<n2-1;i++)
{t=i<n?i+i:(i+i)%n2+1;
b[t]=a[i];
//printf("b[%d]=a[%d] ",(i+i)%n2+1,i);
}
for(i=1;i<n2-1;i++)
a[i]=b[i];
}
booldone()
{for(inti=1;i<n2;i++)
if(a[i]!=c[i])returnfalse;
returntrue;
}
intmain()
{scanf("%d",&n);
n2=n+n;
init();
prt();
do
{work();
prt();
}while(!done());
return0;
}

㈧ C语言高手,帮拖!(模拟扑克洗牌)

有一思路:先顺序形成一完整52张牌数组,而后从第一张牌开始每张牌交换一次,交换的新位置由52以内的随机整数取得,最后分给四人,其实我们打牌洗牌就是与这类似的。
提示:一张牌可表示为struct
card{int
nmmber;int
symbol;}而后card[52],用一个for循环就生成顺序而且完整的一付牌,再一个循环就洗好牌,最后一个循环就分给四人了。

㈨ c语言编程用扑克牌洗牌和发牌

程序就不写了,写下大致流程

//定义一个数组,或者列表,链表什么的随你
//共52个元素 记作card[52]
//card代表扑克牌的类,有花色(color 枚举,0,1,2,3),点数(枚举 A~K)等属性

card tmp;
for(int i=0;i<52;i++)
{
//计算一个0到52之间的随机数x
tmp=card[i];
card[i]=card[x];
card[x]=tmp;//其实就是交换两张牌
}
//循环下来肯定每张牌都被交换过,有它自己的新位置,也有可能凑巧还在原来的位置

//最后按下标顺序分四堆

热点内容
qq系统头像文件夹 发布:2024-10-18 14:14:55 浏览:234
安卓手机请输入密码在哪里 发布:2024-10-18 14:13:28 浏览:645
设计编译程序注意的问题 发布:2024-10-18 14:08:43 浏览:254
传智播客android视频 发布:2024-10-18 14:04:42 浏览:904
手机版安卓吃鸡哪个好 发布:2024-10-18 14:01:40 浏览:491
编程自学入门教程 发布:2024-10-18 13:50:58 浏览:141
伊迪阿明访问中国 发布:2024-10-18 13:49:54 浏览:10
人三琳外传脚本 发布:2024-10-18 13:38:16 浏览:839
电脑发件箱服务器错误怎么弄 发布:2024-10-18 13:30:36 浏览:914
evm部署solc编译文件 发布:2024-10-18 13:29:47 浏览:835