卡牌游戏框架实现(C)

本文介绍了一个用C语言实现的三国杀风格的卡牌游戏框架。游戏包含玩家数据结构、卡牌数据结构和不同类型的链表结构。代码实现了玩家、卡牌堆、手牌堆等的初始化,以及洗牌、分牌等功能。游戏没有UI和联网功能,通过控制台操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

    先说明一下游戏形式,游戏模式为现在较流行的三国杀式卡牌游戏模式、主要游戏设定与三国杀类似,可持手牌,体力设定,以及抽到各种卡牌会触发一定效果来影响其他玩家。

当时写出这些只为自娱自乐,总体实现还是比较简单的,无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;
        }
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值