post重做扑克牌发牌问题


扑克牌问题

要求: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;
}






 

特别声明

方法不止此一种,敬请大佬在评论区与我交流。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值