gpt4 book ai didi

c - 客户端服务器程序的播放器结构

转载 作者:行者123 更新时间:2023-11-30 14:33:33 25 4
gpt4 key购买 nike

我正在用 C 语言实现一个 anagram 游戏的版本。该程序当然是多客户端服务器类型。
所以我几乎完成了所有的程序,除了一件事。我希望我的程序保留每个连接并在服务器中玩游戏的玩家的历史记录(当客户端连接时,命令行参数之一是玩家的用户名)。
我不知道该怎么做。我的意思是更好的方法和更优化的方法来实现这个。
我是否可以使用这样的玩家列表来做到这一点:

typedef struct player
{
char *username;
int score;
} player_t;

typedef struct playerList
{
int size;
player_t* players_list;
} playerList_t;

或者这样做更好:

struct Player
{
char *username;
int score;
Player *next;
};

或者还有比这些更好的其他方法。
当然,我想将这些数据存储到一个文件中,以便在服务器崩溃的情况下,我不会丢失数据。
预先感谢您。

最佳答案

我推荐你使用Linux内核双向链表,因为它的计算复杂度为O(1),而且速度非常快。

你可以在 Linux kernel doubly linked-list for user space 中找到提到的用户空间实现

需要一些时间来理解它;但在那之后你将永远不会实现老式的链表。例如,您可以看到 my question

一些优点是:

  • 无需实现您自定义的链表搜索、拉取、推送等。所有用于列表操作的东西,例如搜索、替换、添加、删除、组合...都已实现在list.h
  • list.h 的列表操作速度(计算复杂度)为 O(1),这意味着链表结构有多大并不重要;当您扩大结构时,整个列表中的搜索不会增加
  • 每次你想从头开始添加一个新的链表,即一个基于新的typedef结构的新链表,你不需要实现列表操作(搜索,添加、删除、...) 不再。您需要做的所有事情只是将新行 struct list_head myLinkedList 添加到您的新结构中。那么所有其他工作都已经完成了:),这是代码扩展的一个很酷的功能

对于您的情况,我建议这样做:

#include "list.h"

struct player
{
char *username;
int score;
struct list_head _list;
};

int main()
{
LIST_HEAD(players_list);
struct player p1 = {.username = "lolo", .score = 100};

list_add_tail(&p1._list, &players_list);

struct player *iter;
list_for_each_entry(iter, &players_list, _list)
{
printf("name = %s, data = %d\n", iter->username, iter->score);
}
}

关于c - 客户端服务器程序的播放器结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59250166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com