一句话进展

  1. 完善了程序结构,分离.c和.h
  2. 搭建了6个阶段函数
  3. 实现了玩家摸牌
  4. 封装实现了日志打印函数

日志打印

想要区分日志等级,包括DEBUGINFOWARNERRROPANIC,提供统一的日志打印接口,能够按级别打开、关闭日志

大体实现是定义了一个变量now_log_level记录当前日志打印级别,提供一个接口去修改

enum Log_Level {LDEBUG=0, LINFO, LWARN, LERROR, LPANIC};

void Set_Log_Level(enum Log_Level ll)
{
now_log_level = ll;
}

然后封装了一个Log函数

void Log(enum Log_Level ll,va_list va_alist,...)
{
va_list args;
va_start(args ,va_alist);
if(now_log_level <= ll) //注意&和<<优先级
{
switch (ll) {
case LDEBUG:
printf("[DEBUG] ");
break;
case LINFO:
printf("[INFO ] ");
break;
case LWARN:
printf("[WARN ] ");
break;
case LERROR:
printf("[ERROR] ");
break;
case LPANIC:
printf("[PANIC] ");
break;
default:
break;
}
vfprintf(stderr, va_alist, args);
}
va_end(args); if (ll == LPANIC) {
exit(1);
}
}

实现效果:

六大阶段

准备阶段判定阶段摸牌阶段出牌阶段弃牌阶段结束阶段

目前只是打了桩函数,流程大概长这样:

for (int i = 0; i < 5; i++) {
Stage_Preparation(player[i]);
Stage_Determination(player[i]);
Stage_Touch(player[i]);
UI_draw_my_card(player[0]);
Stage_Play(player[i]);
Stage_Discard(player[i]);
Stage_Finish(player[i]);
system("pause");
}

牌堆初始化

维护一个Card_List,叫做card_heap_unused,代表剩余的牌堆

struct Card_List{
struct Card* card;
struct Card_List *next;
}; struct Card_List *card_heap_unused;

采用带哨兵节点的链表来实现,初始化牌堆,创建哨兵节点

card_heap_unused = malloc(sizeof(struct Card_List));
card_heap_unused->next = NULL;

将所有定义在结构体数组cards中的卡牌加入牌堆。

结构体数组已经分配了内存空间,这里不再为 struct Card变量分配额外的空间,而是选择直接将指针指向结构体的元素

只分配struct Card_List元数据所需要的内存

struct Card_List *ch = card_heap_unused;
for (int i = 0; i < card_total_cnt; i++) {
ch->next = malloc(sizeof(struct Card_List));
ch = ch->next;
ch->card = &cards[i];
ch->next = NULL;
Log(LDEBUG, "初始化卡牌 [%s] [花色 %d - 点数 %d]\n", ch->card->name, ch->card->color, ch->card->point);
card_head_unused_number++;
}

摸牌

维护了一个全局变量card_head_unused_number记录牌堆中剩余牌数量

摸牌阶段

    if (card_head_unused_number >= 2) {
if (p->id == 0) { // 目前只调试玩家摸牌
Touch_Card(p);
Touch_Card(p);
}
} else {
Log(LPANIC, "牌堆数量不够!\n");
}

摸牌函数

void Touch_Card(struct Player *p) {
if (card_heap_unused == NULL) {
Log(LPANIC, "card_heap_unused == NULL");
} struct Card_List *tmp = malloc(sizeof(struct Card_List));
tmp->card = card_heap_unused->next->card; // 将这张牌插入手牌
tmp->next = p->hand_card->next;
p->hand_card->next = tmp;
// 从牌堆中移除
card_heap_unused->next = card_heap_unused->next->next;
card_head_unused_number -= 1; }

入参为摸牌者,将牌堆card_heap_unused顶部的Card移入玩家p的手牌链表hand_card

效果

可以看到,经过摸牌阶段后,正确摸取了牌堆最顶的两张卡牌。

最新文章

  1. 理解Java虚拟机体系结构
  2. .NET高级工程师面试题之SQL篇
  3. 【转】【WPF】WPF 登录窗口关闭时打开主窗口
  4. 用thinkphp进行微信开发的整体设计思考
  5. PNG优化/压缩
  6. 解决下载android sdk慢的问题
  7. DEDE数据库修改
  8. c++ __declspec关键字详细用法
  9. win32收不到F10按键消息解决办法
  10. 【夸QT十一】外来物品:通用脚本帮助Web运行基础Linux命令
  11. .NET中四种常用事物
  12. 本地存储 web storage
  13. 通过jenkins持续集成 github中的代码到 服务器。
  14. 搭建开发环境2)Debian8 安装jdk 1.8
  15. Windows10 VS2017 C++ ini解析(使用simpleini头文件)
  16. 4G通信模块在ARM平台下的应用
  17. 解决css设置背景透明,文字不透明
  18. java 数组(二)
  19. Django - Python3 配置 MySQL
  20. Java发送HTTP POST请求示例

热门文章

  1. 校内测试:T1秋末的落叶(命题人gxl)官方题解
  2. pycharm激活,此方法为永久激活。
  3. jvm之方法内联优化
  4. springboot~通过面向接口编程对控制反转IOC的理解
  5. 操作系统-I/O(1)设备控制器
  6. “路由大当家”OSPF的小秘密
  7. express-session中的saveUninitialized和resave
  8. 你懂RocketMQ 的架构原理吗?
  9. laravel在视图中使用类似于“__PUBLIC__”,“__UPLOADS__”的操作
  10. [PyTorch 学习笔记] 4.3 优化器