如何求C语言扑克牌洗牌发牌,发的牌要从大到小排序,每个部分都要用

Python029

如何求C语言扑克牌洗牌发牌,发的牌要从大到小排序,每个部分都要用,第1张

#include<stdio.h>

#include<stdlib.h>

#include<time.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 ifor ( i=0i<Ni++ ) a[i]=i+1}

//洗牌,将花色和顺序打乱

void Shuffle(int *a) { int s,i,j,t

srand((unsigned int)time(NULL))//利用当前时间生成随机数种子

s=rand()%11+5printf("随机洗牌%d遍\n",s)//第1个随机数当成洗牌次数, 洗牌次数大于等于5,小于等于15

for ( i=0i<si++ ) {

for ( j=0j<Nj++ ) {

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=0i<4i++ ) for ( j=0j<Mj++ ) b[i][j]=a[i*M+j]

}

//理牌

void Collating(int a[4][M]) { int i,j,k,h

for ( h=0h<4h++ )

for ( i=0i<M-1i++ )

for ( j=i+1j<Mj++ )

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=0i<4i++ ) {

for ( j=0j<Mj++ ) {

s=a[i][j]-1printf("%c",hs[s/M])

s%=Mif ( s<9 ) 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")

}

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

struct POKER

{

int num // A:1 , J:11 , Q:12 , K:13

int color //黑1,红2,梅3,方4

}s[52]

int main()

{

int i,num,color

memset(s,0,sizeof(struct POKER)*52)

srand((unsigned)time(0))

int count=0

while(count<52)

{

num=rand()%13+1

color=rand()%4+1

int flag_skip=0,flag_end=0

for(i=0i<52i++)

{

if(s[i].num==num && s[i].color==color)

{

flag_skip=1

break

}

}

if(flag_skip==1)

{

continue

}

while(1)

{

i=rand()%52

if(s[i].num==0)

{

s[i].num=num

s[i].color=color

count++

break

}

else

{

continue

}

}

}

for(i=0i<52i++)

{

if(i%13==0)

{

printf("\n玩家%d : ",i/13+1)

}

switch(s[i].num)

{

case 1: putchar('A')break

case 11: putchar('J')break

case 12: putchar('Q')break

case 13: putchar('K')break

default: printf("%d",s[i].num)

}

switch(s[i].color)

{

case 1: putchar(6)break

case 2: putchar(3)break

case 3: putchar(5)break

case 4: putchar(4)break

default: printf(" ")

}

printf(" ")

}

return 0

}

下面是正确的代码,没有用链表,通过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=0j<2*numj++)

{

arry[j] = temp[j] = j

}

//以下是循环部分

bool gogo = true

int count = 0

while(gogo)

{

//更新奇、偶数组

for(int i=0i<2*numi++)

{

if(i<num)

t1[i] = temp[i]

else

t2[(i-num)] = temp[i]

}

//重组temp数组

for(i=0i<2*numi++)

{

if(i%2==0)

temp[i] = t2[i/2]

else

temp[i] = t1[(i-1)/2]

}

//判断重组后的数组temp是否和原来的数组一样

for(i=0i<2*numi++)

{

if(arry[i] != temp[i])

{

break

}

}

//如果完全相同,则此时 i==2n

if(i==2*num)

gogo = false

count++

}

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

return 0

}