Ако сте фен на Star Trek, вероятно знаете, че капитан Кърк и г-н Спок често играят вариант на шах, наречен триизмерен шах, или 3D шах, игра, която е подобна на стандартния шах, но със забележими разлики. В тази статия ще изградим модел на данни за приложение за 3D шах, което позволява на играчите да се състезават един срещу друг. Излъчи ни, Скоти!
Концепцията за 3D шах
Докато самият шах вече е сложна игра, комбинирането на дъски и множество комплекти фигури може значително да увеличи сложността на играта.
В 3D шах дъските са подредени в успоредни слоеве и за определени фигури се прилагат специални правила за движение, в зависимост от това къде се намират. Например, пешките на средната дъска могат да имитират поведението на дама. Частите също могат да се движат от една дъска на друга, с определени ограничения, а самите дъски могат дори да се движат и да се въртят. Нищо чудно, че Кърк и Спок се наслаждаваха толкова много на 3D шах – това изисква доста тактически финес!
Триизмерният шах също се отклонява от стандартния шах по отношение на свойствата на своите дъски. В 3D шах има седем различни дъски с различни свойства. Три от тези дъски са 4x4, докато останалите четири дъски са 2x2. Можете да местите тези по-малки дъски.
Надяваме се, че нашият модел на данни ще покрие всичко, от което се нуждаем, за да играем игра на 3D шах в уеб приложение. Ще работим при предположението, че всичко може да се движи и че дъските могат да налагат различни ограничения за движение на едни и същи фигури. Това трябва да е достатъчно, за да покрие всички възможни варианти на 3D шах. Нека преминем директно към модела на данни!
Моделът на данните
Нашият модел на данни се състои от три раздела:
- Играчи и игри
- Настройка на играта
- Съвпадения
Сега ще обсъдим всяка от тези области по-подробно.
Раздел 1:Играчи и игри
Всичко в нашия модел е пряко или косвено свързано с игрите. Разбира се, играта не може да продължи без играчи!
Списъкът с всички играчи се съхранява в player
маса. В нашия модел играчите са всички регистрирани потребители на нашето приложение. За всеки играч ще съхраняваме следната информация:
first_name
иlast_name
– съответно името и фамилията на играча.user_name
– потребителското име, избрано от играча, което трябва да е уникално.password
– хеш стойност на паролата на играча.nickname
– екранното име на играча, което, както и неговото потребителско име, трябва да е уникално.email
– имейл адреса на играча, който те ще предоставят по време на процеса на регистрация. Кодът, необходим за завършване на процеса на регистрация, ще бъде изпратен на този имейл.confirmation_code
– кодът, изпратен на имейл адреса на играча, за да завърши процеса на регистрация.confirmation_date
– времевата марка, когато играчът е потвърдил своя имейл адрес. Този атрибут ще съхранява NULL, докато играчът не потвърди имейла си.current_rating
– текущия рейтинг на играча, изчислен въз основа на тяхното представяне срещу други играчи. Играчите ще започнат с някаква първоначална стойност и техните рейтинги ще се увеличават или намаляват в зависимост от ранга на опонентите им и резултатите от играта им.
result
table е речник, който съхранява стойностите на всички възможни уникални резултати от играта, а именно „in_progress“, „draw“, „win“ и „lose“.
Може би най-важната таблица в целия модел на данни е game
, който съхранява информация за всяка игра на 3D шах. В този модел ще приемем, че двама човешки играчи ще се състезават един срещу друг и че могат да изберат да запазят текущото си състояние на играта и да продължат по-късно (например, ако искат да правят един ход на ден, в в този случай играчите ще влязат в приложението, ще видят последния ход на опонента си, ще измислят собствения си ход, ще изпълнят своя ход и след това ще излязат). Ще съхраняваме следните стойности в тази таблица:
player_id_1
иplayer_id_2
– препратки къмplayer
таблица, обозначаваща и двамата участници в играта. Както споменахме, приемаме, че играта ще се проведе строго между двама играчи.number_of_moves
– обозначава броя на ходовете, които са били изпълнени до момента в текущата игра. Когато играта започне, това число се задава на 0 и се увеличава с 1 всеки път, когато играч направи ход.player_id_next
– препратка към играча, който трябва да направи следващия ход в текущата игра.result_id_1
иresult_id_2
– препратки къмresult
таблица, която съхранява резултата от играта за всеки играч.player_1_points_won
иplayer_2_points_won
– обозначава броя точки, които играчите са получили, в съответствие с резултата от играта.
Ще обсъдим как играчите могат да следят всички ходове в секцията Мачове в края на тази статия. Засега ще преминем към настройката на играта.
Раздел 2:Настройка на играта
Разделът за настройка на играта съдържа описание на всички дъски и фигури в 3D шах, както и списък на всички законни ходове, които играчите могат да правят.
Както споменахме по-рано, 3D шахът често включва повече от една дъска. Тези дъски могат да се придържат към стандартните размери 8x8 с фиксирани позиции, но това не е задължително. Списъкът с всички дъски се съхранява в board
маса. За всяка дъска ще съхраняваме уникален board_name
, starting_position
на дъската във връзка с избраните от нас 3D координати и всички допълнителни details
.
След това ще дефинираме всички възможни видове фигури, които могат да се появят на нашите шахматни дъски. За целта ще използваме piece_type
речник. В допълнение към своя първичен ключ, този речник съдържа само една уникална стойност, type_name. За стандартен набор от шах очакваме да видим стойностите „пешка“, „топ“, „кон“, „епископ“, „крал“ и „дама“ в този речник.
Списъкът с всички отделни фигури, които се използват в игра на 3D шах, се съхранява в piece
маса. За всяко парче ще съхраняваме следната информация:
piece_name
– уникално име, описващо типа фигура и началната й позиция.starting_position
– стойност, обозначаваща точната дъска и квадрат, върху които фигурата е първоначално позиционирана.board_id
– препратка към дъската, върху която първоначално е позиционирана фигурата.piece_type_id
– препратка, обозначаваща вида на парчето.
Накрая ще използваме move_type
таблица за съхраняване на списъка с всички възможни ходове, които фигурите могат да направят на нашите дъски (както и всички ходове, които самите дъски могат да направят). Припомнете си от въведението, че някои дъски прилагат специални правила за движение към своите фигури. За всеки ход ще дефинираме следното:
type_name
– име, което ще използваме, за да обозначим направения ход, което няма да бъде уникална стойност (например, можем да имаме „пешка напред с 1 квадрат напред“ толкова пъти, колкото е необходимо).piece_type_id
– препратка към типа парче, което е преместено. Ако тази стойност се окаже NULL, тогава движението се отнася за цяла дъска, а не за конкретно парче.board_id
– обозначава дъската, на която ще се извърши този ход (ако шахматна фигура се движи). Ако самата дъска се движи, тази стойност естествено ще представлява дъската, която се мести. Заедно с два предишни атрибута, това формира уникалния ключ за тази таблица.is_piece_move
иis_board_move
– обозначава дали даден ход се отнася до шахматна фигура или дъска. Само един от тези флагове може да бъде зададен на true за конкретен ход.
Тъй като има твърде много движения и завъртания на фигури, които да разгледаме, няма да съхраняваме всички подобни възможности в нашата база данни. Вместо това просто ще съхраняваме имената на ходовете и ще приложим действителната логика в самото приложение. Например, ще дефинираме, че пешките могат или да напредват с едно поле, напред с две полета от началната си позиция, да претендират фигури по диагонал, да се движат от една дъска на друга и да се движат като дама на централната дъска. Така че ще имаме пет възможни типа ходове, дефинирани за пешките, в зависимост от дъската, на която са поставени, и текущата им позиция.
Раздел 3:Съвпадения
Почти приключихме! Последният раздел на нашия модел се казва Мачове и съдържа три нови таблици, които ще използваме, за да следим историята на движението в игра на 3D шах. Останалите таблици са просто копия на други таблици от нашия модел на данни, което помага за избягване на припокриващи се връзки. Ние също така ще съхраняваме текущите позиции на всички дъски и техните части в тази област. Нека се потопим направо.
Ходът move
таблицата всъщност е най-сложната таблица в този раздел. Той съдържа списък на всички ходове, изпълнени по време на игра. Тази таблица ще покаже списъка с всички ходове на играчите, който по-късно може да се използва за преглед или анализ на мача. За всяко движение ще съхраняваме следното:
game_id
– препратка къмgame
в който е направен преместването.player_id
– препратка къмplayer
който направи преместването.move_in_the_game
– пореден номер на хода. Това число, комбинирано с началната позиция на фигурата и всички други ходове, може да се използва за пресъздаване на цялата игра. Идеята е да се позволи на играчите да симулират играта, след като тя приключи, за да могат да анализират резултатите от мача.piece_id
– препратка къмpiece
това беше преместено. Това улеснява проследяването на движението на парче от началото до края (главно за целите на анализа).piece_type_id
– препратка към типа парче, което е преместено. Докато препратката на фигурата винаги ще остане постоянна, нейният тип може да се променя по време на играта (като например, ако пешка бъде повишена). Ако местим дъската, този атрибут ще съдържа стойност NULL.board_id
– препратка къмboard
на който е извършено преместването.move_notation
– договорена нотация, която ще използваме за представяне на ходове.
Останалите две таблици ни позволяват да съхраняваме моментна снимка на текущото състояние на играта в базата данни, което е полезно, ако играчите желаят да възобновят играта по-късно.
current_board_position
се използва за съхраняване на позицията на всички дъски в нашата 3D координатна система. Това е необходимо за 3D игри на шах, в които поне една дъска може да промени позицията си. За всеки запис в тази таблица ще съхраняваме препратка към съответната игра и дъска, както и обозначение на позицията на дъската. Две специфични двойки атрибути, game_id
+ board_id
и game_id
+ position_notation
, формират уникалните ключове за тази таблица.
Последната ни таблица е current_piece_position
, който съхранява препратки към свързаната игра, конкретна фигура, тип на фигурата и нотация на позицията за фигурата. Отново ще имаме две двойки атрибути, които служат като уникални ключове за тази таблица:game_id
и piece_id
двойка и game_id
и position_notation
чифт.
Заключение
Това е всичко за този модел на данни – с гордост съобщаваме, че капитан Кърк и г-н Спок вече могат да играят 3D шах на компютър!
Имате ли някакви предложения за подобряване на нашия модел на данни? Чувствайте се свободни да оставите вашите коментари по-долу. Живейте дълго и просперирайте ??