5 1 6 2 7 3 8 4(第一次洗牌,把1-4的牌放入第2、4、6、8的位置,把5-8的牌放到1、3、5、7的位置)
7 5 3 1 8 6 4 2(同上,第二次洗牌,5162放到2、4、6、8 , 7384放到1、3、5、7)
整个过程如下
1 2 3 4 5 6 7 8 (原始)
5 1 6 2 7 3 8 4
7 5 3 1 8 6 4 2
8 7 6 5 4 3 2 1
4 8 3 7 2 6 1 5
2 4 6 8 1 3 5 7
1 2 3 4 5 6 7 8
这种小case也能上竞赛的门面上?这个问题其实很简单的啊,就只要三个函数而已。一个函数对应一种模式,扑克牌的四种花色可以用四个数组来表示,每个数组13张,再加大小王。(或者更简单的你直接都放在一个数组里。)第一个函数:随机产生四个随机数然后根据这些数字显示对应的值即可。第二个: 先产生27个随机数输出,然后在输出剩下的27张。第三个: 复制一下前面的数组,也是对应的就行。#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")
}