扑克牌问题
要求:52张扑克牌中给4位玩家各发13张牌,然后将4位玩家手中的13张牌分别从小到大理牌后输出。说明:假定梅花最小,方块次小,红桃次大,黑桃最大。
程序中用结构体表示一张扑克牌的花色和牌点(见下面),程序除了main函数外,希望发牌、理牌、显示牌各编一个函数。
typedef struct
{ int suit; // 花色 1…4
int rank; // 牌点 2…14
} Poker;
/*扑克牌发牌问题
1.定义一个结构体类型,存放牌的花色和牌点
2.定义一个结构体类型的数组,存放52张牌
3.定义两个数组分别存放存放花色和牌点
4.初始化牌面: 用循环输出结构体类型中存放的牌面
5.发牌函数:用随机函数 交换函数交换数组中牌的位置
6.理牌函数:
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
const char *tosuit[4]={"梅花","方块","红桃","黑桃"};
const char *torank[13]={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
typedef struct{
int suit;
int rank;
}Poker;
Poker poker[52];
//初始化牌
void ini(){
printf("初始的52张牌分别为:");
int i,j,k;
for(i=0;i<52;i++){
if(i%13==0) printf("\n");
/* for(j=0;j<4;j++){
for(k=0;k<13;k++){
*/ poker[i].suit=i/13;
poker[i].rank=i%13;
printf("%s-",tosuit[poker[i].suit]);
printf("%s ",torank[poker[i].rank]);
}
}
//洗牌
void swap(Poker *a,Poker *b){
Poker temp1;
temp1.suit=a->suit;
temp1.rank=a->rank;
a->suit=b->suit;
a->rank=b->rank;
b->suit=temp1.suit;
b->rank=temp1.rank;
/* Poker *temp;
a=b;
b=temp;
temp=a;
*/
}
//发牌
void deal(){
srand((unsigned)(time(NULL)));
int a,b,c=10000;
while(c--!=0){
a=(int)rand()%52;
b=(int)rand()%52;
swap(&poker[a],&poker[b]);
}
}
//理牌
//选择法排序
void sort1(int m,int n){
int i,k,j;
for(i=m;i<n;i++){
k=i;
for(j=i+1;j<=n;j++){
if(((poker[k].suit*100)+poker[k].rank)>((poker[j].suit*100)+poker[j].rank)) {
k=j;
}
}
if(k!=i){
swap(&poker[k],&poker[i]);
}
}
}
void sort2(){
sort1(0,12);
sort1(13,25);
sort1(26,38);
sort1(39,51);
}
/*void sort(){
int i,k,j,l;
for(i=0;i<52;i+=13){
for(l=0;l<13;l++){
k=i;
for(j=i+1;j<=(i+12);j++){
if((poker[l].suit*10+poker[l].rank)<poker[j].suit*10+poker[j].rank) {
k=j;
}
}
if(k!=i){
swap(&poker[k],&poker[i]);
}
}
}
}
*/
//显示牌
void show(){
int i,k;
for(k=0;k<4;k++){
printf("%d号玩家的牌为:\n",k+1);
for(i=k*13;i<((k+1)*13);i++){
printf("%s-",tosuit[poker[i].suit]);
printf("%s ",torank[poker[i].rank]);
}
printf("\n");
}
}
int main(){
ini();
printf("\n");
deal();
sort2();
show();
return 0;
}