Nếu là một người hâm mộ Star Trek, bạn có thể biết rằng Thuyền trưởng Kirk và Ông Spock thường chơi một biến thể của cờ vua có tên là Cờ vua ba chiều hay còn gọi là cờ vua 3D, một trò chơi tương tự như cờ vua tiêu chuẩn nhưng có những điểm khác biệt đáng chú ý. Trong bài viết này, chúng tôi sẽ xây dựng mô hình dữ liệu cho ứng dụng cờ vua 3D cho phép người chơi thi đấu với nhau. Cho chúng tôi biết, Scotty!
Khái niệm về Cờ vua 3D
Mặc dù bản thân cờ vua đã là một trò chơi phức tạp, việc kết hợp bàn cờ và nhiều bộ quân cờ có thể làm tăng đáng kể độ phức tạp của trò chơi.
Trong cờ vua 3D, các bàn cờ được xếp chồng lên nhau thành các lớp song song và các quy tắc di chuyển đặc biệt áp dụng cho các quân cờ nhất định, tùy thuộc vào vị trí của chúng. Ví dụ, những con tốt trên bàn cờ giữa có thể bắt chước hành vi của quân hậu. Các miếng ghép cũng có thể di chuyển từ bảng này sang bảng khác, với một số hạn chế nhất định được áp dụng và bản thân các bảng thậm chí có thể di chuyển xung quanh và xoay. Không có gì ngạc nhiên khi Kirk và Spock rất thích cờ vua 3D — nó đòi hỏi khá nhiều sự khéo léo trong chiến thuật!
Cờ vua ba chiều cũng sai lệch so với cờ vua tiêu chuẩn về các thuộc tính của bàn cờ của nó. Trong cờ vua 3D, có bảy bàn cờ riêng biệt với các thuộc tính khác nhau. Ba trong số các bảng này là 4x4, trong khi bốn bảng còn lại là 2x2. Bạn có thể di chuyển các bảng nhỏ hơn này xung quanh.
Mô hình dữ liệu của chúng tôi hy vọng sẽ bao gồm mọi thứ chúng tôi cần để chơi trò chơi cờ vua 3D trong một ứng dụng web. Chúng tôi sẽ làm việc với giả định rằng mọi thứ đều có thể di chuyển xung quanh và các bảng có thể áp đặt các hạn chế chuyển động khác nhau cho các phần giống nhau. Điều này phải đủ để bao gồm tất cả các biến thể cờ vua 3D có thể có. Hãy bắt đầu ngay với mô hình dữ liệu!
Mô hình dữ liệu
Mô hình dữ liệu của chúng tôi bao gồm ba phần:
- Người chơi và trò chơi
- Thiết lập trò chơi
- Kết quả phù hợp
Bây giờ chúng ta sẽ thảo luận chi tiết hơn về từng lĩnh vực này.
Phần 1:Người chơi và Trò chơi
Mọi thứ trong mô hình của chúng tôi đều liên quan trực tiếp hoặc gián tiếp đến trò chơi. Tất nhiên, một trò chơi không thể tiếp tục mà không có người chơi!
Danh sách tất cả người chơi được lưu trữ trong player
bàn. Trong mô hình của chúng tôi, người chơi là tất cả những người dùng đã đăng ký ứng dụng của chúng tôi. Đối với mỗi người chơi, chúng tôi sẽ lưu trữ các thông tin sau:
-
first_name
vàlast_name
- họ và tên của người chơi tương ứng. -
user_name
- tên người dùng mà người chơi đã chọn, phải là duy nhất. -
password
- giá trị băm của mật khẩu của người chơi. -
nickname
- tên màn hình của người chơi, giống như tên người dùng của họ, phải là duy nhất. -
email
- địa chỉ email của người chơi mà họ sẽ cung cấp trong quá trình đăng ký. Mã cần thiết để hoàn tất quá trình đăng ký sẽ được gửi đến email này. -
confirmation_code
- mã đã được gửi đến địa chỉ email của người chơi để hoàn tất quá trình đăng ký của họ. -
confirmation_date
- dấu thời gian khi người chơi xác nhận địa chỉ email của họ. Thuộc tính này sẽ lưu trữ NULL cho đến khi người chơi xác nhận email của họ. -
current_rating
- xếp hạng hiện tại của người chơi, được tính toán dựa trên hiệu suất của họ so với những người chơi khác. Người chơi sẽ bắt đầu với một số giá trị ban đầu và xếp hạng của họ sẽ tăng hoặc giảm theo cấp bậc của đối thủ và kết quả trò chơi của họ.
Kết quả result
table là một từ điển lưu trữ các giá trị của tất cả các kết quả trò chơi duy nhất có thể có, cụ thể là “in_progress”, “hòa”, “thắng” và “thua”.
Có lẽ bảng quan trọng nhất trong toàn bộ mô hình dữ liệu là game
, nơi lưu trữ thông tin về từng ván cờ 3D. Trong mô hình này, chúng tôi sẽ giả định rằng hai người chơi là con người sẽ cạnh tranh với nhau và họ có thể chọn lưu trạng thái trò chơi hiện tại và tiếp tục sau đó (chẳng hạn như nếu họ muốn thực hiện một động tác mỗi ngày, trong trong trường hợp đó, người chơi sẽ đăng nhập vào ứng dụng, xem nước đi gần đây nhất của đối thủ, nghĩ ra nước đi của họ, thực hiện nước đi của họ và sau đó đăng xuất). Chúng tôi sẽ lưu trữ các giá trị sau trong bảng này:
-
player_id_1
vàplayer_id_2
- tham chiếu đếnplayer
bảng biểu thị cả hai người tham gia trò chơi. Như đã đề cập, chúng tôi cho rằng một trò chơi sẽ hoàn toàn xảy ra giữa hai người chơi là con người. -
number_of_moves
- Biểu thị số lượng nước đi đã được thực hiện cho đến nay trong trò chơi hiện tại. Khi trận đấu bắt đầu, con số này được đặt thành 0 và tăng lên 1 mỗi khi người chơi di chuyển. -
player_id_next
- tham chiếu đến người chơi phải thực hiện bước tiếp theo trong trò chơi hiện tại. -
result_id_1
vàresult_id_2
- tham chiếu đếnresult
bảng lưu trữ kết quả của trò chơi cho mỗi người chơi. -
player_1_points_won
vàplayer_2_points_won
- biểu thị số điểm mà người chơi đã được thưởng, phù hợp với kết quả của trò chơi.
Chúng ta sẽ thảo luận về cách người chơi có thể theo dõi tất cả các bước di chuyển trong phần Trận đấu ở gần cuối bài viết này. Bây giờ, chúng ta sẽ chuyển sang Thiết lập trò chơi.
Phần 2:Thiết lập trò chơi
Phần Thiết lập Trò chơi chứa mô tả về tất cả các bàn cờ và quân cờ trong cờ vua 3D, cũng như danh sách tất cả các nước đi hợp pháp mà người chơi có thể thực hiện.
Như chúng tôi đã đề cập trước đó, cờ vua 3D thường liên quan đến nhiều hơn một bàn cờ. Các bảng này có thể tuân theo kích thước tiêu chuẩn 8x8 với các vị trí cố định, nhưng điều đó không cần thiết. Danh sách tất cả các bảng được lưu trữ trong board
bàn. Đối với mỗi bảng, chúng tôi sẽ lưu trữ một board_name
duy nhất , starting_position
của bảng liên quan đến tọa độ 3D đã chọn của chúng tôi và tất cả các details
bổ sung .
Tiếp theo, chúng tôi sẽ xác định tất cả các loại quân cờ có thể xuất hiện trên bàn cờ của chúng tôi. Để làm như vậy, chúng tôi sẽ sử dụng piece_type
từ điển. Ngoài khóa chính, từ điển này chỉ chứa một giá trị duy nhất, type_name. Đối với một bộ cờ tiêu chuẩn, chúng tôi hy vọng sẽ thấy các giá trị “tốt”, “quân”, “hiệp sĩ”, “giám mục”, “vua” và “nữ hoàng” trong từ điển này.
Danh sách tất cả các quân cờ riêng lẻ được sử dụng trong trò chơi cờ vua 3D được lưu trữ trong piece
bàn. Đối với mỗi phần, chúng tôi sẽ lưu trữ các thông tin sau:
-
piece_name
- một tên duy nhất mô tả loại mảnh và vị trí bắt đầu của nó. -
starting_position
- một giá trị biểu thị bảng chính xác và hình vuông mà miếng được định vị ban đầu. -
board_id
- tham chiếu đến bảng mà quân cờ được định vị ban đầu. -
piece_type_id
- một tham chiếu biểu thị loại sản phẩm.
Cuối cùng, chúng tôi sẽ sử dụng move_type
bảng để lưu trữ danh sách tất cả các động tác có thể mà các quân cờ có thể thực hiện trên bảng của chúng tôi (cũng như bất kỳ động thái nào mà chính bảng có thể thực hiện). Nhớ lại phần giới thiệu rằng một số bảng nhất định áp dụng các quy tắc chuyển động đặc biệt cho các quân cờ của chúng. Đối với mỗi động thái, chúng tôi sẽ xác định những điều sau:
-
type_name
- tên mà chúng tôi sẽ sử dụng để biểu thị nước đi đã được thực hiện, sẽ không phải là một giá trị duy nhất (ví dụ:chúng tôi có thể "cầm đồ tiến 1 ô về phía trước" nhiều lần nếu cần). -
piece_type_id
- tham chiếu đến loại mảnh đã được di chuyển. Nếu giá trị này xảy ra là NULL, thì chuyển động liên quan đến toàn bộ bảng chứ không phải một phần cụ thể. -
board_id
- Biểu thị bàn cờ mà nước đi này sẽ diễn ra (nếu một quân cờ đang di chuyển). Nếu bản thân bàn cờ đang di chuyển, giá trị này đương nhiên sẽ đại diện cho bàn cờ đang được di chuyển. Cùng với hai thuộc tính trước đó, thuộc tính này tạo thành khóa duy nhất cho bảng này. -
is_piece_move
vàis_board_move
- biểu thị liệu một nước đi liên quan đến quân cờ hay bàn cờ. Chỉ một trong các cờ này có thể được đặt thành true cho một nước đi cụ thể.
Vì có quá nhiều di chuyển và xoay mảnh cần xem xét, chúng tôi sẽ không lưu trữ tất cả các khả năng như vậy trong cơ sở dữ liệu của mình. Thay vào đó, chúng tôi sẽ chỉ lưu trữ các tên di chuyển và triển khai logic thực tế trong chính ứng dụng. Ví dụ:chúng tôi sẽ xác định rằng các con tốt có thể tiến về phía trước một ô vuông, tiến hai ô vuông từ vị trí ban đầu của chúng, yêu cầu các quân theo đường chéo, di chuyển từ bàn cờ này sang bàn cờ khác và di chuyển như một quân hậu trên bàn cờ trung tâm. Vì vậy, chúng tôi sẽ có năm loại nước đi có thể được xác định cho các con tốt, tùy thuộc vào bàn cờ mà chúng được đặt và vị trí hiện tại của chúng.
Phần 3:Kết hợp
Chúng tôi sắp hoàn thành! Phần cuối cùng của mô hình của chúng tôi có tên là Các trận đấu và chứa ba bảng mới mà chúng tôi sẽ sử dụng để theo dõi lịch sử chuyển động trong trò chơi cờ vua 3D. Các bảng còn lại chỉ là bản sao của các bảng khác từ mô hình dữ liệu của chúng tôi, giúp tránh quan hệ chồng chéo. Chúng tôi cũng sẽ lưu trữ vị trí hiện tại của tất cả các bảng và các mảnh của chúng trong khu vực này. Hãy đi sâu vào.
move
bảng thực sự là bảng phức tạp nhất trong phần này. Nó chứa danh sách tất cả các bước di chuyển được thực hiện trong một trò chơi. Bảng này sẽ hiển thị danh sách tất cả các nước đi cho người chơi, sau này có thể được sử dụng để xem lại hoặc phân tích trận đấu. Đối với mỗi lần di chuyển, chúng tôi sẽ lưu trữ những điều sau:
-
game_id
- tham chiếu đếngame
trong đó động thái đã được thực hiện. -
player_id
- tham chiếu đếnplayer
người đã thực hiện. -
move_in_the_game
- số thứ tự của lần di chuyển. Con số này, kết hợp với vị trí bắt đầu của quân và tất cả các nước đi khác, có thể được sử dụng để tạo lại toàn bộ trò chơi. Ý tưởng là cho phép người chơi mô phỏng trận đấu sau khi hoàn thành để họ có thể phân tích kết quả của trận đấu. -
piece_id
- tham chiếu đếnpiece
đã được chuyển đi. Điều này giúp bạn dễ dàng theo dõi chuyển động của một tác phẩm từ đầu đến cuối (chủ yếu cho mục đích phân tích). -
piece_type_id
- tham chiếu đến loại mảnh đã được di chuyển. Mặc dù tham chiếu của một quân cờ sẽ luôn không đổi, nhưng loại của nó có thể thay đổi trong suốt trò chơi (chẳng hạn như nếu một con tốt được thăng hạng). Nếu chúng tôi đang di chuyển bảng, thuộc tính này sẽ chứa giá trị NULL. -
board_id
- tham chiếu đếnboard
nơi di chuyển diễn ra. -
move_notation
- ký hiệu đã thống nhất mà chúng tôi sẽ sử dụng để thể hiện các động thái.
Hai bảng còn lại cho phép chúng tôi lưu trữ ảnh chụp nhanh về trạng thái trò chơi hiện tại trong cơ sở dữ liệu, điều này rất hữu ích nếu người chơi muốn tiếp tục trò chơi sau đó.
current_board_position
được sử dụng để lưu trữ vị trí của tất cả các bảng trong hệ tọa độ 3D của chúng tôi. Điều này là cần thiết cho các trò chơi cờ vua 3D trong đó ít nhất một bàn cờ có thể thay đổi vị trí của nó. Đối với mỗi bản ghi trong bảng này, chúng tôi sẽ lưu trữ tham chiếu đến trò chơi và bảng liên quan, cũng như ký hiệu về vị trí của bảng. Hai cặp thuộc tính cụ thể, game_id
+ board_id
và game_id
+ position_notation
, tạo thành các khóa duy nhất cho bảng này.
Bảng cuối cùng của chúng tôi là current_piece_position
, nơi lưu trữ các tham chiếu đến trò chơi có liên quan, một phần cụ thể, loại của phần và ký hiệu vị trí cho phần đó. Chúng tôi sẽ lại có hai cặp thuộc tính đóng vai trò là khóa duy nhất cho bảng này:game_id
và piece_id
ghép nối và game_id
và position_notation
cặp.
Kết luận
Đó là về mô hình dữ liệu này — chúng tôi tự hào thông báo rằng Đội trưởng Kirk và Ông Spock hiện có thể chơi cờ vua 3D trên máy tính!
Bạn có đề xuất nào để cải thiện mô hình dữ liệu của chúng tôi không? Hãy để lại bình luận của bạn dưới đây. Sống lâu và thịnh vượng ??