先说明一下游戏形式,游戏模式为现在较流行的三国杀式卡牌游戏模式、主要游戏设定与三国杀类似,可持手牌,体力设定,以及抽到各种卡牌会触发一定效果来影响其他玩家。
当时写出这些只为自娱自乐,总体实现还是比较简单的,无UI,无联网功能。若有错误,还望各位大侠指正。
代码由纯C实现,完成框架设计所涉及到的数据结构,使用到了单链表及其扩展结构。如玩家序列使用到了循环链表,牌堆使用到了链栈结构。
先是头文件 game_info.h
#define MAXNUM 54;
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#define RANDOM(a,b) (rand()%((b+1)-(a)) + (a))
/*玩家数据??*/
struct player {
char name;
int life;
struct card_onhand * cards;
struct player * next;
};
/*?牌数据??*/
struct card {
int num;
int color;
struct card *next;
};
/*玩家列表*/
typedef struct player_list {
struct player * head;
}PLAYER_LIST;
/*游?手牌堆*/
typedef struct card_onhand {
struct card * head;
int num;
}CARD_O_LIST;
/*游?牌堆*/
typedef struct card_ingame {
struct card * head;
int num;
}CARD_I_STACK;
/*游??牌堆*/
typedef struct card_lostgame {
struct card * head;
int num;
}CARD_L_STACK;
/*初始化手牌堆*/
void card_onhand_init(CARD_O_LIST *p)
{
(*p).head=NULL;
(*p).num=0;
printf("玩家手牌堆初始化成功!\n");
}
/*初始化玩家数据*/
int player_init(PLAYER_LIST *p)
{
struct player *ptr,*r;
(*p).head = NULL;
r=NULL;
int num = 0;
while(num<4)
{
if(num==0)
{
if(ptr = (struct player *)malloc(sizeof(struct player)))
{
(*ptr).name = 'y';
(*ptr).life = 5;
if((*ptr).cards = (CARD_O_LIST *)malloc(sizeof(CARD_O_LIST)))
card_onhand_init((*ptr).cards);
else
{
printf("内存分配失?!");
return 0;
}
(*p).head=ptr;
r=ptr;
(*ptr).next = (*p).head;
num++;
continue;
}
else
{
printf("内存分配失?!");
return 0;
}
}
else
{
if(ptr = (struct player *)malloc(sizeof(struct player)))
{
(*ptr).name = (char)num;
(*ptr).life = 5;
if((*ptr).cards = (CARD_O_LIST *)malloc(sizeof(CARD_O_LIST)))
card_onhand_init((*ptr).cards);
else
{
printf("内存分配失?!");
return 0;
}
(*r).next = ptr;
r=ptr;
(*ptr).next = (*p).head;
num++;
continue;
}
else
{
printf("内存分配失?!");
return 0;
}
}
}
return 1;
}
/*洗牌*/
void card_shuffle(int *p)
{
int i=0,j=0;
int existed;
srand(time(NULL));
while( i<54 )
{
int r = RANDOM(1,54);
existed = 0;
if(i==0)
{
*p = r;
i++;
continue;
}
else
{
for(j=0; j<i; j++)
if(r == *(p+j))
{
existed = 1;
break;
}
if(existed == 0)
{
*(p+i) = r;
i++;
}
}
}
}
/*?牌花色数?修正*/
void color_judge(CARD_I_STACK *p)
{
struct card *ptr = (*p).head;
while(ptr!=NULL)
{
if(((*ptr).num-1)/13==0)
(*ptr).color = 0;
else if(((*ptr).num-1)/13==1)
{
(*ptr).num -=13;
(*ptr).color = 1;
}