sql >> Database >  >> RDS >> Database

De geheimen van Domino's, of een Domino-spelgegevensmodel

Bordspellen zoals domino's zijn nog steeds erg populair. Laten we eens kijken naar dominostenen vanuit het oogpunt van gegevensmodellering.

Het dominospel bestaat al honderden jaren en wordt over de hele wereld gespeeld. Zoals je zou verwachten, betekent dit veel variaties in het spel! In dit artikel gaan we een datamodel onderzoeken dat de meest voorkomende varianten zou kunnen ondersteunen:tekenen en blokkeren. De basis van deze twee varianten is bijna hetzelfde; er zijn slechts kleine verschillen in regels. Domino's kunnen door twee of meer spelers worden gespeeld, dus ons datamodel ondersteunt meerdere spelers.

Laten we beginnen met enkele basisprincipes van domino-gameplay, dan gaan we verder met het datamodel.

Wat moeten we weten over dominostenen?

  • Een domino-set bevat 28 speelstukken, die 'botten' of 'tegels' worden genoemd. Ze zijn rechthoekig, met een lijn in het midden die elke tegel in twee vierkante uiteinden (of vlakken) verdeelt.
  • Elk uiteinde heeft een aantal spots variërend van 0 tot 6. Deze spots worden 'pips' genoemd.
  • Tegels met dezelfde waarden aan beide uiteinden worden 'dubbels' genoemd, b.v. een dubbel-zes heeft zes pitten aan elk uiteinde.
  • De verzameling dominostenen op het speeloppervlak wordt de speellijn genoemd. De uiteinden van de speellijn worden vertakkingshoeken genoemd. Vertakkingshoeken zijn waar spelers nieuwe tegels kunnen spelen.

Een spel starten

  • Alle tegels worden verdekt op een tafel gelegd.
  • Als er 2-3 spelers zijn, trekt elke speler 7 tegels. Als er 4-5 spelers zijn, trekt elke speler 5 tegels. De overige tegels worden achtergelaten op een stapel die de 'boneyard' wordt genoemd.
  • De speler met de hoogste dubbel krijgt de eerste zet. Het spel gaat meestal met de klok mee.
  • Om een ​​dominosteen te spelen, legt een speler een tegel naast een tegel die al op tafel ligt. De uiteinden van de tegels moeten overeenkomen, d.w.z. een twee-pip-uiteinde kan alleen naast een ander twee-pip-uiteinde worden geplaatst. (Opmerking:voor sommige spelvarianten gelden andere regels voor het matchen.)

Spelregels

  • De eerste speler legt de hoogste dubbele afbeelding op tafel.
  • De volgende speler moet een dominosteen spelen die overeenkomt met de eerder gelegde dominosteen.
  • Een speler die geen van beide uiteinden van de formatie kan evenaren, moet "kloppen" of "passen". In een blokspel betekent dit simpelweg dat het spel doorgaat naar de volgende speler. In een gelijkspel moeten spelers tegels van de boneyard trekken totdat ze een speelbare tegel vinden. Als de boneyard leeg is, gaat het spel gewoon door naar de volgende persoon. Sommige varianten van het tekenspel beperken het aantal tegels dat een speler moet trekken, d.w.z. maximaal 3 tegels. Als de speler het opgegeven aantal tegels trekt en geen match krijgt, gaat het spel naar de volgende persoon.
  • De speellijn heeft op elk moment twee of meer takken (speelbare uiteinden). Spelers kunnen op elke tak spelen die hetzelfde aantal pitten heeft als een van hun tegels. Dubbels worden haaks op alle andere tegels geplaatst. (Opmerking:sommige varianten hebben andere regels over de speellijn.)

Een dominospel winnen

  • In een gelijkspel wint de speler die als eerste al zijn tegels heeft gespeeld. Het spel kan (of niet) doorgaan totdat beide uiteinden van de speellijn zijn geblokkeerd en er geen dominostenen meer in de boneyard zijn achtergebleven.
  • In een blokspel wint de speler met de minste tegels wanneer de uiteinden zijn geblokkeerd en niemand speelbare tegels meer heeft.

Scoren

In een gelijkspel is de som van de pitten op de resterende dominostenen van de verliezers de score van de winnaar. In een blokspel wint de persoon met de laagste som van overgebleven pitten; deze speler trekt zijn som af van de som van zijn tegenstander; het verschil is de score van de winnaar. Opmerking:in sommige spellen moeten spelers een minimumscore halen om te winnen.

Het Domino-gegevensmodel

Het domino-gegevensmodel bestaat uit twee vakgebieden:

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

We bespreken elk onderwerp in de volgorde waarin het is vermeld.




Onderwerpgebied 1:Spelers, Domino's en Games

Dit onderwerpgebied bevat wat we de belangrijkste onderdelen van een dominospel kunnen noemen:de spelers, de dominostenen en het spel.

De "speler"-tabel bevat profieldetails voor alle individuele spelers. De kolommen in deze tabel zijn:

  • id –Een unieke ID voor elke speler.
  • player_name – De voor- en achternaam van de speler.

De volgende kolommen in deze tabel bevatten de spelstatistieken van elke speler:

  • num_block_game_played – Het aantal blokspellen dat de speler heeft gespeeld.
  • num_draw_game_played – Het aantal gelijkspelspellen dat de speler heeft gespeeld.
  • num_block_game_win – Het aantal door de speler gewonnen blokspellen.
  • num_draw_game_win – Het aantal gelijkspelspellen dat de speler heeft gewonnen.
  • highest_block_score – De hoogste score van de speler ooit in een blokspel.
  • highest_draw_score – De hoogste score van de speler ooit in een gelijkspel.

Het “bone ” tabel bevat informatie over de dominostenen zelf. De kolommen in deze tabel zijn:

  • id – Een unieke sleutel voor elke tegel. Naar deze sleutel wordt verwezen door andere tabellen.
  • first_face_value – Het aantal stippen op het eerste vlak (einde).
  • second_face_value – Het aantal stippen op het tweede vlak (einde).

Het "game ” tabel slaat informatie over games op. De kolommen in deze tabel zijn:

  • id – De primaire sleutel van deze tabel; het identificeert elk spel op unieke wijze.
  • game_variant – De gespeelde variant, d.w.z. “blokkeren” of “gelijkspel”.
  • score_to_win – De minimale score die nodig is om een ​​spel te winnen.
  • num_round_complete – Het aantal gespeelde ronden in dat spel. Elk spel bevat meestal meerdere rondes en duurt totdat iemand de winnende score behaalt.

De "player_in_game ” tabel vertelt ons welke spelers deelnemen aan een spel. Naast de player_id , deze tabel bevat hun huidige scores in de player_curr_score kolom. Wanneer een speler wint, wordt een "Y" in de is_winner . geplaatst kolom. Aangezien meer dan één speler een spel kan winnen, zullen we dit detail hier opnemen in plaats van in het "game " tafel.

Onderwerpgebied 2:Spelvoortgang en volgen

Zoals elke dominospeler weet, bestaat de echte actie van het spel uit de handen, rondes en zetten – de kleine details die een spel maken of breken. Dit onderwerpgebied behandelt die details.

Een spel vereist meestal meerdere rondes. Voor elke ronde wordt een aantal tegels verdeeld onder elke speler. Laten we deze verdeling van tegels een "hand" noemen. Elke keer dat een ronde begint, heeft elke speler een hand met tegels die ze kunnen spelen. (Opmerking:in sommige gelijkspelspellen kan het aantal tegels in elke hand meer dan zeven zijn.)

De “round ” tabel slaat details van elke ronde op. Dit omvat een momentopname van de huidige stand van zaken, b.v. huidige tegelwaarden in de vertakkingshoeken. De kolommen in deze tabel zijn:

  • id – Een uniek nummer toegewezen aan elke ronde.
  • game_id – Verwijst naar het "game ” tabel en geeft het spel aan waartoe die ronde behoort.
  • left_branch_value – Bevat de waarde van de links tak hoek. Elke tegel met een overeenkomende waarde (aantal pitten) kan in de volgende zet worden gespeeld.
  • right_branch_value – Bevat de waarde van de rechts tak hoek. Elke tegel met een overeenkomende waarde (aantal pitten) kan in de volgende zet worden gespeeld.
  • curr_num_tiles_boneyard – Het aantal tegels in de boneyard op een bepaald moment. Elke keer dat een speler een tegel trekt, wordt deze kolomwaarde met één verlaagd. Deze kolom is handig tijdens gelijkspelspellen.

De “hand ” tafel registreert alle tegels in de handen van de spelers tijdens een ronde. De kolommen in deze tabel zijn:

  • id – De primaire sleutel van deze tabel.
  • round_id – Verwijst naar de “round ” tabel en geeft de relevante ronde aan.
  • player_id – Verwijst naar de "player ” tabel en geeft de relevante speler aan.
  • bone_id – Verwijst naar het “bone ” tabel en geeft aan welke tegels de speler in zijn hand heeft/had.
  • is_played – Of er een tegel is gespeeld. In eerste instantie is deze kolom null. Het wordt alleen gevuld met 'Y' wanneer een tegel wordt gespeeld. Dezelfde tegel kan niet twee keer in één ronde worden gespeeld.
  • is_fetched – Een ‘Y’ in deze kolom geeft aan dat tegels in een zet zijn getrokken. Handig voor tekenspellen.

De "move ” tabel registreert de zetvolgorde voor elke tegel die in een ronde wordt gespeeld. De kolommen in deze tabel zijn:

  • id – Identificeert op unieke wijze elke zet in een ronde.
  • round_id – Verwijst naar de “round ” tabel en geeft de relevante ronde aan.
  • move_type – Het type zet, d.w.z. passen (P), gelijkspel (D) of neerleggen (L).
  • hand_id – Verwijst naar de “hand ” tabel en geeft aan welke speler de zet doet.
  • branch_played_at – Betekent de tak (links of rechts) waar de beweging wordt gemaakt. Deze kolom wordt alleen ingevuld in het geval van een 'legen' zet.
  • move_sequence – Deze nummerkolom begint met 1 en wordt na elke zet met één verhoogd.

De "player_round_score ” tabel slaat de scores op voor individuele spelers voor elke ronde. Deze tabel heeft een samengestelde primaire sleutel die bestaat uit de game_id , player_id , en round_id kolommen. De game_id en player_id kolommen worden verwezen vanuit de "player_in_game " tafel.

Wat zou u toevoegen aan het Domino-gegevensmodel?

Basic Train, Mexican Train, Chicken Foot, Bendomino, Cyprus, Maltese Cross, Matador, Spinner - dit zijn slechts enkele van de vele varianten van dominostenen! Wat denk je dat er voor nodig is om dit model uit te breiden voor die games? Wat zou je veranderen of toevoegen aan het basismodel? Vertel het ons in de comments hieronder!


  1. welke jdbc jar te gebruiken met oracle 11g &jdk 1.6 en hoe verbinding te maken met de db zelf

  2. Oracle INTERSECT-operator uitgelegd

  3. Hoe vind ik de rechten en rollen die in Oracle aan een gebruiker zijn toegekend?

  4. DATEADD-equivalent in PostgreSQL