啥都不说,直接上代码!
//纸牌游戏
#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表示黑方块。