Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Trò chơi MMO và Thiết kế Cơ sở dữ liệu

Thành thật mà nói:tất cả chúng ta đều thích chơi trò chơi, đặc biệt là trên máy tính của mình. Cho đến khi Internet trở nên phổ biến, hầu hết chúng ta đều chơi trò chơi máy tính một mình, thường là chống lại các đối thủ AI. Nó rất thú vị, nhưng ngay sau khi bạn nhận ra cách thức hoạt động của cơ chế gameplay, trò chơi đã mất đi phần lớn sự kỳ diệu của nó.

Sự phát triển của Internet chuyển trò chơi trực tuyến. Giờ đây, chúng ta có thể đấu với đối thủ là con người và kiểm tra kỹ năng của mình trước chúng. Không còn chơi vẹt nữa!

Sau đó, các trò chơi trực tuyến nhiều người chơi (MMO) xuất hiện và thay đổi mọi thứ. Hàng nghìn người chơi đã tìm thấy mình trong cùng một vũ trụ trò chơi, cạnh tranh tài nguyên, đàm phán, giao dịch và chiến đấu. Để làm cho những trò chơi như vậy trở nên khả thi, cần phải có một cấu trúc cơ sở dữ liệu có thể lưu trữ tất cả các thông tin liên quan.

Trong bài viết này, chúng tôi sẽ thiết kế một mô hình kết hợp các yếu tố phổ biến nhất được tìm thấy trong các trò chơi MMO. Chúng ta sẽ thảo luận về cách sử dụng nó, những hạn chế của nó và những cải tiến có thể có.

Giới thiệu về Mô hình Dữ liệu cho Trò chơi MMO

Có rất nhiều trò chơi MMO rất phổ biến hiện nay, và chúng liên quan đến tất cả các loại kịch bản. Ở đây tôi sẽ tập trung vào các trò chơi chiến lược như Ogame , Travian , Sparta : War of Empires Imperia Online . Những trò chơi này thiên về lập kế hoạch, xây dựng và lập chiến lược, chứ không thiên về hành động trực tiếp.

Các trò chơi MMO lấy bối cảnh ở các vũ trụ khác nhau, khác nhau về mặt hình ảnh và sử dụng ít nhiều các tùy chọn lối chơi khác nhau. Tuy nhiên, một số ý tưởng vẫn giống nhau. Người chơi cạnh tranh cho các vị trí, chiến đấu cho họ và hình thành liên minh với (và chống lại) những người chơi khác. Họ xây dựng cấu trúc, thu thập tài nguyên và nghiên cứu công nghệ. Họ xây dựng các đơn vị (chẳng hạn như chiến binh, xe tăng, thương nhân, v.v.) và sử dụng chúng để giao dịch với đồng minh hoặc chiến đấu với đối thủ. Tất cả những điều đó cần được hỗ trợ trong cơ sở dữ liệu của chúng tôi.

Chúng ta có thể coi những trò chơi này là trò chơi hội đồng trực tuyến với nhiều ô vuông được lập chỉ mục. Mỗi ô vuông có thể có nhiều hành động khác nhau được kết hợp với nó; một số hành động sẽ bao gồm nhiều ô vuông - ví dụ:khi chúng tôi di chuyển các đơn vị hoặc tài nguyên từ vị trí này sang vị trí khác.




Cơ sở dữ liệu được chia thành năm lĩnh vực chính:

  • Players / Users
  • Alliances
  • Locations and Structures
  • Research and Resources
  • Units

Bảy bảng chưa nhóm còn lại có liên quan đến các đơn vị và mô tả vị trí đơn vị cũng như các chuyển động trong trò chơi. Chúng tôi sẽ xem xét từng lĩnh vực này chi tiết hơn, bắt đầu với Người chơi Liên minh .

Người chơi và Liên minh

Không nghi ngờ gì nữa, người chơi là phần quan trọng nhất của bất kỳ trò chơi nào.

player bảng chứa danh sách tất cả người chơi đã đăng ký tham gia vào một phiên bản trò chơi. Chúng tôi sẽ lưu trữ tên người dùng, mật khẩu và tên hiển thị của người chơi. Chúng sẽ được lưu trữ trong user_name , passwordnickname các thuộc tính tương ứng.

Người dùng mới sẽ cần cung cấp địa chỉ email trong khi đăng ký. Một mã xác nhận sẽ được tạo và gửi cho họ, họ sẽ trả lời. Chúng tôi sẽ cập nhật confirmation_date khi người dùng xác minh địa chỉ email của họ. Vì vậy, bảng này có ba khóa duy nhất:user_name , nicknameemail .

Mỗi khi người dùng đăng nhập, một bản ghi mới sẽ được thêm vào login_history bàn. Tất cả các thuộc tính trong bảng này là tự giải thích. logout_time là cụ thể. Nó có thể là NULL khi phiên hiện tại của người dùng đang hoạt động hoặc khi người dùng thoát khỏi trò chơi (mà không đăng xuất) do sự cố kỹ thuật. Trong login_data , chúng tôi sẽ lưu trữ các chi tiết đăng nhập như vị trí địa lý, địa chỉ IP của người chơi cũng như thiết bị và trình duyệt mà họ sử dụng.

Hầu hết các trò chơi MMO cho phép chúng tôi hợp tác với những người chơi khác. Một trong những hình thức hợp tác tiêu chuẩn của người chơi là liên minh. Người chơi chia sẻ “dữ liệu cá nhân” trong trò chơi của họ (trạng thái trực tuyến, kế hoạch, vị trí của các thành phố và thuộc địa của họ, v.v.) với những người khác để hưởng lợi từ các hành động của đồng minh và vì điều đó.

alliance bảng lưu trữ thông tin cơ bản về liên minh trò chơi. Mỗi người có một alliance_name duy nhất mà chúng tôi sẽ lưu trữ. Chúng tôi cũng sẽ có một trường, date_founded , cửa hàng khi liên minh được thành lập. Nếu một liên minh bị giải tán, chúng tôi sẽ lưu trữ thông tin đó trong date_disbanded thuộc tính.

alliance_member bảng liên quan đến người chơi với các liên minh. Người chơi có thể tham gia và rời khỏi cùng một liên minh nhiều hơn một lần. Do đó, player_id - alliance_id cặp không phải là một khóa duy nhất. Chúng tôi sẽ giữ thông tin về thời điểm người chơi tham gia liên minh và thời điểm (nếu) họ rời đi trong date_fromdate_to lĩnh vực. membership_type_id thuộc tính là một tham chiếu đến membership_type từ điển; nó lưu trữ cấp độ quyền hiện tại của người chơi trong liên minh.

Quyền của người chơi trong liên minh có thể thay đổi theo thời gian. membership_actions , membership_typeactions_allowed các bảng cùng nhau xác định tất cả các quyền có thể có cho các thành viên liên minh. Mô hình này không cho phép người chơi xác định các cấp quyền của riêng họ trong liên minh, nhưng điều đó có thể được thực hiện đủ dễ dàng bằng cách thêm các bản ghi mới trong membership_type từ điển và lưu trữ thông tin về những liên minh mà chúng có liên quan.

Tóm lại:các giá trị được lưu trữ trong các bảng này được chúng tôi xác định trong quá trình thiết lập ban đầu; chúng sẽ chỉ thay đổi nếu chúng tôi giới thiệu các tùy chọn mới.

membership_history bảng lưu trữ tất cả dữ liệu liên quan đến vai trò hoặc quyền của người chơi trong liên minh, bao gồm phạm vi khi các quyền này hợp lệ. (Ví dụ:anh ta có thể có quyền "mới làm quen" trong một tháng và sau đó là "tư cách thành viên đầy đủ" kể từ thời điểm đó.) date_to thuộc tính NULLable vì quyền hiện đang hoạt động vẫn chưa kết thúc.

membership_actions từ điển chứa danh sách mọi hành động mà người chơi có thể thực hiện trong liên minh. Mỗi hành động có action_name riêng của nó và logic trò chơi được xây dựng xung quanh những cái tên này. Chúng tôi có thể mong đợi các giá trị như “xem danh sách thành viên” , “xem trạng thái của thành viên” “gửi tin nhắn” tại đây.

membership_type từ điển chứa các tên riêng của các nhóm hành động được sử dụng trong trò chơi. actions_allowed bảng chỉ định các hành động cho các loại thành viên. Mỗi hành động chỉ có thể được gán cho một loại một lần. Do đó, membership_action - membership_type cặp tạo thành khóa duy nhất cho bảng này.

Vị trí và cấu trúc

Địa điểm trò chơi là khu vực mà người chơi thu thập tài nguyên và xây dựng các cấu trúc và đơn vị. Một số trò chơi có phạm vi vị trí có thể được xác định trước, trong khi những trò chơi khác có thể cho phép người dùng xác định vị trí của riêng họ.

Trong không gian 3D, các vị trí có thể được xác định bằng tọa độ [x:y:z]. Nếu một trò chơi có phạm vi được xác định trước, trò chơi đó có thể không cho phép người chơi sử dụng bất kỳ vị trí nào ngoài phạm vi [0:1000] cho cả ba trục, vì vậy chúng tôi bị giới hạn trong khoảng không gian 1000 * 1000 * 1000.

Mặt khác, có thể chúng tôi muốn cho phép người chơi nhập tọa độ chính xác của vị trí mới của họ - ví dụ:[1001:2073:4] - và chúng tôi muốn trò chơi xử lý nó cho họ.

Chúng tôi sẽ giữ một danh sách tất cả các vị trí được sử dụng trong một phiên bản trò chơi của chúng tôi ở location bàn. Mỗi địa điểm đều có tên riêng, nhưng những cái tên đó không phải là duy nhất. Mặt khác, coordinates thuộc tính chỉ được chứa các giá trị duy nhất. Tọa độ vị trí được lưu trữ dưới dạng giá trị văn bản, vì vậy chúng tôi có thể lưu trữ tọa độ cho trò chơi 3D dưới dạng [112:72:235]. Tọa độ cho trò chơi 2D có thể được lưu trữ dưới dạng <1102:98>.

Trong một số trò chơi, các địa điểm sẽ có một số ô vuông được sử dụng để đặt các cấu trúc hoặc đơn vị. Chúng tôi sẽ giữ thông tin đó theo thứ nguyên dimension thuộc tính, là một trường văn bản. Thứ nguyên có thể đơn giản là số ô vuông trong lưới 2D hoặc 3D. player_id thuộc tính lưu trữ thông tin về chủ sở hữu hiện tại của vị trí đó. Nó có thể là KHÔNG khi các vị trí được xác định trước và người chơi cạnh tranh để chiếm chúng.

structure bảng chứa danh sách tất cả các cấu trúc mà chúng ta có thể xây dựng tại các địa điểm trò chơi khác nhau. Các cấu trúc đại diện cho những cải tiến cho phép chúng tôi sản xuất các đơn vị tốt hơn, thực hiện các loại nghiên cứu mới, sản xuất nhiều tài nguyên hơn, v.v. Mỗi cấu trúc được sử dụng trong trò chơi đều có structure_name độc đáo của riêng nó . Một số structure_name có thể có các giá trị là “trang trại”, “mỏ quặng”, “nhà máy năng lượng mặt trời” và “trung tâm nghiên cứu”.

Chúng tôi có thể mong đợi mỗi cấu trúc được nâng cấp nhiều lần, vì vậy chúng tôi cũng sẽ lưu trữ thông tin về cấp độ hiện tại của cấu trúc đó. Mỗi lần nâng cấp sẽ cải thiện kết quả đầu ra của cấu trúc, do đó, nó tạo ra nhiều tài nguyên hơn hoặc cho phép chúng tôi sử dụng các tính năng mới trong trò chơi. Chúng tôi không thể biết trước mức nâng cấp tối đa, vì vậy, chúng tôi sẽ xác định tất cả những thứ liên quan đến cấp (chi phí, thời gian nâng cấp và sản xuất) bằng các công thức. Tất cả các công thức được lưu trữ trong cơ sở dữ liệu là cốt lõi của cơ chế trò chơi và việc điều chỉnh chúng là rất quan trọng đối với sự cân bằng của trò chơi và lối chơi nói chung.

Đó cũng là trường hợp của upgrade_time_formula thuộc tính. Giá trị mẫu cho trường này là * 30 phút” , ở đâu đại diện cho cấp độ mà chúng tôi muốn nâng cấp lên.

Trong hầu hết các trường hợp, có những yêu cầu phải được đáp ứng trước khi người chơi thực hiện một số hành động nhất định. Có thể chúng ta cần hoàn thành một lượng nghiên cứu xác định trước khi có thể xây dựng các cấu trúc mới hoặc ngược lại. Chúng tôi sẽ lưu trữ mức nghiên cứu cần thiết để xây dựng cấu trúc trong prerequisite_research bàn. Các mối quan hệ và cấp độ cấu trúc cần thiết để bắt đầu các nghiên cứu khác nhau được lưu giữ trong prerequisite_structure bàn. Trong cả hai bảng, các khóa ngoại research_idstructure_id được ghép nối để tạo thành một khóa duy nhất. level_required thuộc tính là giá trị duy nhất.

Hai bảng này, prerequisite_researchprerequisite_structure , cũng là cốt lõi của trò chơi.

Đối với mỗi cấu trúc, chúng tôi sẽ xác định danh sách các điều kiện tiên quyết:các cấu trúc khác và cấp độ tối thiểu của chúng mà người chơi phải bắt đầu xây dựng. Chúng tôi sẽ lưu trữ dữ liệu này trong structure_required bàn. Đây, structure_id đại diện cho cấu trúc mà chúng tôi muốn xây dựng; structure_required_id là tham chiếu đến (các) cấu trúc điều kiện tiên quyết và level là mức bắt buộc.

structure_built bảng lưu trữ thông tin về các cấp cấu trúc hiện tại trên một vị trí nhất định. upgrade_ongoing thuộc tính sẽ chỉ được đặt nếu quá trình nâng cấp hiện đang diễn ra, trong khi upgrade_end_time thuộc tính sẽ chứa dấu thời gian sau khi nâng cấp hoàn tất.

structure_formula bảng liên quan đến cấu trúc và tài nguyên. Cặp khóa ngoại của bảng này tạo thành khóa duy nhất của nó. Bảng này cũng có hai thuộc tính văn bản chứa công thức với tham số . Chúng tôi sẽ xác định các công thức này, một công thức cho chi phí và một công thức khác để tạo tài nguyên, trong cơ sở dữ liệu. Chúng sẽ tương tự như upgrade_time_formula . Chúng tôi cần chúng bởi vì chúng tôi phải xác định các nguồn lực được sử dụng để xây dựng mỗi cấu trúc. Chúng tôi cũng cần xác định sản xuất tài nguyên sau khi nâng cấp, nếu cấu trúc tạo ra bất kỳ tài nguyên nào (tức là mỏ quặng sẽ sản xuất * 20 quặng mỗi ngày).

Nghiên cứu và Tài nguyên

Nghiên cứu (hoặc công nghệ) trong trò chơi thường là cần thiết để tạo ra các tính năng khác. Nếu không có các cấp độ nghiên cứu nhất định, không thể xây dựng các cấu trúc hoặc loại đơn vị mới. Nghiên cứu cũng có thể có những yêu cầu riêng. Một trong những cấp độ phổ biến nhất là cấp độ của một cấu trúc nhất định, thường được gọi là “phòng nghiên cứu”. Hoặc có lẽ người chơi cần phải hoàn thành một mức độ nghiên cứu nhất định trước khi họ có thể bắt đầu nghiên cứu mới. Tất cả những yêu cầu này sẽ được xử lý trong phần này. Dưới đây, chúng ta có thể tìm thấy mô hình dữ liệu cho Nghiên cứu và Tài nguyên:

research bảng chứa danh sách tất cả các hành động nghiên cứu có thể có trong trò chơi của chúng tôi. Nó sử dụng cùng một logic với structure bàn. research_name thuộc tính là khóa duy nhất của bảng, trong khi upgrade_time_formula trường chứa biểu diễn văn bản của công thức yêu cầu thời gian nghiên cứu, với là tham số của nó. Mọi tài nguyên cần thiết để nâng cấp đều được xác định trong upgrade_formula được lưu trữ trong research_formula bảng.

Đối với cấu trúc, chúng tôi sẽ xác định danh sách tất cả các nghiên cứu khác và các cấp độ của chúng phải được hoàn thành trước khi chúng tôi có thể bắt đầu một loại nghiên cứu khác. Chúng tôi sẽ lưu trữ dữ liệu này trong research_required bảng, trong đó research_id đại diện cho nghiên cứu mong muốn; research_required_id là tham chiếu đến nghiên cứu tiên quyết và level là mức bắt buộc.

Nghiên cứu liên quan đến từng người chơi và đối với từng người chơi - xem lại ch cặp, chúng tôi phải lưu trữ cấp độ nghiên cứu hiện tại của người chơi và mọi trạng thái nâng cấp đang diễn ra. Chúng tôi sẽ lưu trữ thông tin này bằng cách sử dụng research_level bảng giống như cách mà chúng tôi đã sử dụng structure_built bảng.

Các tài nguyên như gỗ, quặng, đá quý và năng lượng được khai thác hoặc thu thập và sử dụng sau đó để xây dựng các công trình kiến ​​trúc và các cải tiến khác. Chúng tôi sẽ lưu trữ danh sách tất cả các tài nguyên trong trò chơi trong resource từ điển. Thuộc tính duy nhất ở đây là resource_name và nó cũng là khóa duy nhất của bảng.

Để theo dõi số lượng tài nguyên hiện tại trên mỗi vị trí, chúng tôi sẽ sử dụng resources_on_location bàn. Một lần nữa, một cặp khóa ngoại (resource_idlocation_id ) tạo thành khóa duy nhất của bảng, trong khi number thuộc tính lưu trữ các giá trị tài nguyên hiện tại.

Đơn vị và Chuyển động

Các nguồn lực được sử dụng để sản xuất các đơn vị. Các đơn vị có thể được sử dụng để vận chuyển tài nguyên, tấn công người chơi khác hoặc nói chung là cướp bóc và đốt cháy.

Danh sách các loại đơn vị được sử dụng trong trò chơi của chúng tôi được lưu trữ trong unit từ điển chỉ có một giá trị, unit_name; thuộc tính đó là khóa duy nhất của bảng này. Một số đơn vị trò chơi phổ biến là “kiếm sĩ”, “tàu tuần dương”, “tàu chiến”, “máy bay phản lực”, “xe tăng”, v.v.

Chúng ta cần mô tả từng đơn vị với các đặc điểm cụ thể. Danh sách tất cả các đặc điểm có thể có được lưu trữ trong characteristic từ điển. characteristic_name trường chứa một giá trị duy nhất. Các giá trị trong trường này có thể bao gồm:“tấn công”, “phòng thủ” và “điểm trúng đích”. Chúng tôi sẽ chỉ định các đặc điểm cho các đơn vị bằng cách sử dụng unit_characteristic quan hệ. Cặp khóa ngoại của unit_idcharacteristic_id tạo thành khóa duy nhất của bảng. Chúng tôi sẽ chỉ sử dụng một thuộc tính, value , để lưu trữ giá trị mong muốn.

research_unit bảng chứa danh sách tất cả các hoạt động nghiên cứu phải hoàn thành trước khi chúng tôi có thể bắt đầu sản xuất một loại đơn vị nhất định. unit_cost bảng xác định các nguồn lực cần thiết để sản xuất một đơn vị duy nhất. Cả hai bảng đều có các khóa duy nhất bao gồm cặp khóa ngoại (research_id hoặc resources_id kết hợp với unit_id ) và một trường giá trị (costlevel_required ).

Và bây giờ, phần thú vị. Sản xuất rất thú vị, nhưng di chuyển các đơn vị xung quanh và thực hiện hành động thậm chí còn tốt hơn. Chúng tôi đã giới thiệu unit nhưng chúng tôi sẽ giữ nó ở đây vì nó liên quan như thế nào với các bảng khác.

Các đơn vị đóng quân trên một địa điểm hoặc họ đang di chuyển giữa các địa điểm. Thêm player_id trường xác định ai sở hữu vị trí hoặc nhóm đang di chuyển giữa các vị trí.

Nếu các đơn vị chỉ đóng quân tại một vị trí nhất định, chúng tôi sẽ lưu trữ vị trí đó và số lượng các đơn vị đóng quân ở đó. Để làm như vậy, chúng tôi sẽ sử dụng units_on_location bảng.

Khi các đơn vị không đóng quân, chúng sẽ di chuyển xung quanh. Chúng tôi sẽ cần lưu trữ điểm khởi hành và điểm đến của họ. Ngoài ra, chúng ta cần xác định các hành động có thể xảy ra trong quá trình chuyển động. Tất cả các hành động như vậy được lưu trữ trong movement_type từ điển. type_name thuộc tính duy nhất trong khi allows_wait thuộc tính xác định xem một hành động có cho phép đợi ở điểm đích hay không.

Chúng tôi có thể di chuyển một loại đơn vị, nhưng trong hầu hết mọi trường hợp, chúng tôi sẽ di chuyển nhiều đơn vị thuộc một số loại đơn vị khác nhau. Nhóm đó sẽ chia sẻ dữ liệu chung và chúng tôi sẽ lưu trữ chúng trong group_movement bàn. Trong bảng này, chúng tôi sẽ xác định các mục sau:

  • trình phát đã bắt đầu hành động đó
  • loại hành động
  • điểm bắt đầu
  • điểm đến
  • arrival_time tại điểm đến
  • return_time đến điểm xuất phát
  • wait_time tại điểm đến

return_time thuộc tính có thể là NULL nếu đây là hành trình một chiều và wait_time được xác định bởi người chơi. Các đơn vị thuộc một nhóm được xác định bởi các giá trị được lưu trữ trong units_in_group bàn. Cặp khóa ngoại của units_idgroup_moving_id tạo thành khóa duy nhất của bảng. Số lượng các đơn vị cùng loại trong một nhóm được xác định trong number thuộc tính.

Mỗi chuyển động có thể vận chuyển tài nguyên từ vị trí này đến vị trí khác. Do đó, chúng tôi sẽ xác định mối quan hệ nhiều-nhiều giữa group_movementresources những cái bàn. Bên cạnh các khóa chính và khóa ngoài, resources_in_group bảng chỉ chứa number thuộc tính. Trường này lưu trữ lượng tài nguyên mà người chơi di chuyển từ điểm xuất phát đến điểm đến của họ.

Trong hầu hết các trường hợp, người chơi có thể kêu gọi người khác tham gia cuộc phiêu lưu của mình. Để hỗ trợ điều đó, chúng tôi sẽ sử dụng hai bảng:allied_movementallied_groups . Một người chơi sẽ bắt đầu hành động chung và điều đó sẽ tạo ra một bản ghi mới trong allied_movement bàn. Tất cả các nhóm đơn vị tham gia vào một hành động đồng minh được xác định bởi các giá trị được lưu trữ trong allied_groups bàn. Mỗi nhóm chỉ có thể được chỉ định cho một hành động đồng minh một lần, do đó, các khóa ngoại tạo thành khóa duy nhất của bảng này.

Mô hình này cho chúng ta cấu trúc cơ bản cần thiết để xây dựng một trò chơi chiến lược MMO. Nó chứa các tính năng trò chơi quan trọng nhất:địa điểm, cấu trúc, tài nguyên, nghiên cứu và đơn vị. Nó cũng liên quan đến chúng, cho phép chúng tôi xác định các điều kiện tiên quyết trong cơ sở dữ liệu và lưu trữ hầu hết logic trò chơi trong cơ sở dữ liệu.

Sau khi các bảng này được điền, hầu hết logic trò chơi được xác định và chúng tôi không mong đợi các giá trị mới được thêm vào. Hầu hết mọi bảng đều có một giá trị khóa duy nhất, tên đặc điểm hoặc cặp khóa ngoại. Việc thay đổi đặc điểm của đơn vị và công thức sản xuất / chi phí sẽ cho phép chúng tôi thay đổi cân bằng trò chơi trong lớp cơ sở dữ liệu.

Bạn sẽ thay đổi mô hình này như thế nào? Bạn thích gì, và bạn sẽ làm gì khác đi? Hãy cho chúng tôi biết trong phần bình luận!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặc quyền của người dùng cơ sở dữ liệu là gì?

  2. Cách tìm giá trị tối đa trong hàng

  3. Xây dựng một ứng dụng web đơn giản với Bottle, SQLAlchemy và API Twitter

  4. Giới thiệu về TimescaleDB

  5. Cách xóa các bản sao trong SQL