sql >> Databáze >  >> RDS >> Database

Co mají Poker, Blackjack, Belot a Préférence společného s databázemi?

Jak navrhnout dostatečně flexibilní databázi, aby pojala několik velmi odlišných karetních her.

Nedávno jsme si ukázali, jak lze využít databázi k ukládání výsledků deskových her. Deskové hry jsou zábavné, ale nejsou jedinou online verzí klasických her. Velmi oblíbené jsou také karetní hry. Vnášejí do hry prvek štěstí a v dobré karetní hře je mnohem víc než jen štěstí!

V tomto článku se zaměříme na vytvoření datového modelu pro ukládání zápasů, výsledků, hráčů a skóre. Hlavním problémem je zde ukládání dat souvisejících s mnoha různými karetními hrami. Mohli bychom také zvážit analýzu těchto dat, abychom určili vítězné strategie, zlepšili naše vlastní herní dovednosti nebo postavili lepšího AI soupeře.

Čtyři karetní hry, které budeme používat v naší databázi

Protože hráči nemohou ovládat rozdání karet, karetní hry kombinují strategii, dovednosti a štěstí. Tento faktor štěstí dává začátečníkovi šanci porazit zkušeného hráče a díky němu jsou karetní hry návykové. (To se liší od her, jako jsou šachy, které hodně spoléhají na logiku a strategii. Slyšel jsem od mnoha hráčů, že nemají zájem hrát šachy, protože nemohou najít soupeře na své úrovni dovedností.)

Zaměříme se na čtyři známé karetní hry:poker, blackjack, belot (nebo belote) a préférence. Každý z nich má poměrně složitá pravidla a vyžaduje určitý čas na zvládnutí. Poměr štěstí vs. znalostí je také u každé hry jiný.

Níže se rychle podíváme na zjednodušená pravidla a specifika pro všechny čtyři hry. Popisy her jsou poměrně stručné, ale zahrnuli jsme jich dost, abychom ukázali různé herní režimy a různá pravidla, se kterými se během procesu návrhu databáze setkáme.

Blackjack:

  • Sada: Jeden až osm balíčků po 52 kartách; žádné žolíkové karty
  • Hráči: Dealer a 1 nebo více protivníků
  • Použitá jednotka: Obvykle peníze
  • Základní pravidla: Hráči dostanou 2 karty, které vidí pouze oni; dealer dostane dvě karty, jednu lícem nahoru a druhou lícem dolů; každý hráč se rozhodne líznout více karet (nebo ne); dealer losuje jako poslední. Karty mají přiřazené bodové hodnoty v rozmezí od 1 do 11.
  • Možné akce hráče: Hit, Stand, Split, Surrender
  • Podmínka cíle a vítězství: Součet karet hráče je větší než karet dealera; pokud některý hráč překročí 21, tento hráč prohrává.

Poker (Texas Hold’Em):

  • Sada: Standardní (také známý jako francouzský oblek) balíček 52 karet; žádné žolíkové karty. Karty jsou nejčastěji červené a černé barvy.
  • Hráči: Dva až devět; hráči se střídají v rozdávání
  • Použitá jednotka:Obvykle žetony
  • Základní pravidla: Každý hráč začíná rozdáním dvou karet; hráči uzavírají své sázky; tři karty jsou rozdány lícem nahoru uprostřed stolu; hráči znovu uzavírají své sázky; čtvrtá karta se umístí doprostřed a hráči znovu vsadí; poté je položena pátá a poslední karta a je dokončeno poslední kolo sázek.
  • Možné akce hráče: Fold, Call, Raise, Small Blind, Big Blind, Reraise
  • Cíl: Zkombinujte nejlepší možnou kombinaci pěti karet (ze dvou karet v ruce hráče a pěti karet uprostřed stolu)
  • Podmínka vítězství:Obvykle vyhrajete všechny žetony na stole

Belot (chorvatská varianta Belote):

  • Sada: Obvykle tradiční německý nebo maďarský balíček 32 karet; žádné žolíkové karty
  • Hráči: Dva až čtyři; obvykle čtyři hráči ve dvojicích po dvou
  • Použitá jednotka: Body
  • Základní pravidla: Ve hře pro čtyři hráče dostane každý hráč šest karet do ruky a dvě karty lícem dolů; hráči jako první nabídli trumfovou barvu; po určení trumfu vezmou dvě karty lícem dolů a vloží je do ruky; následuje deklarační kolo, během kterého se vyhlašují určité kombinace karet za dodatečné body; hra pokračuje, dokud nejsou použity všechny karty.
  • Možné akce hráče: Pass, Bid Suit, Declaration, Throw Card
  • Cíl pro hand: Vyhrát více než polovinu bodů
  • Podmínka vítězství: Buďte prvním týmem, který získá 1001 nebo více bodů

Přednost:

  • Sada: Nejčastěji tradiční německý nebo maďarský 32karetní balíček; žádné žolíkové karty
  • Hráči: Tři
  • Jednotky: Body
  • Základní pravidla: Všichni hráči dostanou 10 karet; dvě karty „koťátka“ nebo „drápy“ jsou umístěny uprostřed stolu; hráči se rozhodnou, zda chtějí přihazovat na barvu; hráči se rozhodnou hrát nebo ne.
  • Možné akce hráče: Pass, Bid Suit, Play, Don't Play, Throw Card
  • Cíl: Závisí na variantě, kterou hraje Préférence; ve standardní verzi musí dražitel vyhrát celkem šest triků.
  • Podmínka vítězství: Když je součet skóre všech tří hráčů 0, vyhrává hráč s nejnižším počtem bodů.

Proč kombinovat databáze a karetní hry?

Naším cílem je navrhnout databázový model, který by mohl ukládat všechna relevantní data pro tyto čtyři karetní hry. Databázi by mohla využít webová aplikace jako místo pro uložení všech relevantních dat. Chceme uložit počáteční nastavení hry, účastníky hry, akce provedené během hry a výsledek jednoho obchodu, handy nebo triku. Musíme také mít na paměti skutečnost, že k zápasu může být přidružena jedna nebo více dohod.

Z toho, co ukládáme do naší databáze, bychom měli být schopni znovu vytvořit všechny akce, které se během hry odehrály. K popisu podmínek vítězství, herních akcí a jejich výsledků použijeme textová pole. Ty jsou specifické pro každou hru a logika webové aplikace text interpretuje a transformuje podle potřeby.

Rychlý úvod do modelu




Tento model nám umožňuje ukládat všechna relevantní herní data, včetně:

  • Vlastnosti hry
  • Seznam her a zápasů
  • Účastníci
  • Akce ve hře

Protože se hry v mnoha ohledech liší, budeme často používat varchar(256) datový typ k popisu vlastností, pohybů a výsledků.

Hráči, zápasy a účastníci

Tato část modelu se skládá ze tří tabulek a používá se k ukládání dat o registrovaných hráčích, odehraných zápasech a hráčích, kteří se zúčastnili.

player tabulka ukládá údaje o registrovaných hráčích. username a email atributy jsou jedinečné hodnoty. nick_name atribut ukládá jména hráčů.

match tabulka obsahuje všechna relevantní data zápasu. Obecně se zápas skládá z jedné nebo více karetních rozdání (také známých jako kola, handy nebo triky). Všechny zápasy mají před začátkem hry stanovena pravidla. Atributy jsou následující:

  • game_id – odkazuje na tabulku obsahující seznam her (v tomto případě poker, blackjack, belot a préférence).
  • start_time a end_time jsou skutečné časy, kdy zápas začíná a končí. Všimněte si, že end_time může být NULL; nebudeme mít jeho hodnotu, dokud hra neskončí. Pokud je zápas opuštěn před dokončením, zobrazí se end_time hodnota může zůstat NULL.
  • number_of_players – je počet účastníků potřebný k zahájení hry
  • deck_id – odkazuje na balíček použitý ve hře.
  • decks_used – je počet balíčků použitých ke hraní hry. Obvykle bude tato hodnota 1, ale některé hry používají více balíčků.
  • unit_id – je jednotka (body, žetony, peníze atd.), která se používá k hodnocení hry.
  • entrance_fee – počet jednotek potřebných ke vstupu do hry; toto může být NULL, pokud hra nevyžaduje, aby každý hráč začínal s nastaveným počtem jednotek.
  • victory_conditions – určuje, který hráč vyhrál zápas. Použijeme varchar datový typ popisující podmínky vítězství každé hry (tj. první tým, který dosáhne 100 bodů) a nechat aplikaci, aby je interpretovala. Tato flexibilita ponechává prostor pro přidání spousty her.
  • match_result – uloží výsledek zápasu v textovém formátu. Stejně jako u victory_conditions , necháme aplikaci interpretovat hodnotu. Tento atribut může být NULL, protože tuto hodnotu vyplníme ve stejnou dobu, kdy vložíme end_time hodnotu.

participant tabulka ukládá údaje o všech účastnících zápasu. match_id a player_id atributy jsou odkazy na match a player tabulky. Společně tyto hodnoty tvoří alternativní klíč tabulky.

Většina her střídá, který hráč nabídne nebo hraje jako první. Obvykle v prvním kole je hráč, který hraje první (zahajující hráč), určen pravidly hry. V dalším kole půjde jako první hráč nalevo (nebo někdy napravo) od původního otevíracího hráče. Použijeme initial_player_order atribut k uložení pořadového čísla hráče, který otevírá první kolo. match_id a initial_player_order atributy tvoří další alternativní klíč, protože dva hráči nemohou hrát současně.

score atribut se aktualizuje, když hráč dokončí zápas. Někdy to bude ve stejný okamžik pro všechny hráče (např. belot nebo přednost) a někdy, když zápas stále probíhá (např. poker nebo blackjack).

Akce a typy akcí

Když přemýšlíme o akcích, které mohou hráči provést v karetní hře, uvědomíme si, že musíme uložit:

  • Jaká byla akce
  • Kdo provedl tuto akci
  • Kdy (ve které dohodě) k akci došlo
  • Které karty byly při této akci použity

action_type table je jednoduchý slovník, který obsahuje názvy akcí hráčů. Některé možné hodnoty zahrnují dobrat kartu, zahrát kartu, předat kartu jinému hráči, zkontrolovat a navýšit.

V action tabulky, uložíme všechny události, které se staly během obchodu. deal_id , card_id , participant_id a action_type_id jsou odkazy na tabulky, které obsahují hodnoty rozdání, účastník karty a typ akce. Všimněte si, že participant_id a card_id mohou být hodnoty NULL. Důvodem je skutečnost, že některé akce neprovádějí hráči (např. dealer si lízne kartu a položí ji lícem nahoru), zatímco některé karty nezahrnují (např. navýšení v pokeru). Potřebujeme uložit všechny tyto akce, abychom mohli znovu vytvořit celý zápas.

action_order atribut ukládá pořadové číslo akce ve hře. Například otevírací nabídka bude mít hodnotu 1; další nabídka by měla hodnotu 2 atd. Nemůže se současně uskutečnit více než jedna akce. Proto deal_id a action_order atributy společně tvoří alternativní klíč.

action_notation atribut obsahuje podrobný popis akce. V pokeru můžeme například uložit navýšení akci a libovolnou částku. Některé akce mohou být složitější, takže je rozumné uložit tyto hodnoty jako text a nechat aplikaci, aby je interpretovala.

Deals and Deal Order

Zápas se skládá z jedné nebo více karetních rozdání. O participant a match tabulky, ale zahrnuli jsme je do obrázku, abychom ukázali jejich vztah k deal a deal_order tabulky.

deal tabulka ukládá všechna data, která potřebujeme o jedné instanci shody.

match_id atribut vztahuje tuto instanci k příslušné shodě, zatímco start_time a end_time označují přesný čas, kdy tato instance začala a kdy byla dokončena.

move_time_limit a deal_result atributy jsou textová pole používaná k uložení časových limitů (pokud jsou k dispozici) a popis výsledku daného obchodu.

V participant tabulka, initial_player_order atribut ukládá pořadí hráče pro instanci úvodního zápasu. Ukládání objednávek pro následující tahy vyžaduje zcela novou tabulku – deal_order tabulka.

Samozřejmě deal_id a participant_id jsou odkazy na instanci shody a účastníka. Společně tvoří první alternativní klíč v deal_order stůl. player_order atribut obsahuje hodnoty označující objednávky, které se hráči účastnili v dané instanci zápasu. Spolu s deal_id , tvoří druhý alternativní klíč v této tabulce. deal_result atribut je textové pole, které popisuje výsledek zápasu pro jednotlivého hráče. score atribut ukládá číselnou hodnotu související s výsledkem dohody.

Obleky, hodnosti a karty

Tato část modelu popisuje karty, které budeme používat ve všech podporovaných hrách. Každá karta má barvu a hodnost.

suit_type table je slovník, který obsahuje všechny typy obleků, které budeme používat. Pro suit_type_name , použijeme hodnoty jako „francouzské obleky“, „německé obleky“, „švýcarsko-německé obleky“ a „latinské obleky“.

suit tabulka obsahuje názvy všech obleků obsažených v konkrétních typech balíčků. Francouzský balíček má například obleky zvané „Spades“, „Hearts“, „Diamonds“ a „Clubs“.

V rank slovníku, najdeme známé hodnoty karet jako „Eso“, „Král“, „Královna“ a „Jack“.

card tabulka obsahuje seznam všech možných karet. Každá karta se v této tabulce objeví pouze jednou. To je důvod, proč suit_id a rank_id atributy tvoří alternativní klíč této tabulky. Hodnoty obou atributů mohou být NULL, protože některé karty nemají barvu nebo hodnost (např. žolíkové karty). is_joker_card je samovysvětlující booleovská hodnota. card_name atribut popisuje kartu textem:„Ace of Spades“.

Karty a balíčky

Karty patří do balíčků. Protože jedna karta se může objevit ve více balíčcích, budeme potřebovat n:n vztah mezi card a deck tabulky.

V deck tabulky, uložíme názvy všech balíčků karet, které chceme použít. Příklad hodnot uložených v deck_name atributy jsou:„Standardní balíček 52 karet (francouzský)“ nebo „balíček 32 karet (německy)“.

card_in_deck vztah se používá k přiřazení karet do příslušných balíčků. card_iddeck_id pár je alternativním klíčem deck stůl.

Shoda vlastností, balíčků a použitých jednotek

Tato část modelu obsahuje některé základní parametry pro spuštění nové hry.

Hlavní částí této sekce je game stůl. Tato tabulka ukládá data o hrách podporovaných aplikacemi. game_name obsahuje hodnoty jako „poker“, „blackjack“, „belot“ a „préférence“.

min_number_of_players a max_number_of_players jsou minimální a maximální počet účastníků zápasu. Tyto atributy slouží jako hranice hry a zobrazují se na obrazovce na začátku zápasu. Osoba, která iniciuje shodu, musí vybrat hodnotu z tohoto rozsahu.

min_entrance_fee a max_entrance_fee atributy označují rozsah vstupního poplatku. Opět je to založeno na hře, kterou hrajete.

V possible_victory_condition , uložíme všechny podmínky vítězství, které lze zápasu přiřadit. Hodnoty jsou odděleny oddělovačem.

unit slovník se používá k uložení každé jednotky použité ve všech našich hrách. unit_name atribut bude obsahovat hodnoty jako „bod“, „dolar“, „euro“ a „čip“.

game_deck a game_unit tabulky používají stejnou logiku. Obsahují seznamy všech balíčků a jednotek, které lze v zápase použít. Proto game_iddeck_id pár a game_idunit_id pár tvoří alternativní klíče v příslušných tabulkách.

Skóre

V naší aplikaci budeme chtít ukládat skóre všech hráčů, kteří se zúčastnili našich karetních her. Pro každou hru se vypočítá a uloží jedna číselná hodnota. (Výpočet je založen na výsledcích hráče ve všech hrách jednoho typu.) Toto skóre hráče je podobné hodnosti; umožňuje uživatelům zhruba vědět, jak dobrý hráč je.

Zpět k procesu výpočtu. Vytvoříme n:n vztah mezi player a game tabulky. To je player_score stůl v našem modelu. player_id a score_id “ společně tvoří alternativní klíč tabulky. „score atribut se používá k uložení výše uvedené číselné hodnoty.

Existuje celá řada karetních her, které používají velmi odlišná pravidla, karty a balíčky. Abychom vytvořili databázi, která uchovává data pro více než jednu karetní hru, musíme provést určitá zobecnění. Jedním ze způsobů, jak toho dosáhnout, je použít popisná textová pole a nechat je aplikaci interpretovat. Mohli bychom přijít na způsoby, jak pokrýt většinu běžných situací, ale to by exponenciálně zkomplikovalo návrh databáze.

Jak ukázal tento článek, jednu databázi můžete použít pro mnoho her. proč bys to dělal? Tři důvody:1) můžete znovu použít stejnou databázi; 2) zjednodušilo by to analýzu; a to by vedlo k 3) budování lepších protivníků AI.


  1. Jak objednávat podle názvu měsíce v PostgreSQL nebo Oracle

  2. INSERT INTO ... FROM SELECT ... VRACENÍ id mapování

  3. Transformace funkčnosti třídy Wrapper

  4. Jak otevřít tabulku v návrhovém zobrazení v aplikaci Access