一句话进展

  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

效果

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

command三国杀开发日记20200915的更多相关文章

  1. command三国杀开发日记20200914

    目前状态 一时脑热开始写的东西,计划完全使用C语言实现,尽量使用通用接口,能够在windows上直接运行 几乎是一穷二白,初步搭建了牌堆.玩家信息接口体,编写了简单的UI函数,能够将玩家信息显示在屏幕 ...

  2. LayIM.AspNetCore Middleware 开发日记(三)基础框架搭建

    前言 在上一篇中简单讲了一些基础知识,例如Asp.Net Core Middleware 的使用,DI的简单使用以及嵌入式资源的使用方法等.本篇就是结合基础知识来构建一个基础框架出来. 那么框架有什么 ...

  3. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  4. 微信小程序开发日记——高仿知乎日报(上)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  5. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  6. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  7. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  8. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  9. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

随机推荐

  1. python智能图片识别系统(图片切割、图片识别、区别标识)

    @ 目录 技术介绍 运行效果 关键代码 写在最后 技术介绍 你好! python flask图片识别系统使用到的技术有:图片背景切割.图片格式转换(pdf转png).图片模板匹配.图片区别标识. 运行 ...

  2. SpringBoot---关于 WebMvcConfigurerAdapter 过时问题及解决方法

    SpringBoot---关于 WebMvcConfigurerAdapter 过时问题及解决方法 环境: IDEA :2020.1 Maven:3.5.6 SpringBoot: 2.3.2 在Sp ...

  3. Python-Opencv 轮廓常用操作

    Python-Opencv 轮廓常用操作 1.颜色空间转换 使用cv2.cvtColor(input_image ,flag),flag为转换类型 常用的转换类型有: BGR和灰度图的转换使用 cv2 ...

  4. C++ Templates (1.6 但是为什么不...? But, Should't We ...?)

    返回完整目录 目录 1.6 但是为什么不...? But, Should't We ...? 1.6.1 传值还是传引用? Pass by Value or by Reference? 1.6.2 为 ...

  5. ClickHouse 参数配置

    转载自:https://xw.qq.com/cmsid/20200806A0PQ7X00?ADTAG=amp 在 ClickHouse 进程中,CPU 的主频越高越好,通常建议使用 32 以上的机型, ...

  6. Django中views数据查询使用locals()函数进行优化

    优化场景 利用视图函数(views)查询数据之后可以通过上下文context.字典.列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析.但是通过context传递数据可能就存 ...

  7. JavaSE基础--part1

    Java特性和优势 简单.面向对象.可移植性.高性能.分布式.动态性.多线程.安全性.健壮性 Java的三大版本 JavaSE 标准版(应用于桌面程序,控制台开发) JavaME 嵌入式开发(手机,小 ...

  8. Java面试题(Hibernate篇)

    Hibernate 113.为什么要使用 hibernate? 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. Hibernate是一个基于JDBC的主流持久化框架,是一个 ...

  9. mysql图形化工具基本操作

    一.DataType 常见的数据类型: - `int` 整数 - `varchar(len)` 字符串 - `tinyint(1)`布尔值 二.设置字段的特殊标识 - `PK`(`Primary Ke ...

  10. WPF Devexpress控件库中ChartControl--实现不等距x轴

    一.概要 解决问题--ChartControl不等距x轴显示 二.CS代码 用过ChartControl的开发者们应该都知道,ChartControl中设置x轴间距间隔都是固定的数值. 比如(间隔10 ...