Pokud jste fanouškem Star Treku, pravděpodobně víte, že kapitán Kirk a pan Spock často hrají variantu šachů zvanou Trojrozměrné šachy nebo 3D šachy, hru, která je podobná standardním šachům, ale s výraznými rozdíly. V tomto článku vytvoříme datový model pro 3D šachovou aplikaci, která hráčům umožní soutěžit proti sobě. Přeneste nás, Scotty!
Koncept 3D šachů
Zatímco šachy samotné jsou již komplexní hrou, kombinování desek a více sad figurek může výrazně zvýšit složitost hry.
Ve 3D šachu jsou desky naskládány do paralelních vrstev a na určité figurky se vztahují zvláštní pravidla pohybu v závislosti na tom, kde se nacházejí. Například pěšci na prostřední desce mohou napodobovat chování dámy. Dílky se také mohou pohybovat z jedné desky na druhou, s určitými omezeními, a desky samotné se mohou dokonce pohybovat a otáčet. Není divu, že si Kirk a Spock tolik užili 3D šachy – vyžaduje to poměrně hodně taktické finesy!
Třídimenzionální šachy se od standardních šachů vymykají také vlastnostmi svých desek. Ve 3D šachu existuje sedm různých desek s různými vlastnostmi. Tři z těchto desek jsou 4x4, zatímco zbývající čtyři desky jsou 2x2. Tyto menší desky můžete přesouvat.
Náš datový model doufejme pokryje vše, co potřebujeme k hraní 3D šachy ve webové aplikaci. Budeme pracovat za předpokladu, že se vše může pohybovat a že desky mohou ukládat různá omezení pohybu na stejné kusy. To by mělo stačit na pokrytí všech možných variant 3D šachu. Pojďme rovnou do datového modelu!
Datový model
Náš datový model se skládá ze tří částí:
- Hráči a hry
- Nastavení hry
- Shody
Nyní probereme každou z těchto oblastí podrobněji.
Část 1:Hráči a hry
Vše v našem modelu přímo nebo nepřímo souvisí s hrami. Samozřejmě, hra nemůže pokračovat bez hráčů!
Seznam všech hráčů je uložen v player
stůl. V našem modelu jsou hráči všichni registrovaní uživatelé naší aplikace. Pro každého hráče uložíme následující informace:
first_name
alast_name
– jméno a příjmení hráče.user_name
– uživatelské jméno zvoleného hráčem, které musí být jedinečné.password
– hash hodnotu hesla hráče.nickname
– uživatelské jméno hráče, které musí být stejně jako jeho uživatelské jméno jedinečné.email
– e-mailovou adresu hráče, kterou poskytne během procesu registrace. Kód potřebný k dokončení procesu registrace bude zaslán na tento e-mail.confirmation_code
– kód, který byl zaslán na e-mailovou adresu hráče za účelem dokončení procesu registrace.confirmation_date
– časové razítko, kdy hráč potvrdil svou e-mailovou adresu. Tento atribut bude ukládat hodnotu NULL, dokud hráč nepotvrdí svůj e-mail.current_rating
– aktuální hodnocení hráče, vypočítané na základě jeho výkonu proti ostatním hráčům. Hráči začnou s nějakou počáteční hodnotou a jejich hodnocení se bude zvyšovat nebo snižovat podle hodností jejich protivníků a jejich herních výsledků.
result
table je slovník, který ukládá hodnoty všech možných jedinečných výsledků hry, jmenovitě „in_progress“, „draw“, „win“ a „lose“.
Snad nejdůležitější tabulkou v celém datovém modelu je game
, která ukládá informace o každé partii 3D šachu. V tomto modelu budeme předpokládat, že dva lidští hráči budou proti sobě soutěžit a že se mohou rozhodnout uložit svůj aktuální herní stav a pokračovat v něm později (např. pokud by chtěli provést jeden tah denně, např. V takovém případě se hráči přihlásí do aplikace, uvidí poslední tah soupeře, vymyslí svůj vlastní tah, provedou svůj tah a poté se odhlásí). V této tabulce uložíme následující hodnoty:
player_id_1
aplayer_id_2
– odkazy naplayer
tabulka označující oba účastníky hry. Jak již bylo zmíněno, předpokládáme, že hra bude probíhat striktně mezi dvěma lidskými hráči.number_of_moves
– udává počet tahů, které byly dosud v aktuální hře provedeny. Na začátku hry je toto číslo nastaveno na 0 a zvyšuje se o 1 pokaždé, když hráč provede tah.player_id_next
– odkaz na hráče, který musí provést další tah v aktuální hře.result_id_1
aresult_id_2
– odkazy naresult
tabulka, která ukládá výsledek hry pro každého hráče.player_1_points_won
aplayer_2_points_won
– označte počet bodů, které hráči získali v souladu s výsledkem hry.
Jak mohou hráči sledovat všechny tahy, probereme v sekci Zápasy na konci tohoto článku. Prozatím přejdeme k nastavení hry.
Část 2:Nastavení hry
Část Nastavení hry obsahuje popis všech desek a figurek ve 3D šachu a také seznam všech legálních tahů, které mohou hráči provést.
Jak jsme již zmínili dříve, 3D šachy často zahrnují více než jednu šachovnici. Tyto desky mohou dodržet standardní rozměry 8x8 s pevnými pozicemi, ale nemusí tomu tak být. Seznam všech nástěnek je uložen v board
stůl. Pro každou desku uložíme jedinečný board_name
, starting_position
desky ve vztahu k námi zvoleným 3D souřadnicím a všechny další details
.
Dále definujeme všechny možné typy figurek, které se mohou objevit na našich šachovnicích. K tomu použijeme piece_type
slovník. Kromě primárního klíče obsahuje tento slovník pouze jednu jedinečnou hodnotu, název_typu. U standardní šachové sady očekáváme, že v tomto slovníku uvidíme hodnoty „pěšec“, „věž“, „jezdec“, „střelec“, „král“ a „královna“.
Seznam všech jednotlivých figurek, které se používají ve hře 3D šachy, je uložen v piece
stůl. U každého kusu uložíme následující informace:
piece_name
– jedinečný název popisující typ kusu a jeho výchozí pozici.starting_position
– hodnota označující přesnou desku a čtverec, na kterém je figurka původně umístěna.board_id
– odkaz na desku, na které je figurka původně umístěna.piece_type_id
– odkaz označující typ kusu.
Nakonec použijeme move_type
tabulka pro uložení seznamu všech možných tahů, které mohou figurky provést na našich deskách (stejně jako všechny tahy, které mohou desky samotné provést). Připomeňme si z úvodu, že některé desky uplatňují na své figurky zvláštní pravidla pohybu. Pro každý pohyb definujeme následující:
type_name
– název, který použijeme k označení provedeného tahu, což nebude jedinečná hodnota (např. „pěšec postoupil o 1 pole vpřed“ tolikrát, kolikrát je potřeba).piece_type_id
– odkaz na typ přesouvaného kusu. Pokud je tato hodnota náhodou NULL, pak se pohyb týká celé šachovnice a ne konkrétní figurky.board_id
– označuje desku, na které se tento tah uskuteční (pokud se šachová figurka pohybuje). Pokud se deska sama pohybuje, bude tato hodnota přirozeně představovat desku, která se pohybuje. Spolu se dvěma předchozími atributy to tvoří jedinečný klíč pro tuto tabulku.is_piece_move
ais_board_move
– označte, zda se tah týká šachové figurky nebo šachovnice. Pouze jeden z těchto příznaků může být pro konkrétní tah nastaven na hodnotu true.
Vzhledem k tomu, že je potřeba zvážit příliš mnoho pohybů a rotací dílků, nebudeme všechny takové možnosti ukládat do naší databáze. Místo toho pouze uložíme názvy přesunů a implementujeme skutečnou logiku v samotné aplikaci. Například definujeme, že pěšci mohou postupovat dopředu o jedno pole, postoupit o dvě pole ze své výchozí pozice, nárokovat si figurky diagonálně, pohybovat se z jedné desky na druhou a pohybovat se jako dáma na centrální desce. Budeme mít tedy pět možných typů tahů definovaných pro pěšce v závislosti na šachovnici, na které jsou umístěni, a jejich aktuální pozici.
Část 3:Shody
Jsme téměř u konce! Poslední část našeho modelu se jmenuje Zápasy a obsahuje tři nové tabulky, které budeme používat ke sledování historie pohybu ve hře 3D šachy. Zbývající tabulky jsou pouze kopiemi jiných tabulek z našeho datového modelu, což pomáhá vyhnout se překrývání vztahů. V této oblasti také uložíme aktuální pozice všech desek a jejich dílků. Pojďme se rovnou ponořit.
move
tabulka je ve skutečnosti nejsložitější tabulkou v této sekci. Obsahuje seznam všech tahů provedených během hry. Tato tabulka zobrazí hráčům seznam všech tahů, které mohou být později použity ke kontrole nebo analýze zápasu. Pro každý pohyb uložíme následující:
game_id
– odkaz nagame
ve kterém byl tah proveden.player_id
– odkaz naplayer
kdo ten krok provedl.move_in_the_game
– pořadové číslo tahu. Toto číslo v kombinaci s výchozí pozicí figurky a všemi ostatními tahy lze použít k obnovení celé hry. Cílem je umožnit hráčům simulovat hru po jejím dokončení, aby mohli analyzovat výsledky zápasu.piece_id
– odkaz napiece
to bylo přesunuto. Díky tomu je snadné sledovat pohyb kusu od začátku do konce (hlavně pro účely analýzy).piece_type_id
– odkaz na typ přesouvaného kusu. Zatímco reference figurky zůstane vždy konstantní, její typ se může v průběhu hry měnit (například když je povýšen pěšec). Pokud posouváme desku, tento atribut bude obsahovat hodnotu NULL.board_id
– odkaz naboard
na kterém se stěhování uskutečnilo.move_notation
– dohodnutý zápis, který budeme používat k reprezentaci tahů.
Zbývající dvě tabulky nám umožňují uložit snímek aktuálního stavu hry v databázi, což je užitečné, pokud si hráči přejí pokračovat ve hře později.
current_board_position
slouží k uložení polohy všech desek v našem 3D souřadnicovém systému. To je nezbytné pro 3D šachové hry, ve kterých může alespoň jedna šachovnice změnit svou pozici. Pro každý záznam v této tabulce uložíme odkaz na související hru a desku a také zápis pozice desky. Dva specifické páry atributů, game_id
+ board_id
a game_id
+ position_notation
, tvoří jedinečné klíče pro tuto tabulku.
Naše poslední tabulka je current_piece_position
, který ukládá odkazy na související hru, konkrétní figurku, typ figurky a označení pozice figurky. Opět budeme mít dva páry atributů, které slouží jako jedinečné klíče pro tuto tabulku:game_id
a piece_id
pár a game_id
a position_notation
pár.
Závěr
To je pro tento datový model vše – s hrdostí oznamujeme, že kapitán Kirk a pan Spock nyní mohou hrát 3D šachy na počítači!
Máte nějaké návrhy na vylepšení našeho datového modelu? Neváhejte a zanechte své komentáře níže. Žít dlouho a prosperovat?