command三国杀开发日记20200915
一句话进展
- 完善了程序结构,分离.c和.h
- 搭建了6个阶段函数
- 实现了玩家摸牌
- 封装实现了日志打印函数
日志打印
想要区分日志等级,包括DEBUG、INFO、WARN、ERRRO、PANIC,提供统一的日志打印接口,能够按级别打开、关闭日志
大体实现是定义了一个变量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的更多相关文章
- command三国杀开发日记20200914
目前状态 一时脑热开始写的东西,计划完全使用C语言实现,尽量使用通用接口,能够在windows上直接运行 几乎是一穷二白,初步搭建了牌堆.玩家信息接口体,编写了简单的UI函数,能够将玩家信息显示在屏幕 ...
- LayIM.AspNetCore Middleware 开发日记(三)基础框架搭建
前言 在上一篇中简单讲了一些基础知识,例如Asp.Net Core Middleware 的使用,DI的简单使用以及嵌入式资源的使用方法等.本篇就是结合基础知识来构建一个基础框架出来. 那么框架有什么 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 微信小程序开发日记——高仿知乎日报(上)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
随机推荐
- 个人电脑搭建ftp----------------2
个人电脑搭建ftp 从上一次搭建好的局域网继续完成我的后续. 打开windows10 控制面板 点击启用或关闭windows功能 找到Internet Information Services,开启所 ...
- 初学Linux (Linux_note)
根目录:/ /root: 存放root用户相关文件 /home: 存放不同用户的相关文件 /bin: 存放常用命令的目录 /sbin: 要具有一定权限才可以使用的命令 /mnt: 默认挂载光驱和软驱的 ...
- DBeaver链接kerberos安全认证的Phoenix集群
DBeaver链接kerberos安全认证的Phoenix集群 最近公司的CDH集群,启动了kerberos安全认证,所有的用户验证全部需要依赖kerberos来进行.之前的裸奔集群,总算有了一些安全 ...
- SSM项目_Eclipse卡进程 一直loading加载spring-xx.xsd/无法加载SpringXSD文件
你遇到了套娃,请进https:////www.cnblogs.com/steamer/articles/12500645.html查看答案
- js 判断 数组和对象
提方案的时候顺便会引申一下该方法的使用. 一,instanceOf:(可以判断) instanceOf运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性. 也可以这样说 ...
- 学习seo技术要不断地扩大思维和思路
http://www.wocaoseo.com/thread-148-1-1.html 目前学习seo技术的人员是越来越多了,通过查看seo这个词的指数,就能发现一些状况,从最初的每天3 ...
- Linux下如何知道是否有人在使坏?
在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...
- Idea创建maven加载过慢解决方法
添加标签:archetypeCataloginternal问题解决!
- 【Android】时间选择器,选择日期DatePicker 简单详解demo及教程
作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...
- Spine学习六 - 碰撞检测
相信在使用Spine做游戏的时候,肯定会遇到这样的需求: 一个人物有一把大刀,要使用这把大刀去砍怪,伤害检测以这把大刀砍刀怪物为准,那么要怎么在一个看上去就是一体的Spine Object上绑定一个碰 ...