# 角色扮演游戲
***
本章用 MongoDB 演示了如何設計角色扮演游戲的數據庫結構,準確來說是具備了角色扮演游戲的基本特征。實際上相關的設計要更復雜和龐大。
首先要考慮存儲玩家角色的基本屬性。
**角色屬性**:主要的固定屬性,如力量,敏捷,智力等參數,還有一些臨時性的屬性,比如 buff 和 Debuff(角色固定屬性的增強和削弱,可能是臨時性或永久性)
**背包**:背包中攜帶的裝備及已經被角色裝備中的武器,防具等
**地理位置**:在游戲中角色所處的地理位置。包含地圖的入口出口等信息
**日常信息**:組隊狀態,工會信息,金幣,元寶余額等
考慮到以上信息的隨時變動,以及同時在線人數。這些數據對讀寫延時都必須降到最低,保證在游戲期間的響應速度。
### MongoDB 設計角色集合
~~~json
{
"_id": "ObjectId(...)",
"name": "血染沙巴克",
"class": "Warrior",
"level": 54,
"health": [600, 600],
"mana": [80, 80],
"gold": 57119223,
"point": 100,
"properties": {
"force": 100,
"dexterity": 60,
"intelligence": 20
},
// "additional": {},
"additional": {
"speed": [100, 30]
// "speed": [-100, 30]
},
"location": {
"x": 238,
"y": 195
},
"map": {
"_id": "ObjectId(...)",
"name": "封魔谷",
"description": "封魔谷",
"exits":{"e": "ObjectId(...)", "w": "ObjectId(...)", "s": "ObjectId(...)", "n": "ObjectId(...)"}
},
// "guild": {},
"guild": {
"_id": "ObjectId(...)",
"name": "葬愛家族"
},
// "team": {},
"team": {
"leader": {
"_id": "ObjectId(...)",
"name": "blablabla"
},
"members": [
{"_id": "ObjectId(...)", "name": "blablabla"},
{"_id": "ObjectId(...)", "name": "血染沙巴克"},
{"_id": "ObjectId(...)", "name": "blablabla2"}
]
},
"armor": [
{"_id": "595b60a5917e874077232d81", "region": "head"},
{"_id": "595b60bb917e8768075db171", "region": "left wrist"},
{"_id": "595b61c4917e87736a72f082", "region": "neck"},
{"_id": null, "region": "right wrist"},
{"_id": null, "region": "left hand"},
{"_id": "595b60ca917e87736a72f081", "region": "right hand"},
{"_id": "595b611e917e87409779a771", "region": "body"},
{"_id": null, "region": "foot"}
],
"weapons": [
{"_id": "595b6051917e87407f617ed1", "hand": "both"}
],
"backpack": [
{"_id": "595b6051917e87407f617ed1", "name": "屠龍", "number": 1, "parameters": {"solidity": 55, "complete": 60, "attack": 110}},
{"_id": "595b61c4917e87736a72f082", "name": "圣戰項鏈", "number": 1, "parameters": {"solidity": 10, "complete": 14}},
{"_id": "595b60bb917e8768075db171", "name": "圣戰手鐲", "number": 1, "parameters": {"solidity": 15, "complete": 22}},
{"_id": "595b60ca917e87736a72f081", "name": "圣戰戒指", "number": 1, "parameters": {"solidity": 10, "complete": 11}},
{"_id": "595b60a5917e874077232d81", "name": "圣戰頭盔", "number": 1, "parameters": {"solidity": 10, "complete": 17}},
{"_id": "595b611e917e87409779a771", "name": "天魔神甲(男)", "number": 1, "parameters": {"solidity": 71, "complete": 75}},
{"_id": "595b62ae917e8740bb77d761", "name": "烏木劍", "number": 1, "parameters": {"solidity": 11, "complete": 11, "attack": 7}},
{"_id": "595b6311917e875c1f1fa7a1", "name": "烏木劍", "number": 1, "parameters": {"solidity": 12, "complete": 12, "attack": 7}},
{"_id": "595b6318917e8768075db172", "name": "萬年雪霜(捆)", "number": 1, "parameters": {"health": 400, "mana": 120, "gold": 1200}},
{"_id": "595b631c917e8742836885a1", "name": "萬年雪霜", "number": 7, "parameters": {"health": 400, "mana": 120, "gold": 200}}
]
}
~~~
接下來我們來逐個介紹一下集合的字段的用途。
#### 基礎信息
| 列名 | 描述 |
| --- | --- |
| id | 主鍵 |
| name | 昵稱 |
| class | 職業 |
| level | 等級 |
| health | 血量(滿/當前) |
| mana | 魔法量(滿/當前) |
| gold | 金幣 |
| point | 元寶 |
| properties.force | 力量 |
| properties.dexterity | 敏捷 |
| properties.intelligence | 智慧 |
| additional.speed | 附加屬性(影響值,持續時間) |
#### 位置與地圖
| 列名 | 描述 |
| --- | --- |
| location.x | 橫向坐標 |
| location.y | 縱向坐標 |
| map._id | 地圖主鍵 |
| map.name | 地圖名稱 |
| map.description | 地圖描述 |
| map.exits | 地圖出口 |
#### 行會與團隊
| 列名 | 描述 |
| --- | ---
| guild._id | 家族主鍵 |
| guild.name | 家族名稱 |
| team.leader._id | 團隊隊長用戶主鍵 |
| team.leader.name | 團隊隊長名稱 |
| team.members | 團隊成員數組 |
#### 裝備和背包
| 列名 | 描述 |
| --- | ---
| armor | 裝備 |
| weapons | 武器 |
| backpack | 背包 |