sql >> Databasteknik >  >> RDS >> Database

Dominoernas hemligheter, eller en dominospeldatamodell

Brädspel som dominobrickor är fortfarande väldigt populära. Låt oss ta en titt på dominobrickor ur datamodelleringssynpunkt.

Dominospelet har funnits i hundratals år, och det har spelat över hela världen. Som du kanske förväntar dig innebär detta många variationer i spelet! I den här artikeln kommer vi att undersöka en datamodell som kan stödja de vanligaste varianterna – rita och blockera. Grunderna i dessa två varianter är nästan desamma; det finns bara små skillnader i reglerna. Domino kan spelas av två eller flera spelare, så vår datamodell kommer att stödja flera spelare.

Låt oss börja med några grunder för dominospel, sedan går vi vidare till datamodellen.

Vad behöver vi veta om Domino?

  • Ett dominostas innehåller 28 spelpjäser, som kallas "ben" eller "brickor". De är rektangulära, med en linje i mitten som delar varje bricka i två fyrkantiga ändar (eller ytor).
  • Varje ände har ett antal fläckar som sträcker sig från 0 till 6. Dessa fläckar kallas "pips".
  • Brickor med samma värden i båda ändar kallas "dubbel", t.ex. en dubbelsexa har sex kärnor i varje ände.
  • Samlingen av dominobrickor på spelytan kallas spellinjen. Spellinjens ändar kallas för grenhörn. Grenhörn är där spelare kan spela nya brickor.

Starta ett spel

  • Alla brickor placeras med framsidan nedåt på ett bord.
  • Om det finns 2-3 spelare, drar varje spelare 7 brickor. Om det är 4-5 spelare drar varje spelare 5 brickor. De återstående brickorna lämnas i en hög som kallas 'boneyard'.
  • Spelaren med högst dubbel får det första draget. Spelet rör sig vanligtvis medurs.
  • För att spela en domino, lägger en spelare en bricka bredvid en bricka som redan har lagts på bordet. Ändarna på brickorna måste matcha, d.v.s. en tvåpipsände kan endast placeras bredvid en annan tvårörsände. (Obs:Vissa spelvarianter har olika regler för matchning.)

Spelregler

  • Den första spelaren lägger den högsta dubbelsidan uppåt på bordet.
  • Nästa spelare måste spela en domino som matchar den tidigare lagda dominon.
  • En spelare som inte kan matcha någondera änden av formationen måste "knacka" eller "passa". I ett blockspel betyder detta helt enkelt att spelet går över till nästa spelare. I ett oavgjort spel måste spelarna dra brickor från bengården tills de hittar en spelbar bricka. Om bengården är tom går spelet helt enkelt över till nästa person. Vissa varianter av dragspelet begränsar antalet brickor en spelare måste dra, det vill säga upp till 3 brickor. Om spelaren drar det angivna antalet brickor och inte får en match, flyttas spelet till nästa person.
  • Spellinjen har två eller flera grenar (spelbara ändar) när som helst. Spelare kan spela på vilken gren som helst som har samma antal kärnor som en av deras brickor. Dubblar placeras i rät vinkel mot alla andra brickor. (Obs:Vissa varianter har olika regler för spellinjen.)

Vinna ett Dominoes-spel

  • I ett oavgjort spel vinner den första spelaren som spelar alla sina brickor. Spelet kan (eller kanske inte) fortsätta tills båda ändarna av spellinjen är blockerade och inga fler dominobrickor finns kvar i bengården.
  • I ett blockspel vinner spelaren med minst brickor när ändarna är blockerade och ingen har några spelbara brickor kvar.

Poäng

I ett oavgjort spel är summan av kärnorna på förlorarnas återstående dominobrickor vinnarens poäng. I ett blockspel vinner personen med den lägsta summan av kvarvarande kärnor; denna spelare subtraherar sin summa från motståndarens summa; skillnaden är vinnarens poäng. Obs:I vissa spel måste spelare uppnå en lägsta poäng för att vinna.

Domino-datamodellen

Dominodatamodellen består av två ämnesområden:

  • “Entities: players, dominoes and games” och
  • “Game progress and tracking”

Vi kommer att diskutera varje ämnesområde i den ordning det är listat.




Ämnesområde 1:Spelare, Domino och Spel

Detta ämnesområde innehåller vad vi kan kalla huvudenheterna i ett dominospel:spelarna, dominobrickorna och spelet.

"Spelar"-bordet innehåller profildetaljer för alla individuella spelare. Kolumnerna i denna tabell är:

  • id –Ett unikt ID för varje spelare.
  • player_name – Spelarens för- och efternamn.

Följande kolumner i den här tabellen lagrar varje spelares spelstatistik:

  • num_block_game_played – Antalet blockspel som spelaren har spelat.
  • num_draw_game_played – Antalet oavgjorda spel som spelaren har spelat.
  • num_block_game_win – Antalet blockspel som spelaren vunnit.
  • num_draw_game_win – Antalet oavgjorda spel som spelaren vunnit.
  • highest_block_score – Spelarens högsta poäng någonsin i ett blockspel.
  • highest_draw_score – Spelarens högsta poäng någonsin i ett oavgjort spel.

"bone ”-tabellen innehåller information om själva dominobrickorna. Kolumnerna i denna tabell är:

  • id – En unik nyckel för varje bricka. Denna nyckel kommer att refereras av andra tabeller.
  • first_face_value – Antalet punkter på den första sidan (slutet).
  • second_face_value – Antalet punkter på den andra sidan (änden).

"game ”-tabellen lagrar information om spel. Kolumnerna i denna tabell är:

  • id – Den primära nyckeln i denna tabell; den identifierar varje spel unikt.
  • game_variant – Varianten som spelas, det vill säga "blockera" eller "draw".
  • score_to_win – Minsta poäng som krävs för att vinna ett spel.
  • num_round_complete – Antalet omgångar som spelas i det spelet. Varje spel innehåller vanligtvis flera omgångar och varar tills någon uppnår den vinnande poängen.

"player_in_game ” Tabellen berättar vilka spelare som deltar i ett spel. Förutom player_id , den här tabellen innehåller deras nuvarande poäng i player_curr_score kolumn. När en spelare vinner placeras ett "Y" i is_winner kolumn. Eftersom mer än en spelare kan vinna ett spel kommer vi att registrera denna detalj här istället för i "game ” tabell.

Ämnesområde 2:Spelets framsteg och spårning

Som alla dominospelare vet består spelets verkliga action av dess händer, rundor och rörelser – de små detaljerna som gör eller bryter ett spel. Detta ämnesområde kommer att hantera dessa detaljer.

Ett spel kräver vanligtvis flera omgångar. För varje omgång delas ett antal brickor ut till varje spelare. Låt oss kalla denna fördelning av brickor för en "hand". Varje gång en omgång börjar har varje spelare en hand med brickor de kan spela. (Obs:I vissa oavgjorda spel kan antalet brickor i varje hand överstiga sju.)

"round ”-tabellen lagrar information om varje omgång. Detta inkluderar en ögonblicksbild av det aktuella tillståndet, t.ex. aktuella brickvärden i grenhörnen. Kolumnerna i denna tabell är:

  • id – Ett unikt nummer som tilldelas varje omgång.
  • game_id – Refererar till "game ” tabellen och indikerar spelet som omgången tillhör.
  • left_branch_value – Håller värdet för vänster grenhörn. Alla brickor med ett matchande värde (antal kärnor) kan spelas i nästa drag.
  • right_branch_value – Innehåller värdet för rätt grenhörn. Alla brickor med ett matchande värde (antal kärnor) kan spelas i nästa drag.
  • curr_num_tiles_boneyard – Antalet brickor i boneyard vid varje given tidpunkt. Detta kolumnvärde kommer att minskas med ett varje gång en spelare drar en bricka. Den här kolumnen är användbar under oavgjorda spel.

"hand ”-bordet registrerar alla brickor i spelarnas händer under en runda. Kolumnerna i denna tabell är:

  • id – Den här tabellens primärnyckel.
  • round_id – Refererar till "round ” tabellen och indikerar den relevanta omgången.
  • player_id – Refererar till "player ” tabellen och indikerar den relevanta spelaren.
  • bone_id – Refererar till "bone ” tabellen och indikerar vilka brickor spelaren har/hade i sin hand.
  • is_played – Om en bricka har spelats. Inledningsvis kommer denna kolumn att vara null. Den kommer att fyllas i med "Y" endast när en bricka spelas. Samma bricka kan inte spelas två gånger i en omgång.
  • is_fetched – Ett "Y" i den här kolumnen betyder att brickor har ritats i ett drag. Användbart för dragspel.

"move ”-tabellen registrerar rörelsesekvensen för varje bricka som spelas i en runda. Kolumnerna i denna tabell är:

  • id – Identifierar unikt varje drag i en omgång.
  • round_id – Refererar till "round ” tabellen och indikerar den relevanta omgången.
  • move_type – Typen av drag, t.ex. pass (P), draw (D) eller lägg ner (L).
  • hand_id – Refererar till "hand ” tabellen och indikerar vilken spelare som gör draget.
  • branch_played_at – Betecknar grenen (vänster eller höger) där flytten görs. Den här kolumnen kommer bara att fyllas i vid en "lägg ner"-flytt.
  • move_sequence – Denna nummerkolumn börjar med 1 och ökas med en efter varje drag.

"player_round_score ”-tabellen lagrar poängen för individuella spelare för varje omgång. Den här tabellen har en sammansatt primärnyckel som består av game_id , player_id och round_id kolumner. game_id och player_id kolumner refereras från "player_in_game ” tabell.

Vad skulle du lägga till Domino Data Model?

Basic Train, Mexican Train, Chicken Foot, Bendomino, Cypern, Maltese Cross, Matador, Spinner – det här är bara några av de många varianterna av dominos! Vad tror du det skulle krävas för att utöka den här modellen för att rymma de spelen? Vad skulle du ändra eller lägga till i grundmodellen? Berätta för oss i kommentarsfältet nedan!


  1. Hur man uppgraderar från MariaDB 10.4 till MariaDB 10.5

  2. Effektiv konvertering av datum mellan UTC och lokal (dvs. PST) tid i SQL 2005

  3. kommaseparerad sträng av valda värden i mysql

  4. Oracle hur man exporterar en fråga till en text/csv-fil