C语言-纸牌游戏

啥都不说,直接上代码!

//纸牌游戏
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define SIZE 54
#define ren_num 3

typedef struct no
{
	char pai[8];
}DATA;

typedef struct list
{
	DATA data[SIZE];
	int  top;
}*Stack,stack;

//理牌
stack sort_pai(stack a);
//组建新牌
void new_pai(Stack S);
//发牌
void fapai(Stack S);
//洗牌
Stack xipai(Stack S);
//展示牌
void xianpai(Stack S)
{
	printf("\n");
	while(S->top--)	printf("%s\t",S->data[S->top].pai);
	printf("\n");
}


void main()
{
	Stack S=malloc(sizeof(struct list));
	S->top=0;
	new_pai(S);    //扑克初始化
	
	stack t=*S;   //样牌
	
	fapai(&t);   //发牌展示样牌
	
	while(1)
	{
		int a;
		printf("1.继续\n2.退出\n");
		scanf("%d",&a);
		if(a == 2) break;
		
		S->top=SIZE;
		S=xipai(S);  //洗完牌,后的
	
		printf("\n\n洗完牌之后的:\n");
	
		fapai(S);   //发牌
	}
	
}

//理牌
stack sort_pai(stack a)
{
	stack b;
	b.top=0;
	new_pai(&b);  //标准
	int c[a.top],d=0;
	
	for(int i=0;i<a.top;i++)
	{
		for(int j=0;j<b.top;j++)
		{
			if(strcmp(a.data[i].pai,b.data[j].pai)==0)	c[d++]=j;    //将牌的序号找出来
		}
	}
	
	//排序号  小-大
	for(int i=0;i<d-1;i++)
	{
		for(int j=i+1;j<d;j++)
		{
			if(c[i]>c[j])
			{
				c[i]^=c[j];
				c[j]^=c[i];
				c[i]^=c[j];
			}
		}
	}
	  
	for(int i=0;i<a.top;i++)	a.data[i]=b.data[c[i]];  //重新装入栈
	
	return a;
}
//组建新牌
void new_pai(Stack S)
{
	int i,j,k;
	for(i=3;i <= 15;i++)
	{
		for(j=0;j<4;j++)
		{
			k=0;	//表示字符串的第几个位
			if(i < 10)
			{
				S->data[S->top].pai[k++]= '0'+i;
				S->data[S->top].pai[k++]='-';
			}
			else
			{
				if(i==10)
				{
					S->data[S->top].pai[k++]='1';
					S->data[S->top].pai[k++]='0';
				}
				else if(i==11)
				{
					S->data[S->top].pai[k++]='J';
					S->data[S->top].pai[k++]='-';
				}
				else if(i==12)
				{
					S->data[S->top].pai[k++]='Q';
					S->data[S->top].pai[k++]='-';
				}
				else if(i==13)
				{
					S->data[S->top].pai[k++]='K';
					S->data[S->top].pai[k++]='-';
				}
				else if(i==14)
				{
					S->data[S->top].pai[k++]='A';
					S->data[S->top].pai[k++]='-';
				}
				else
				{
					S->data[S->top].pai[k++]='2';
					S->data[S->top].pai[k++]='-';
				}
			}
			S->data[S->top].pai[k++]='a'+j;
			S->data[S->top++].pai[k]='\0';
		}
	}
	stpcpy(S->data[S->top++].pai,"Xiaomao");
	stpcpy(S->data[S->top++].pai,"Damao");
}

//发牌
void fapai(Stack S)
{
	stack s[ren_num];
	s[0].top=0,s[1].top=0,s[2].top=0;
	
	while(S->top-- > 3)   //留三张
	{
		switch(S->top%3)
		{
			case 0:s[0].data[s[0].top++]=S->data[S->top];break;
			case 1:s[1].data[s[1].top++]=S->data[S->top];break;
			case 2:s[2].data[s[2].top++]=S->data[S->top];break;
			default:break;
		}
	}
	
	s[0]=sort_pai(s[0]);
	xianpai(&s[0]);
	s[1]=sort_pai(s[1]);
	xianpai(&s[1]);
	s[2]=sort_pai(s[2]);
	xianpai(&s[2]);
	
	S->top++;    //底牌
	printf("底牌三张:");
	xianpai(S);
}

//洗牌
Stack xipai(Stack S)
{
	//初始化栈
	Stack s=malloc(sizeof(struct list));
	s->top=0;
	
	int a[S->top];
	int t=0,flag=0;     //初始化一个数组,用于装抽过得牌
	
	//洗
	srand(time(0));
	while(s->top != SIZE)  //打乱完为止
	{
		//保证随机数x不重复
		flag=0;
		a[t]=rand()%SIZE;    //0~53    
		
		for(int i=0;i<t;i++)	if(a[t] == a[i])	{flag=1;break;}
		if(flag)	continue;
		
		s->data[s->top++]=S->data[a[t++]];   //放在栈底部    55
	}
	
	return s;
}

实现的效果是:不太尽美,望大家求精! a表示红桃、b表示黑桃、c表示红方块和d表示黑方块。
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值