正文
c语言洗牌函数 c语言扑克牌游戏程序
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
C语言 编写洗牌的问题
洗牌就随机排序的问题,所以就需要使用库函数rand(),或者自己编写一个伪随机数来实现。
C++里STL里有一个函数random_shuffle()就能实现这样的功能。
#include stdlib.h
#include time.h
#include stdio.h
// 洗牌函数
void random_shuffle(int * array, int len)
{
int * p = array, temp, pos;
for (int i = 1; i len; ++i)
{
pos = rand() % i;
temp = *p;
*p++ = array[pos];
array[pos] = temp;
}
}
// 显示函数
void print(int * array)
{
int i;
const char sign1[][4] = {"红", "黑", "方", "草"};
const char sign2[][4] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
for(i=0; i52; ++i)
{
printf("%s%2s ", sign1[array[i] / 13], sign2[array[i] % 13]);
if(i % 13 == 12) printf("\n");
}
printf("\n");
}
int main()
{
srand(time(NULL)); // 初始化随机数
int card[52], i;
for(i=0; i52; ++i) card[i] = i; // 初始化牌
print(card);
random_shuffle(card, 52); // 洗牌
print(card);
return 0;
}
C语言编程题-洗牌
我解决了这个问题,程序如下:
注意:n不能大于500,否则你就得改数组A和B的大小;
#include stdio.h
int A[1000],B[500];
void main()
{
int m,n,i;
int flag(int);
void exchange(int);
printf("input n:");
scanf("%d",n);
for(i=0,m=n*2;im;i++) A[i]=i;
i=0;
do {exchange(n); i++;}
while(flag(m));
printf("Times: %d",i);
}
void exchange(int n)
{
int i;
for(i=0;in;i++)
B[i]=A[i+n];
for(i=n-1;i=0;i--)
A[i*2+1]=A[i];
for(i=0;in;i++)
A[i*2]=B[i];
}
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;j2*num;j++)
{
arry[j] = temp[j] = j;
}
//以下是循环部分
bool gogo = true;
int count = 0;
while(gogo)
{
//更新奇、偶数组
for(int i=0; i2*num; i++)
{
if(inum)
t1[i] = temp[i];
else
t2[(i-num)] = temp[i];
}
//重组temp数组
for(i=0; i2*num; i++)
{
if(i%2==0)
temp[i] = t2[i/2] ;
else
temp[i] = t1[(i-1)/2];
}
//判断重组后的数组temp是否和原来的数组一样
for(i=0; i2*num; i++)
{
if(arry[i] != temp[i])
{
break;
}
}
//如果完全相同,则此时 i==2n;
if(i==2*num)
gogo = false;
count++;
}
cout count "次后数组恢复到原来的次序。";
return 0;
}
C语言编程——发牌洗牌模拟,求帮助
实现了2副牌的发牌c语言洗牌函数,和每个人的牌和底牌
#includestdio.h
#includestdlib.h
#includetime.h
#includestring.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张牌的顺序打乱c语言洗牌函数,
函数参数:结构体数组wCard,表示52张牌
函数返回值:无
*/
void Shuffle(struct CARD *wCard)
{
int i,j;
struct CARD temp;
for (i=0; i54; 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; i50; 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; i50; 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; i52; 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; i25; i++)
{
printf("%10s %5s\n", postion[posA].getcard[i].suit, postion[posA].getcard[i].face);
}
break;
case 'B': for(i=0; i25; i++)
{
printf("%10s %5s\n", postion[posB].getcard[i].suit, postion[posB].getcard[i].face);
}
break;
case 'C': for(i=0; i25; i++)
{
printf("%10s %5s\n", postion[posC].getcard[i].suit, postion[posC].getcard[i].face);
}
break;
case 'D': for(i=0; i25; i++)
{
printf("%10s %5s\n", postion[posD].getcard[i].suit, postion[posD].getcard[i].face);
}
break;
}
}
void outputLeftCard()//输出底牌
{
int i;
for(i=0; i8; 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);//输出c语言洗牌函数你所在位置的牌
/**********下面输出的是,除了你之外其他人的牌**********/
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语言扑克牌洗牌发牌,发的牌要从大到小排序,每个部分都要用
#includestdio.h
#includestdlib.h
#includetime.h
#define N 52 //牌张总数
#define M 13 //每花色张数
char hs[4]={5,4,3,6}; //花色数组:梅花、红心、方块、黑桃字符对应的ASCII码
char hx[]={"JQKA"}; // 对应11,12,13,14共四张大于10的牌符号
//生成顺序扑克牌数组: 1~52,梅花1~13,红心14~26,方块27~39,黑桃40~52
void newDeck(int *a) { int i; for ( i=0;iN;i++ ) a[i]=i+1; }
//洗牌,将花色和顺序打乱
void Shuffle(int *a) { int s,i,j,t;
srand((unsigned int)time(NULL)); //利用当前时间生成随机数种子
s=rand()%11+5; printf("随机洗牌%d遍\n",s); //第1个随机数当成洗牌次数, 洗牌次数大于等于5,小于等于15
for ( i=0;is;i++ ) {
for ( j=0;jN;j++ ) {
s=rand()%52; //随机数范围0~51,对应a数组下标
t=a[j]; a[j]=a[s]; a[s]=t; //第j张牌和第s张牌交换
}
}
}
//发牌并显示
void Deal(int a[N],int b[4][M]) { int i,j;
for ( i=0;i4;i++ ) for ( j=0;jM;j++ ) b[i][j]=a[i*M+j];
}
//理牌
void Collating(int a[4][M]) { int i,j,k,h;
for ( h=0;h4;h++ )
for ( i=0;iM-1;i++ )
for ( j=i+1;jM;j++ )
if ( a[h][i]a[h][j] ) {
k=a[h][i]; a[h][i]=a[h][j]; a[h][j]=k;
}
}
//显示
void Display(int a[4][M]) { int i,j,s;
for ( i=0;i4;i++ ) {
for ( j=0;jM;j++ ) {
s=a[i][j]-1; printf("%c",hs[s/M]);
s%=M; if ( s9 ) printf("%d ",s+2); else printf("%c ",hx[s-9]);
}
printf("\n");
}
}
void main() { int Deck[N],hands[4][M];
newDeck(Deck); //新扑克牌
Shuffle(Deck); //洗牌
Deal(Deck,hands); //发牌
Collating(hands); //理牌
Display(hands); //显示
printf("\n\n"); system("pause");
}
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不重复c语言洗牌函数的随机数c语言洗牌函数,放到数组中*/
#includeiomanip.h
#includestdlib.h
#includetime.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;iN;++i)
{
a[i]=create(N);
for(j=0;ji;++j)
{
if(a[j]==a[i])
{
a[i]=(a[i]+1)%52;
}
}
coutsetw(5)a[i];
}
coutendl;
return 0;
}
关于c语言洗牌函数和c语言扑克牌游戏程序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。