【问题标题】:RPG - storing player dataRPG - 存储玩家数据
【发布时间】:2014-06-29 05:39:08
【问题描述】:

鉴于以下树形结构,每个登录的玩家都可以拥有当前和已完成的关卡、每个关卡的任务、每个任务的 NPC 以及每个 NPC 的多个任务的数据...我正在尝试找出最佳方法存储每个玩家当前和已完成的数据。

我之前问过这个问题,虽然细节太多了。有人要求我概括这个问题......所以如果你想了解更多上下文,请参见此处:

RPG - storing player data for semi-complex tree structure

关于我的 RPG 结构的一些信息:

  • 关卡、每个关卡的任务和每个 NPC 的任务按时间顺序完成。
  • NPC 对话和任务对话数据存储在npc_dialog_1.js 文件中的 js 对象中,结构如下:

    var dialog = {
    quests : {
        questName : {   
            NPCName: {
                TaskName:  {
                     "english" : 
                      [
                          "Hello, here is some dialog",
                      ],//more items per task
                }, //more tasks per NPC
            }, //more NPCs per quest
        }, //more quests options per "quests"
    }, //more options in dialog besides "quests" if I want
    };
    

    我将每个 dialog 对象存储在每个地图的单独 npc_dialog_n.js 文件中,我使用 requireJS 检索该文件。这将减少单个 npc_dialog 文件中的混乱情况。

  • 然而,每个任务的 NPC 可以按任何顺序开始...这是试图模仿 GTA 风格的任务队列,因为游戏遵循一般的线性进程,但对于每个任务,您都可以交谈多个 NPC 并随时开始、暂停和恢复 NPC 的任务。

由于玩家可以在给定时间开始、暂停和恢复每个 NPC 的任务,我试图找出存储每个玩家当前和已完成数据的最佳方式。

mfirdaus 推荐了以下具有 M:M 关系 b/t 用户和 npc 的 DB 表......但这会很快加起来,因为每个玩家可以在每个任务中拥有多个 NPC,并且开始了多个任务每个 NPC... 有什么办法绕过这个设置?

我当前的数据库架构:

谢谢

【问题讨论】:

  • @Alex.Ritna 不完全是重复的。这是原始问题的简化版本。不过,不确定是打开一个新问题还是编辑旧问题更好。
  • @JeremyJStarcher 是的,我曾讨论过更新原件。但在过去,人们最终会要求更多的上下文,所以我认为最好只开始一个简化的新问题。
  • @Growler 你想保存每个玩家每个任务的 quest_progress 对吗?然后我建议将您的 quest_data 保存为 userstats 列中的 json_encoded 数据(或制作一个)。
  • @Viscocent 你能解释一下吗?

标签: javascript php mysql storage


【解决方案1】:

选择正确的使用方法

假设你有这个数组:

$player_quest_status = array("quest1" => 100,
                             "quest2" => 90,
                             "quest3" => 50); 

您可以有 2 个选项将这些数组存储到数据库中。

  1. 使用 PHP json_encode()

    $player_quest_status_json = json_encode($player_quest_status);
    //then you can store $player_quest_status_json variable using INSERT.UPDATE 
    

    声明 //编码时的数组:{"quest1":100,"quest2":100,"quest3":100}

    在从数据库中检索值后,使用 json_decode 将其转换回数组。

  2. 使用 PHP serialize()

    $player_quest_status_json = serialize($player_quest_status);
    //array when encoded: a:3{s:6:"quest1";i:100;s:6:"quest2";i:100;s:6:"quest3";i:100;}
    

有关您想使用哪个功能的更多信息:
Preferred method to store PHP arrays (json_encode vs serialize)

虽然我仍然推荐 json,因为它更具可扩展性。


构建你的数组

$player_quest_status = array("player_id" => 1,
                             "level"     => 1,
                             "quests"    => array( 1/*quest_id*/ => array("percent_completed" => 100, 
                                                                          "quest_title"       => "the first quest"),
                                                   2/*quest_id*/ => array("percent_completed" => 80, 
                                                                          "quest_title"       => "the second quest"),
                                                   3/*quest_id*/ => array("percent_completed" => 50, 
                                                                          "quest_title"       => "the 3rd quest")
                                                  )
                             );

$player_npc_status = array("npc"  => array( 1 => array("name"  => "lawrence",
                                                       "tasks" => array( 1 => array("task_title"   => "title 1",
                                                                                    "is_completed" => 1),
                                                                         2 => array("task_title"   => "title 2",
                                                                                    "is_completed" => 1),
                                                                         3 => array("task_title"   => "title 3",
                                                                                    "is_completed" => 0))
                                                      ),
                                            2 => array("name"  => "viscocent",
                                                       "tasks" => array( 1 => array("task_title"   => "title 4",
                                                                                    "is_completed" => 1),
                                                                         2 => array("task_title"   => "title 5",
                                                                                    "is_completed" => 2),
                                                                         3 => array("task_title"   => "title 6",
                                                                                    "is_completed" => 0))
                                                      ),
                                         )

                           );

【讨论】:

  • 数据库会不会像我上面展示的 UserTasks 表一样?
  • @Growler 你可能会添加更多的表,比如 quests 和 npc 来存储元数据。这些将是一次用于填充数组以供首次使用。
【解决方案2】:

我想独立于存储的任务/任务树,存储游戏进度就足够了,只需存储你提到的任务的每个 NPC 的 currentLevel、currentQuest 和完成的任务数。根据您存储它的方式,我将有一个存储当前任务的数组或对象。例如,对于用户 1,它看起来像

var currLevel = 2;
var currQuest = 2;
var currNpc   =2
var subquests = [3,1,3]; //or {"NPC1":3,"NP2":1,"NPC3":3}

//progress task
subquests[currNpc]= subquests[currNpc] ? subquests[currNpc]+1 : 1

//next quest
currQuest++
subquests=[]

因此,根据您的工作流程,您可以通过执行从数组或对象生成 JSON 字符串

var str=JSON.stringify(subquests);  //javascript
$str=json_encode($array);           //PHP

您可以将其存储在数据库中。然后,您可以使用 javascript 或 php(取决于您的工作流程)恢复该值

var subquests=JSON.parse(json_string);  //javascript
$subquests=json_decode($json_string);   //PHP

我想数据库看起来像这个 sqlfiddle http://sqlfiddle.com/#!2/8d436/1/0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2017-05-14
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多