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 ...
随机推荐
- Linux域名服务器部署
环境:vmware workstation 系统:Red Hat7.4 DNS服务部署: IP地址:192.168.100.151 DNS:192.168.100.15 ...
- IOS 崩溃原因统计 2014-07-12 10:13
注意: 1,释放自己的autorelease对象,app会crash: 2,释放系统的autorelease对象,app会crash: 第一种 情况有现象如下: 声明一个 对象 A* obj:把o ...
- windows服务器下,mysql运行一段时间之后忽然无法连接,但是mysql服务启动正常
出现这种情况以前都是重启服务器可以解决,但是治标不治本,一段时间之后仍然会出现此问题. 此问题不是mysql应用程序的问题而是windows server system 的配置问题.因此需要修改win ...
- PythonCrashCourse 第四章习题
Python 从入门到实践第四章习题 4.1想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称都打印出来 修改这个for 循环,使其打印包含比萨名称的句子,而不仅仅 ...
- 洛谷P1057 传球游戏 完美错觉(完美错解)
//作者:pb2 博客:https://www.luogu.com.cn/blog/pb2/ 或 http://www.cnblogs.com/p2blog //博客新闻1:"WPS开机自启 ...
- 冒泡排序(Bubble Sorting)
基本介绍 时间复杂度O(n^2) 冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐 ...
- On the Convergence of FedAvg on Non-IID Data
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1907.02189v2 [stat.ML] 8 Oct 2019 Abstract 联邦学习使得大量的边缘计算设备在不共享数 ...
- 配置tomacat外部应用
原来我们的项目一般放置在tomcat文件夹的webapp下,现在我放到外面,也希望tomact可以找到他
- /usr/bin/ld: cannot find -lcrypto
当我们使用openssl里边的函数的时候,需要链接crypto的库 如果找不到,加一个软链接,如下: ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libc ...
- 用python导入20个G的json数据到Mysql数据库
整体思路参考资料:https://blog.csdn.net/layman2016/article/details/79252499 作业:有一个16个G的跟疫情相关的json新闻大数据(articl ...