我目前正在尝试使用c创建基于控制台的单人纸牌游戏。我想要一个txt文件来“模拟卡片组”,这意味着配置文件应具有从黑色A,2、3、4 ....到红色J,Q,K ...的所有卡。
我成功读取并标记了我的配置文件,但对于如何将“卡”保存在双向链接列表中一无所知。
这里是我到目前为止编写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct card
{
char color;
int value;
char name[2];
struct card * prev;
struct card * next;
} CARD_TYPE;
int main(int argc, char *argv[])
{
for (int i = 0; i < argc; i++)
{
printf("argv[%d] = %s\n", i, argv[i]);
}
int counter_red = 0;
int counter_black = 0;
char buffer[255];
FILE* path = fopen (argv[1],"r");
if (path == NULL)
{
printf("[ERR] Invalid file!\n");
return 3;
}
while(fgets(buffer, 255, path) != NULL )
{
if (strlen(buffer) == 1) //string is empty
{
continue;
}
CARD_TYPE* temp = malloc(sizeof(CARD_TYPE));//DONT FORGET TO FREE
temp->color = '\0';
temp->name[0] = '\0';
char *read = strtok(buffer," ");
while (read != NULL)
{
if (strcmp (read, "BLACK" ) == 0 )
{
counter_black ++;
}
else if (strcmp (read, "RED" ) == 0 )
{
counter_red ++;
}
printf("%s", read);
read = strtok(0, " ");
}
}
if (counter_black != 13)
{
printf("[ERR] Invalid file!\n");
}
所以现在我要以正确的顺序(与文件中相同的顺序)保存卡。
是否可以一次完成所有这些操作?
非常感谢您的帮助!
答案 0 :(得分:0)
您有一个CARD_TYPE* temp
,需要(命名更好并)填充。您正在穿过缓冲区,然后检查缓冲区中的卡是否为黑色。因此,您需要设置卡的值。
while (read != NULL)
{
if (strcmp (read, "BLACK" ) == 0 )
{
temp->color = // what goes here?
counter_black ++;
然后您需要找出它的卡等级。您需要文件中的更多信息。你是怎样做的? (如果信息不合理怎么办?这件事怎么会失败?)。现在,上一个和下一个指针只是NULL。
然后,您需要将此临时卡添加到双向链接列表中。您可能应该在某个地方声明一个列表。叫它
CARD_TYPE* deck;
卡座一旦设置好,就可以简单地设置为第一张卡。但这是一个清单。因此,您从文件中读取的第二张卡将设置为...。卡去哪儿了? (您将要创建一个单独的功能,以将卡添加到列表中。这会分配一些空间并更新列表并使它保持有效状态。)
您的老师提醒您在使用完所有内存后将其释放。退出程序之前,最好遍历列表并一一释放它。这样,您可以选择此代码并在其他地方使用它,而该代码不会位于main.c的顶部。