c语言做的扑克牌游戏.
c语言做的扑克牌游戏.
/*---------------------------------------------------------------------------*/
/* 程序名称: 扑克牌对战 */
/* 程序语言: C语言 */
/* 编译器: Win-Tc */
/* 程序功能和实现:玩家和电脑对战,先生成一个包扩所有牌的单链表。 */
/* 然后随机发牌,各26张分别存到自己的新生成的单链表里。 */
/* 然后由玩家自己决定先出什么牌,每出一张,自己的牌就少一张 */
/* 同时电脑随机出牌,每局记录成绩,最后算出总分。 */
/*---------------------------------------------------------------------------*/
#include <stdlib.h>
#include <stdio.h>
#include <alloc.h>
#include <time.h>
struct all_card /*定义数组存放所有牌的花色和点数*/
{
char mode[20];
int number;
}card[52];
typedef struct lnode /*定义单链表用于存放52张扑克牌*/
{
struct all_card data;
struct lnode *next;
}lnode;
void creat(lnode *h) /*生成牌函数,把52张牌存到链表里*/
{
lnode *t,*p;
int i,j,k;
k=0;
for(i=1;i<=4;i++)
{
for(j=1;j<=13;j++)
{
card[k].number=j; /*对点数赋值*/
if(i==1) /*对花色分别赋值*/
strcpy(card[k].mode,"Red");
if(i==2)
strcpy(card[k].mode,"Black");
if(i==3)
strcpy(card[k].mode,"Petal");
if(i==4)
strcpy(card[k].mode,"rectangle");
k++;
}
}
t=h;
for(k=0;k<52;k++)
{
p=(lnode*)malloc(sizeof(lnode));
p->data=card[k];
p->next=NULL;
t->next=p;
t=p;
}
}
void print(lnode *h) /*输出函数*/
{
int k=1;
lnode *p;
p=h->next;
while(p)
{
printf("%d.%s %d ",k,p->data.mode,p->data.number);
p=p->next;
k++;
}
}
int take_big() /*第一次随机数生产函数*/
{
int j;
static int array[53]={0};
srand(time(NULL));
while(1)
{
j=(rand()%52)+1;
if(array[j]==0)
{
array[j]=j;
break;
};
}
return j;
}
putcard(lnode *h,lnode *hx,lnode *hy) /*发牌函数*/
{
lnode *p,*x,*y;
lnode *tx,*ty;
int i,j,k=1;
p=h;
tx=hx;
ty=hy;
while(k<=52)
{
i=take_big(); /*调用随机生成函数*/
if(k%2==1) /*如果是奇数次就发给玩家,偶数次就发给电脑*/
{
j=1;
p=h->next;
while(p&&j<i) /*找到主链表中第i个元素的位置*/
{
p=p->next;
++j;
}
if(i>0&&j==i) /*把第i个元素读入玩家的单链表中*/
{
x=(lnode*)malloc(sizeof(lnode));
x->data=p->data;
x->next=NULL;
tx->next=x;
tx=x;
}
}
else
{
j=1;
p=h->next;
while(p&&j<i)
{
p=p->next;
++j;
}
if(i>0&&j==i)
{
y=(lnode*)malloc(sizeof(lnode));
y->data=p->data;
y->next=NULL;
ty->next=y;
ty=y;
}
}
k++;
}
}
lnode* tip_you(lnode *hx,int i) /*玩家的出牌函数*/
{
int j;
lnode *p,*q,*t;
p=hx;
j=1;
while(p&&j<i)
{
++j;
p=p->next;
}
if(i>0&&j==i)
{
t=p->next;
q=p->next;
p->next=q->next;
return(t);
}
}
lnode* tip_computer(lnode *hy,int i) /*电脑的出牌函数*/
{
int j;
lnode *p,*q;
p=hy->next;
j=1;
while(p&&j<i)
{
++j;
p=p->next;
}
if(i>0&&j==i)
{
return(p);
}
}
int take_small()
{
int j;
static int array[27]={0};
srand(time(NULL));
while(1)
{
j=(rand()%26)+1;
if(array[j]==0)
{
array[j]=j;
break;
};
}
return j;
}
/*比较函数,比较玩家和电脑出牌的大小并记录成绩*/
int compare(lnode *hx,lnode *hy,int i,int j,int *result)
{
int k;
int add;
lnode *x,*y;
x=tip_you(hx,i); /*调用玩家抓牌函数*/
y=tip_computer(hy,j); /*调用电脑抓牌函数*/
if(x->data.number>y->data.number)
{
printf("You put the card is : %s %d\n",x->data.mode,x->data.number);
printf("Compter put the card is : %s %d\n",y->data.mode,y->data.number);
printf("You win this time!\n");
*result=*result+1;
}
else if(x->data.number<y->data.number)
{
printf("You put the card is : %s %d\n",x->data.mode,x->data.number);
printf("Compter put the card is : %s %d\n",y->data.mode,y->data.number);
printf("Compter win this time!\n");
*result=*result-1;
}
else
{
printf("You put the card is : %s %d\n",x->data.mode,x->data.number);
printf("Compter put the card is : %s %d\n",y->data.mode,y->data.number);
printf("You are deuce this time!\n");
}
}
main() /*主函数*/
{
lnode *h,*hx,*hy;
int i,j;
int k;
int *result=0;
h=(lnode*)malloc(sizeof(lnode)); /*生成3个单链表,分别存储所有牌,玩家抓的牌,和电脑抓的牌*/
h->next=NULL;
hx=(lnode*)malloc(sizeof(lnode));
hx->next=NULL;
hy=(lnode*)malloc(sizeof(lnode));
hy->next=NULL;
creat(h); /* 调用生成牌函数*/
putcard(h,hx,hy); /* 调用发牌函数*/
printf("You have this card:\n");
print(hx); /*调用显示牌函数*/
printf("\n");
printf("\n");
for(k=1;k<=26;k++)
{
printf("please in put the number:");
scanf("%d",&i);
if(i<=0||i>27-k) /*用于控制输入数的范围*/
{
printf("\nPlease input the right number!!\n");
k--;
continue;
}
j=take_small();
compare(hx,hy,i,j,result); /*调用比较函数,由比较函数调用抓牌函数*/
printf("\n");
printf("You have the point is:%d\n",*result); /*显示当前得分*/
printf("\n");
printf("You have this card:\n");
print(hx);
printf("\n"); /*显示当前你拥有的扑克牌*/
printf("\n");
}
if(*result>0)
printf("You win the game!!"); /*显示最后结果*/
else if(*result<0)
printf("Computer win the game!!");
else
printf("You are deuce !!");
getch();
/* 程序名称: 扑克牌对战 */
/* 程序语言: C语言 */
/* 编译器: Win-Tc */
/* 程序功能和实现:玩家和电脑对战,先生成一个包扩所有牌的单链表。 */
/* 然后随机发牌,各26张分别存到自己的新生成的单链表里。 */
/* 然后由玩家自己决定先出什么牌,每出一张,自己的牌就少一张 */
/* 同时电脑随机出牌,每局记录成绩,最后算出总分。 */
/*---------------------------------------------------------------------------*/
#include <stdlib.h>
#include <stdio.h>
#include <alloc.h>
#include <time.h>
struct all_card /*定义数组存放所有牌的花色和点数*/
{
char mode[20];
int number;
}card[52];
typedef struct lnode /*定义单链表用于存放52张扑克牌*/
{
struct all_card data;
struct lnode *next;
}lnode;
void creat(lnode *h) /*生成牌函数,把52张牌存到链表里*/
{
lnode *t,*p;
int i,j,k;
k=0;
for(i=1;i<=4;i++)
{
for(j=1;j<=13;j++)
{
card[k].number=j; /*对点数赋值*/
if(i==1) /*对花色分别赋值*/
strcpy(card[k].mode,"Red");
if(i==2)
strcpy(card[k].mode,"Black");
if(i==3)
strcpy(card[k].mode,"Petal");
if(i==4)
strcpy(card[k].mode,"rectangle");
k++;
}
}
t=h;
for(k=0;k<52;k++)
{
p=(lnode*)malloc(sizeof(lnode));
p->data=card[k];
p->next=NULL;
t->next=p;
t=p;
}
}
void print(lnode *h) /*输出函数*/
{
int k=1;
lnode *p;
p=h->next;
while(p)
{
printf("%d.%s %d ",k,p->data.mode,p->data.number);
p=p->next;
k++;
}
}
int take_big() /*第一次随机数生产函数*/
{
int j;
static int array[53]={0};
srand(time(NULL));
while(1)
{
j=(rand()%52)+1;
if(array[j]==0)
{
array[j]=j;
break;
};
}
return j;
}
putcard(lnode *h,lnode *hx,lnode *hy) /*发牌函数*/
{
lnode *p,*x,*y;
lnode *tx,*ty;
int i,j,k=1;
p=h;
tx=hx;
ty=hy;
while(k<=52)
{
i=take_big(); /*调用随机生成函数*/
if(k%2==1) /*如果是奇数次就发给玩家,偶数次就发给电脑*/
{
j=1;
p=h->next;
while(p&&j<i) /*找到主链表中第i个元素的位置*/
{
p=p->next;
++j;
}
if(i>0&&j==i) /*把第i个元素读入玩家的单链表中*/
{
x=(lnode*)malloc(sizeof(lnode));
x->data=p->data;
x->next=NULL;
tx->next=x;
tx=x;
}
}
else
{
j=1;
p=h->next;
while(p&&j<i)
{
p=p->next;
++j;
}
if(i>0&&j==i)
{
y=(lnode*)malloc(sizeof(lnode));
y->data=p->data;
y->next=NULL;
ty->next=y;
ty=y;
}
}
k++;
}
}
lnode* tip_you(lnode *hx,int i) /*玩家的出牌函数*/
{
int j;
lnode *p,*q,*t;
p=hx;
j=1;
while(p&&j<i)
{
++j;
p=p->next;
}
if(i>0&&j==i)
{
t=p->next;
q=p->next;
p->next=q->next;
return(t);
}
}
lnode* tip_computer(lnode *hy,int i) /*电脑的出牌函数*/
{
int j;
lnode *p,*q;
p=hy->next;
j=1;
while(p&&j<i)
{
++j;
p=p->next;
}
if(i>0&&j==i)
{
return(p);
}
}
int take_small()
{
int j;
static int array[27]={0};
srand(time(NULL));
while(1)
{
j=(rand()%26)+1;
if(array[j]==0)
{
array[j]=j;
break;
};
}
return j;
}
/*比较函数,比较玩家和电脑出牌的大小并记录成绩*/
int compare(lnode *hx,lnode *hy,int i,int j,int *result)
{
int k;
int add;
lnode *x,*y;
x=tip_you(hx,i); /*调用玩家抓牌函数*/
y=tip_computer(hy,j); /*调用电脑抓牌函数*/
if(x->data.number>y->data.number)
{
printf("You put the card is : %s %d\n",x->data.mode,x->data.number);
printf("Compter put the card is : %s %d\n",y->data.mode,y->data.number);
printf("You win this time!\n");
*result=*result+1;
}
else if(x->data.number<y->data.number)
{
printf("You put the card is : %s %d\n",x->data.mode,x->data.number);
printf("Compter put the card is : %s %d\n",y->data.mode,y->data.number);
printf("Compter win this time!\n");
*result=*result-1;
}
else
{
printf("You put the card is : %s %d\n",x->data.mode,x->data.number);
printf("Compter put the card is : %s %d\n",y->data.mode,y->data.number);
printf("You are deuce this time!\n");
}
}
main() /*主函数*/
{
lnode *h,*hx,*hy;
int i,j;
int k;
int *result=0;
h=(lnode*)malloc(sizeof(lnode)); /*生成3个单链表,分别存储所有牌,玩家抓的牌,和电脑抓的牌*/
h->next=NULL;
hx=(lnode*)malloc(sizeof(lnode));
hx->next=NULL;
hy=(lnode*)malloc(sizeof(lnode));
hy->next=NULL;
creat(h); /* 调用生成牌函数*/
putcard(h,hx,hy); /* 调用发牌函数*/
printf("You have this card:\n");
print(hx); /*调用显示牌函数*/
printf("\n");
printf("\n");
for(k=1;k<=26;k++)
{
printf("please in put the number:");
scanf("%d",&i);
if(i<=0||i>27-k) /*用于控制输入数的范围*/
{
printf("\nPlease input the right number!!\n");
k--;
continue;
}
j=take_small();
compare(hx,hy,i,j,result); /*调用比较函数,由比较函数调用抓牌函数*/
printf("\n");
printf("You have the point is:%d\n",*result); /*显示当前得分*/
printf("\n");
printf("You have this card:\n");
print(hx);
printf("\n"); /*显示当前你拥有的扑克牌*/
printf("\n");
}
if(*result>0)
printf("You win the game!!"); /*显示最后结果*/
else if(*result<0)
printf("Computer win the game!!");
else
printf("You are deuce !!");
getch();