简单RPG的数据库表结构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单RPG的数据库表结构相关的知识,希望对你有一定的参考价值。
我目前正在练习SQLite并制作一个简单的基于文本的RPG,但我需要一些表结构的建议。
到目前为止,我已经提出了一个存储播放器信息的“播放器”表。 “库存”表,连接到“玩家”ID。包含所有项目的“项目”表。
这是我的问题。我有一个“武器”模型,“盾牌”,“胸部”,“腿”等等每个物品类型的设备,每个可容纳50-100项。我应该将所有项目存储在“项目”表的长列表中,还是应该创建子表?像“武器”表,“盾牌”表等,并删除“项目”表?
感谢您的时间!
正确的答案应该是遵循公认的关系数据库设计指南,这很大程度上取决于游戏的全部功能要求。
但是,我建议解决方案既不仅仅是项目列表,也不仅仅是项目类型的单独表格。而是一个项目表,其中有一个“类型”列引用表(武器,装甲,收藏品等)和类型表。
比如说武器有一个力值(它有多大的力量)和一个速度值(它击中的频率),但是护甲只有一个防御值,而且收藏品有一个重量值。项目列表可能是相当复杂的事情,即在这个简单的场景中,有4个额外的列,具有相当多的冗余,即可收集和装甲仅使用25%,而武器为50%,所以也许你可以引入更复杂的处理只使用2列。
SQLite明智的表可能是: -
CREATE TABLE IF NOT EXISTS rpg_player (_id INTEGER PRIMARY KEY, player_name TEXT);
CREATE TABLE IF NOT EXISTS rpg_item(_id INTEGER PRIMARY KEY, type_reference INTEGER, item_subtype_reference INTEGER, UNIQUE(type_reference,item_subtype_reference));
CREATE TABLE IF NOT EXISTS rpg_inventory(player_id INTEGER, item_id INTEGER, number_held INTEGER, PRIMARY KEY(player_id, item_id)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS rpg_item_types(_id INTEGER PRIMARY KEY, type_name TEXT, type_flags INTEGER);
CREATE TABLE IF NOT EXISTS rpg_weapon(weapon_id INTEGER PRIMARY KEY, weapon_name TEXT, weapon_flags INTEGER, weapon_force INTEGER, weapon_speed INTEGER);
CREATE TABLE IF NOT EXISTS rpg_armour(armour_id INTEGER PRIMARY KEY, armour_name TEXT, armour_flags INTEGER, armour_defence INTEGER);
CREATE TABLE IF NOT EXISTS rpg_collectable(collectable_id INTEGER PRIMARY KEY, collectable_name TEXT, collectable_flags INTEGER, collectable_weight INTEGER);
这些说法填充为: -
Player Table
Item Table
主项目表适用于容易引用的所有项目。 (例如在库存中)。一个条目有它自己的unqiue id引用类型(武器,护甲.....)然后子类型表中的项目: -
- 第一行的唯一id为1,(第1列)该项为2型(第2列)(rpg_item_types表中的id 2)(Armor),是id为5的盔甲项目(第3列) )在rpg_armour表(Arm Thinggies)中。
- 同样,第3项是武器(第1列是1,因此类型1),它是武器表中2(大剑)中具有id的武器。
- 仅引用其他表,但所有项都具有唯一ID
type_reference
是类型,而item_subtype_reference
是相应类型表(武器,盔甲,collecatble)项目的id
。- 设置表Constraint,以便type_reference和item_subtype_reference的组合必须是唯一的
UNIQUE(type_reference,item_subtype_reference)
Inventory Table
Item Types
Sub Item Tables
用于模拟项目细节的表格,例如rpg_weapon有一个weapon_force和weapon_speed列,而rpg_armour只有一个armour_defence列
您可以使用以下内容创建项目的简单列表(输出方式): -
--LIST ALL ITEMS
SELECT
CASE
WHEN type_name = 'Weapon' THEN weapon_name || ' Type (' || type_name || ')'
WHEN type_name = 'Armour' THEN armour_name || ' Type (' || type_name || ')'
WHEN type_name = 'Collectable' THEN collectable_name || ' Type (' || type_name || ')'
END AS description
FROM rpg_item
JOIN rpg_item_types ON type_reference = rpg_item_types._id
LEFT JOIN rpg_weapon ON item_subtype_reference = weapon_id
LEFT JOIN rpg_armour ON item_subtype_reference = armour_id
LEFT JOIN rpg_collectable ON item_subtype_reference = collectable_id
导致 :-
以下将列出所有库存项目: -
SELECT
CASE
WHEN rpg_item.type_reference = 1 THEN 'Player - ' || player_name || ' has ' || weapon_name || ' it is a ' || type_name || ' it has a force of ' || weapon_force
WHEN rpg_item_types.type_name = 'Armour' THEN 'Player - ' || player_name || ' has ' || armour_name || ' it is a ' || type_name || ' with a defence rating of ' || armour_defence
WHEN rpg_item.type_reference = 3 THEN 'Player - ' || player_name || ' has ' || collectable_name || ' it is a ' || type_name || ' it has a weight of ' || collectable_weight
END AS description
FROM rpg_inventory
JOIN rpg_player ON player_id = rpg_player._id
JOIN rpg_item ON rpg_inventory.item_id = rpg_item._id
JOIN rpg_item_types ON rpg_item.type_reference = rpg_item_types._id
LEFT JOIN rpg_weapon ON rpg_item.item_subtype_reference = rpg_weapon.weapon_id
LEFT JOIN rpg_armour ON rpg_item.item_subtype_reference = rpg_armour.armour_id
LEFT JOIN rpg_collectable ON rpg_item.item_subtype_reference =rpg_collectable.collectable_id
基于上述结果(ooops没有任何人持有的武器): -
一个简单的WHERE
子句(WHERE player_id = ?
)会将列表限制为单个玩家。
- 例如
WHERE player_id = 2
只会列出Fredrica的库存。
您可能希望复制并粘贴上面的内容并在SQLite工具中使用它,周围有很多(我个人对SQLite Manager非常满意,其他人会推荐其他工具,所有这些都是使用这样的工具完成的) )。您可能很有可能只使用这样的工具来创建核心数据库访问功能。
以上是关于简单RPG的数据库表结构的主要内容,如果未能解决你的问题,请参考以下文章
错误 3002:映射片段中的问题 | c# linq 到实体
ruby 显示如何在RPG中转换为不同数据类型的示例(RPG源保存为Ruby代码以添加语法突出显示)。