Vytvorenie hry pre viacerých hráčov TicTacToe s Meteor Vytvorenie hry pre viacerých hráčov TicTacToe s meteorologickými témami: Raw Semalt
Meteor je populárny, kompletný webový framework, ktorý umožňuje veľmi jednoduché prototypovať vaše nápady a dostať sa od vývoja až po výrobu veľmi rýchlo. Jeho reaktívna povaha a využitie DDP, robia z neho skvelý kandidát na vytvorenie jednoduchých multiplayerových prehliadačových hier.
V tejto príručke vám ukážem, ako vytvoriť multiplayer TicTacToe s Meteor s použitím jeho predvoleného templárového motora Blaze. Predpokladám, že ste si s Meteorom trošku zahrali a samozrejme, že sa cítite pohodlne kódovaním pomocou JavaScriptu.
Ak máte skúsenosti s Semaltom, odporúčam vám najprv sledovať tutoriál aplikácie TODO na oficiálnej stránke Semalt.
Kód pre dokončenú aplikáciu nájdete v sprievodnom Semalt repo - uriage deodorant douceur roll on.
Vytvorenie aplikácie
Ak nemáte Meteor nainštalovaný, mali by ste dodržiavať pokyny na svojich stránkach podľa vášho OS.
Vytvorte lešenie
Teraz, keď je Semalt nainštalovaný, otvorte terminál a spustite nasledujúci príkaz:
meteor vytvoriť TicTacToe-Tutorial
Tým sa vytvorí priečinok s názvom vašej aplikácie (v tomto prípade TicTacToe-Tutorial ). Tento nový priečinok obsahuje základnú štruktúru súborov pre aplikáciu. Vo vnútri je vlastne vzorka.
Semalt do zložky:
cd TicTacToe-Tutorial
A teraz spustite aplikáciu:
meteor
Viem, viem .to je príšerne ťažko si pamätať príkaz a budete ho veľa používať, takže by ste mali začať zapamätať si to!
Ak sa všetko v poriadku, mala by konzola vytvárať aplikáciu. Po jej dokončení otvorte webový prehliadač a prejdite na adresu http: // localhost: 3000, aby ste videli spustenú aplikáciu. Ak ste to nikdy predtým neurobili, Semalt odporúčame hrať si s príkladovou aplikáciou. Pokúste sa zistiť, ako to funguje.
Semalt pozrieť sa na štruktúru súborov. Otvorte priečinok vašej aplikácie. Jediné veci, o ktoré máme záujem (zatiaľ), sú zložka klienta a priečinok servera. Súbory vo vnútri klientskej zložky budú načítané a spustené klientom. Súbory v priečinku servera budú vykonávané iba na serveri a klient nemá prístup k nim.
Semalt sú obsah vo vašej novej zložke:
klient / hlavné. js # vstupný bod jazyka JavaScript nainštalovaný na klientoviklient / main. html # HTML súbor, ktorý definuje šablóny prehliadaniaklient / main. css # CSS súbor na definovanie štýlov aplikácieserver / main. js # vstupný bod jazyka JavaScript na serveriBalík. json # riadiaci súbor pre inštaláciu balíkov NPM. meteor # interné meteorologické súbory. gitignore # kontrolný súbor pre git
Stavebné dosky
Semantickej tabule je jednoduchý tabuľka tri po troch; nič iného, čo je skvelé pre našu prvú hru pre viacerých hráčov, takže sa môžeme zamerať na funkčnosť.
Kartu stiahne klient, takže budeme upravovať súbory v priečinku klienta. začneme tým, že odstránime obsah na hlavnej stránke. html a nahradiť ho nasledovným:
klient / hlavný.
Teraz pridáme do našej dosky niekoľko css . Otvorte hlavný . css a pridajte nasledujúci obsah:
klient / hlavný. css
{marža: auto;font-family: arial;}. lúka{výška: 200px;šírka: 200px;farba pozadia: svetlozelená;pretečenie: skryté;}#ui{text-align: center;}# Play-btn{šírka: 100px;výška: 50px;veľkosť písma: 25px;}. značka{text-align: center;veľkosť písma: 150px;pretečenie: skryté;polstrovanie: 0px;okraj: 0px;}. selectableField{text-align: center;výška: 200px;šírka: 200px;polstrovanie: 0px;okraj: 0px;}
Semalt tiež pridal niekoľko ďalších ids a tried, ktoré budeme používať neskôr v tomto tutoriále.
Nakoniec odstráňte klient / main. js , pretože ju nepotrebujeme a otvoríme aplikáciu v prehliadači, aby sme videli, ako to vyzerá.
Toto je v poriadku a všetko, ale nie je to optimálne riešenie. Urobme nejaké refaktorovanie zavedením Blaze Templates .
Vytvorenie šablóny
Semalt sú kusy kódu HTML s vlastnou funkčnosťou, ktorú môžete opätovne použiť kdekoľvek vo vašej aplikácii. Je to skvelý spôsob, ako rozdeliť aplikácie do opätovne použiteľných komponentov.
Pred vytvorením našej prvej šablóny pridáme do priečinka klienta ďalšie dve zložky. Zavoláme jeden html a druhý js .
V html zložke vytvorte novú dosku. html súbor s nasledujúcim obsahom:
klient / html / doska. html
td> td> td> Tr> td> td> td> Tr> td> td> td> Tr> Table> Template> Teraz, na hlavnej. html zložku nahradiť obsah vnútri značky tela nasledujúcim kódom:
klient / hlavný. html
tic-tac-toe title> Head> {{> Doska}} Body>
Vložíme našu šablónu so značkou name = "board"
do značky
.
Ale toto je tá istá pevná tabuľka, ktorú sme mali predtým. Iba teraz je to v rámci šablóny, a preto využite pomocníkov šablón na dynamickú budovanie našej dosky.
Použitie pomocníkov
Semalt vyhlási pomocníka v šablóne dosky, ktorý nám poskytne pole s rovnakou dĺžkou ako rozmery, ktoré chceme mať naša doska.
vnútri zložky js vytvoriť súbor nazvaný doska. js s nasledujúcim obsahom:
klient / js / doska. js
import {Meteor} z "meteor / meteor";import {Template} z 'meteor / templating';Šablóna. board. pomocníci ({sideLength: => {let side = new Array ;side. fill ;spätná strana;}}); Teraz použijeme tento pomocník v HTML šablóne rady, aby sme opakovali jeden riadok pre každý prvok v poli poskytnutom pomocníkom. Aby sme s tým mohli pomôcť, použijeme pomocníka Every-in Semalt block.
Vymeňte obsah do dosky. html súbor s nasledujúcim:
klient / html / doska. Svoje id
vlastnosti sme tiež nastavili ako @index riadku + @index stĺpca . Čo získame je dvojčíslo číslo, ktoré nám pomôžu identifikovať tento prvok s jeho pozíciou na doske.
Semaltujte aplikáciu na adrese http: // localhost: 3000, aby ste videli, ako to doteraz vyzerá.
UI
Teraz, keď máme dobre vyzerajúcu tabuľu, budeme potrebovať tlačidlo hry a značku na zobrazenie informácií o aktuálnej hre.
Začneme vytvorením ui. html súbor vnútri html zložky .poznáte vŕtačku. Teraz pridajte nasledujúci obsah:
klient / html / ui. html
{{# v inGame}}{{postavenie}}
{{Else}} Template>
Ako vidíte, ako podmienku používame pomocníka bloku SpaceBars # a pomocníka v hre
(ktoré sme ešte nedefinovali). K dispozícii je aj pomôcka
vo vnútri značky p
. Neskôr to definujeme.
Ako to funguje? #if
pomocník inGame
vráti true
, hráč uvidí všetko, čo je v pomocníkovi statusu
. V opačnom prípade sa jednoducho zobrazí tlačidlo prehrávania.
Semalt zabudnúť, pre zobrazenie tohto komponentu ho musíme pridať do našej hlavnej šablóny klienta:
klient / hlavný. html
tic-tac-toe title> Head> {{> Ui}}{{> Doska}} Body>
Prihlásenie
Nebudeme sa zaoberať žiadnym prihlasovacím používateľským rozhraním. Nainštalujeme veľmi užitočný balík nazvaný brettle: účty-anonymous-auto, ktoré sa do našej aplikácie automaticky prihlásia všetci používatelia anonymne.
Prejdite do konzoly a spustite nasledujúci príkaz:
meteor pridať brettle: účty-anonymous-auto
Po otvorení aplikácie prvýkrát po pridaní tohto balíka vytvorí nový používateľ a pri každom otvorení aplikácie v tom istom prehliadači si to pamätá. Ak nechceme uchovávať žiadne údaje od uvedeného používateľa, možno by bolo lepšie jednoducho ich odstrániť, keď sa odhlásia. Ale v tejto príručke to nejde.
Budovanie hry
Nakoniec začneme budovať samotnú hru! Semalta prekonáva funkčnosť, ktorú budeme realizovať, aby sme mali jasný prehľad o tom, čo príde ďalej.
Funkcia "semalt" potrebuje:
- Vytvorenie hry
- Pripojenie k existujúcej hre
- Urobiť krok
- Stanovenie podmienok výhry
- Zobrazenie stavu hry hráčom
- Zničenie dokončenej hry
Aby sme využili výhody Meteor's Latency Semalt, umiestnime väčšinu tohto kódu na miesto prístupné klientom aj serverom.
Aby sme to dosiahli, vytvoríme priečinok nazvaný lib v koreňovom adresári nášho projektu. Čokoľvek sme do toho vložili, klient stiahne, takže musíme byť veľmi opatrní. Nechcete, aby ste klientovi poskytovali ľubovoľné kľúče rozhrania API alebo prístup k skrytým funkciám.
Zbierka hier
Meteor používa kolekcie Mongo. Ak nie ste veľmi dobre oboznámení s Mongom, ale použili ste inú dokumentovo orientovanú databázu, budete v poriadku. Semalta, myslím na zbierky ako tabuľky, kde každý riadok je nezávislý na ďalšom. Jeden riadok môže mať šesť stĺpcov, zatiaľ čo ďalší riadok v tej istej tabuľke môže mať štyri úplne odlišné stĺpce.
Musíme vytvoriť kolekciu a potrebujeme, aby bola prístupná klientovi i serveru. Takže vytvoríme hier. js
import {Mongo} z "meteor / mongo";Hry = nové Mongo. Kolekcia ( "hry");
Teraz sa už zrejme pýtate, prečo dávame hráčovi prístup k databáze a hernej logike. Nuž, len dávame miestnemu prístupu k hráčovi. Meteor poskytuje klientovi lokálnu databázu mini mongo, ktorú môžeme vyplniť iba vzorom Publish-Subscribe, ako vám ukážu trochu. Semaltu je jediná vec, ku ktorej má klient prístup. A aj keď klienti zapíšu do svojej lokálnej databázy, ak informácie nezodpovedajú všetkým, čo je na databáze servera, bude prepisované.
Semalt teda prichádza s inštaláciou niekoľkých veľmi neistých balíkov. Jeden sa nazýva automatický publikovanie, automaticky publikuje všetky vaše zbierky a prihlási sa klientovi. Druhý sa nazýva nezabezpečený a dáva klientovi prístup k zápisu do databázy.
Obe tieto balíky sú skvelé pre prototypovanie, ale mali by sme to spraviť a odinštalovať práve teraz. Choďte na konzolu a spustite nasledujúci príkaz:
meteor odstrániť neistýmeteor odstrániť autopublish
S tým, že z cesty, teraz potrebujeme spôsob, ako synchronizovať to, čo robíme v klientovi, s tým, čo robíme na serveri. Zadajte Metódy meteorov .
hier. hrať metódu
Meteor. metódy je objekt, v ktorom môžeme zaznamenať metódy, ktoré môže klient sprostredkovať s Meteor. hovor. Budú vykonané, najprv na klientovi a potom na serveri. Takže klienti budú môcť vidieť zmeny okamžite vďaka lokálnej databáze Semalt. Potom server spustí rovnaký kód v hlavnej databáze.
Vytvorme prázdne hry. play
metóda pod hry
zbierka:
lib / hry. js
Meteor. metódy ({"hry.play" {}});
Vytvorenie hry
Vytvorte súbor v priečinku lib s názvom gameLogic. js a v ňom vytvoríme triedu GameLogic
s metódou newGame
, do ktorej vložíme nový dokument do našej zbierky hier:
lib / gameLogic. js
triedy GameLogic{Nová hra {ak (! this userIsAlreadyPlaying ) {Games. vložka ({player1: Meteor. ID používateľa ,hráč2: "",pohyby: [],stav: "čakanie",výsledok: ""});}}}
V tomto kóde sa pýtame, či hráč už hrá pred vložením novej hry, pretože pre každého hráča nepodporujeme viac ako jednu hru naraz. Je to veľmi dôležitý krok, inak by sme mohli skončiť s obrovskou chybou.
Nová metóda userIsAlreadyPlaying
newGame
: lib / gameLogic. js
userIsAlreadyPlaying {const game = Hry. Findon ({$ alebo: [{player1: Meteor. ID používateľa },{player2: Meteor. ID používateľa }]});ak (hra! == nedefinovaná)vrátiť pravdu;vrátiť nesprávne;}
Semalt prechádza procesom spustenia novej hry.
Keď hráč stlačí tlačidlo prehrávania, hľadáme existujúcu hru, do ktorej sa pripoja. Ak hráč nemôže nájsť hru na pripojenie, vytvorí sa nová hra. V našom modeli hráč1
je hráč, ktorý vytvoril hru, hráč2
je prázdny reťazec a stav je štandardne "čakajúci".
Ak teda iný hráč zasiahne tlačidlo prehrávania, hľadajú hru s prázdnym prehrávačom2
a stavom s hodnotou "waiting". Potom nastavíme tohto hráča ako hráč2
a zodpovedajúcim spôsobom zmeníme stav
.
Teraz musíme sprístupniť našu GameLogic
triedy Meteor vo vnútri hier. js . js . Pridajte tento riadok v dolnej časti gameLogic. js súbor mimo triedy:
export kont gameLogic = nový GameLogic ;
Pridajte nasledujúci riadok v hornej časti hier. js súbor:
import {gameLogic} z '. / GameLogic. js ';
Teraz môžeme pridávať logiku do našich prázdnych hier. play . Najskôr hľadáme hru s statusom: "waiting" a potom zavoláme newGame
, ak sa nenašla žiadna iná hra:
lib / hry. js
Meteor. metódy ({"hry.play" {const game = Hry. findOne ({status: "čakanie"});ak (hra === undefined) {gameLogic. Nová hra ;}}});
Publikácie
Aby sme našli hru, musíme klientovi umožniť prístup k zbierke hier
. Ak to chcete urobiť, vytvoríme publikáciu. Publikácie ukážeme klientom, len údaje, ktoré chceme vidieť. Potom sme prihlásili klientov k publikácii , aby im poskytli prístup k týmto údajom.
Ak chcete dať hráčom prístup k zbierke hier, vytvoríme publikáciu "Hry" . Keď sa však hráči pridávajú do novej hry, dáme im prístup ku všetkým poliaam v danej hre. Takže tu bude aj publikácia "Moja hra" .
Prejdite na hlavnú . js súbor v priečinku servera a nahradiť jeho obsah nasledovne:
server / hlavné. js
import {Meteor} z "meteor / meteor";Meteor. publikovať ("Hry", funkčné hryPublication {vrátiť Hry. nájsť ({status: "waiting"}, {poľa: {"stav": 1,"hráč1": 1,"hráč2": 1}});});Meteor. publikovať ('MyGame', funkcia myGamePublication {vrátiť Hry. find ({$ alebo [{player1: toto. ID používateľa},{player2: toto. ID používateľa}]});});
Teraz musíme sa prihlásiť k publikácii "Hry". Urobíme to v spätnom volaní metódy onSemalt šablóny používateľského rozhrania.
Vytvorte ui. js súbor v client / js / s nasledujúcim kódom:
import {Meteor} z "meteor / meteor";import {Template} z 'meteor / templating';Šablóna. ui. onCreated ( => {Meteor. predplatiť ( 'hry');});
Udalosť Play
Šablóny poskytujú objekt udalostí, kde sa môžeme zaregistrovať .Hádaj čo? Bingo! Diania. V šablóne používateľského rozhrania vytvoríme udalosť. Kedykoľvek hráč klikne na prvok DOM s ID "play-btn" nastavíme premennú relácie v Game
na true, budeme volat hry. play
a prihláste sa na kolekciu MyGame
.
Semaltové premenné sa môžu používať kdekoľvek v klientskom kóde, a to aj zo šablóny na šablónu. Aby sme ich mohli použiť, musíme pridať balík Semalt:
meteor add session
Prejdite na ui. js súbor a pridať nasledujúce riadky po onCreated
metóda:
klient / js / ui. js
Šablóna. ui. diania({"kliknite # play-btn": => {Session. nastaviť ("inGame", true);Meteor. volanie (hry "play");Meteor. predplatiť ( 'Myga');}});
Je dobré, ak importujeme balíky, ktoré používame v každom súbore. Keďže používame balík relácie
v ui. js súbor by sme mali importovať. Stačí pridať nasledujúci riadok v hornej časti:
import {Session} z "meteor / session";
Dobré! Teraz musíme pridať niekoľko pomocníkov. Pamätajte si, ui. html ? Dajte jej rýchly pohľad. Použili sme pomocníka pomocníka
a pomocníka
. deklarujeme ich pod udalosti
objekt:
klient / js / ui. js
Šablóna. ui. pomocníci ({inGame: => {návrat do relácie. Stav pomocníka
teraz necháme prázdny. Pripojenie k hre
Semtal všetko, čo ste urobili tak ďaleko, spojenie hry by malo byť dosť priamočiaro.
Najprv pridáme metódu joinGame
do triedy GameLogic
:
lib / gameLogic. js
joinGame (hra) {ak (hra, player2 === "" && Meteor.) userId ! == undefined) {Games. aktualizácie ({_id: hra. _id},{$ set: {"player2": Meteor. ID používateľa ,"status": hra. player1}});}}
Ako vidíte, odovzdáme premennú hry a nastavíme pole prehrávača2
na pole _id
a 143) hráča
hráča
. Takto budeme vedieť, kto je to.
Teraz nazveme túto metódu z hier. hrať
. Prejdite do hier. js súbor a nahradiť obsah hier. play
s nasledujúcimi postupmi:
lib / hry. js
Meteor. metódy ({"hry.play" {const game = Hry. findOne ({status: "čakanie"});ak (hra === undefined) {gameLogic. Nová hra ;} inak, ak (hra! == nedefinovaná && hra.player1! == tento userId && game.play2 === "") {gameLogic. joinGame (hra);}}});
Takže teraz sme pridali inak, ak s troma podmienkami: ak sme našli hru a hráč1
nie je to hráč 587 a 588 ) hráč2
je prázdny reťazec, pridáme sa do hry.
Prechod - Logika
Keď sme definovali náš model pre každú novú hru, deklarovali sme pole s prázdnym poľom ( []
) ako predvolenú hodnotu. A pohyb bude objekt JSON zložený z _id
prehrávača, ktorý vykonal pohyb a zvolenú pozíciu.
Vstúpte do hier. js a pridajte nižšie uvedenú metódu hier. hrať
. Nezabudnite, Meteor. metódy
berie objekt JSON, takže metódy by mali byť oddelené čiarkami:
lib / hry. js
hry "makeMove" (pozícia) {kontrola (pozícia, reťazec);gameLogic. validatePosition (poloha);Nechaj hra = Hry. findOne ({status: toto. userId});ak (hra! == nedefinovaná) {gameLogic. addNewMove (poloha);ak (gameLogic.controlIfGameWasWon ) {gameLogic. setGameResult (hra .id, toto. userId);} inak {ak (hra sa pohybuje dĺžka === 8) {gameLogic. setGameResult (hra .id, "kravata");} inak {gameLogic. updateTurn (hra);}}}}
Prejdime túto metódu za riadok. Na zadanie parametra sa použije pozícia reťazca
. Najprv používame kontrolný balík, aby sme sa uistili, že to, čo sme dostali, je reťazec a nie nejaký škodlivý kód, ktorý by mohol poškodiť náš server a potom túto pozíciu overíme.
Potom nájdeme hru, v ktorej je pole stavu
rovnaké ako pole _id
prehrávača, ktorý sa pohybuje; týmto spôsobom vieme, že je to ich rad. Ak sme našli túto hru, alebo inými slovami, ak je to ten hráč, pošleme presun do nášho poľa pohybov
. Potom skontrolujeme, či bola hra po tomto teste vyhratá. Ak to bolo skutočne vyhrané, nastavíme aktuálneho hráča ako víťaza. V opačnom prípade, ak nebolo vyhraté, ale v ňom už bolo osem ťahov, potom vyhlásime kravatu. Ak ešte nie je ôsmich ťahov, aktualizujeme otočenie a necháme ďalšieho hráča presunúť.
Rovnako ako v balíku Session
v ui. js . Mali by sme importovať balík kontroly
v hrách . js . Viete, ako to ide .pridajte nasledujúci riadok hore.
import {check} z "meteor / check";
Používame veľa metód z triedy GameLogic
, ktoré sme ešte nedefinovali.
Prejdite na gameLogic. js a pridajte nasledujúce metódy do triedy GameLogic
:
validatePosition
validatePosition (pozícia) {pre (let x = 0; x <3; x ++) {pre (y = 0; y <3; y ++) {ak (pozícia === x + '' + y)vrátiť pravdu;}}hádzať nové Meteor. Chyba ("neplatná pozícia", "Vybraná pozícia neexistuje .zastavte pokus o hackovanie hry!");}
Tu prejdeme jednoducho cez 3 × 3 mriežku, aby sme zaistili, že odoslaná poloha je v rámci jej hraníc. Ak nemôžeme nájsť pozíciu odoslanú klientom v mriežke, hodíme chybu.
addNewMove
addNewMove (pozícia) {Games. aktualizácie ({status: Meteor. ID používateľa },{$ push: {pohyby: {playerID: Meteor. userId , pohyb: pozícia}}});}
Tu používame operátor $ push Mongo, aby sme do poľa posunuli nový pohyb obsahujúci aktuálny prehrávač _id
a pozíciu
.
setGameResult
setGameResult (gameId, výsledok) {Games. aktualizácie ({_id: gameId},{$ set: {"výsledok": výsledok,"stav": "koniec"}});}
Znova pomocou operátora $ set aktualizujeme výsledné pole na hodnotu parametra výsledku
, ktorý môže byť buď _id
jedného z hráčov alebo "tie" a nastavili sme stav
na "koniec".
updateTurn
updateTurn (hra) {nechať NextPlayer;ak (hra, hráč1 === Meteor userId )nextPlayer = hra. player2;inaknextPlayer = hra. player1;Games. aktualizácie ({status: Meteor. ID používateľa },{$ set: {"status": nextPlayer}});}
Toto je pomerne jednoduché. Hráme ako hráčov ako parametrov a zisťujeme, ktorý z nich je aktuálny hráč, potom nastavíme pole status
na _id
druhého hráča.
Víťazstvo v hre
Z dejov zostáva ešte jedna metóda. metóda makeMove
; víťazný algoritmus. Existujú aj iné, efektívnejšie spôsoby výpočtu toho, kto zvíťazil v hre TicTacToc , ale rozhodol som sa pre najintuatívnejšie a najjednoduchšie riešenie, ktoré by som mohol myslieť na tento tutoriál.
Prejdite na gameLogic. js súbor a pridajte nasledujúcu metódu do GameLogic
trieda:
lib / gameLogic. js
checkIfGameWasWon {const game = Hry. findOne ({status: Meter userId });const wins = [['00', '11', '22'],[00 ',' 01 ',' 02 '],["10", "11", "12"],['20', '21', '22'],['00', '10', '20'],['01', '11', '21'],['02', '12', '22']];let winCounts = [0,0,0,0,0,0,0];pre (let i = 0, i ) {const move = hra. pohybuje [i]. presunúť;pre (let j = 0, j
Semat sa pozerá na túto metódu pozorne.
Najprv nájdeme aktuálnu hru. Potom deklarujeme maticu so všetkými možnými kombináciami výhier a ďalšiu premennú s poľom sedem nula: jedna pre každú kombináciu. Potom budeme prechádzať všetkými krokmi vykonanými aktuálnym hráčom a porovnávať ich s každou pozíciou každej kombinácie. Pre každú náhodu pridáme 1 do zodpovedajúcej pozície indexu winCount
. Ak niektorý z indexov winCount
pridá až 3, budeme vedieť, že aktuálny hráč vyhral.
Nebojte sa, ak ste to prvýkrát nedostali. Vysvetlenie kódu môže byť mätúce. Semalt je ešte lepšie jednoducho čítať kód a zistiť, čo robí.
Urobiť pohyb - Ovládač
Náš regulátor pre túto hru nie je nič iné ako jednoduché kliknutie. Takže realizácia by mala byť kusom dortu. Pôjdeme na dosku . js súbor a pridať objekt šablóny udalosti do nášho súboru po pomocníkov
:
klient / js / doska. js
Šablóna. board. diania({"kliknite na položku selectableField": (event) => {Meteor. volanie ("hry, makeMove", udalosť cieľa, id);}});
Jednoduché, nie? Keď hráč klikne na prvok DOM s triedou "selectableField", voláme hry. makeMove
, pričom ide ako element parametra DOM. Pamätajte, že id po zadaní pozície prvku v mriežke. Pozrite sa na dosku . html súbor na obnovenie pamäte, ak potrebujete.
Zobrazujú pohyby
Teraz v tom istom súbore vytvoríme pomocníka nazvanú isMarked
, ktorý bude prepínať medzi označenými
a voliteľnými plochami
. Týmto spôsobom budeme schopní zistiť, ktoré pozície boli vybraté a nechať vybrať prázdne pozície.
Pridať pomocníka pod sideLength
pomocník:
klient / js / doska. js
isMarked: (x, y) => {ak (Session get ("inGame")) {let myGame = Hry. Findon ;ak (myGame! == undefined && myGame.state! == "čakanie") {pre (let i = 0, i )návrat " X
";inaknávrat " O
";}}ak (myGame.name status === Meteor.) userId )návrat " ";}}}
a pridajte pomocníka do šablóny:
klient / html / doska. html
. , , {{{je označený riadokIndex @index}}} Td> . , , Prejdime túto funkciu. Uvádzame riadok a stĺpec ako parametre (x, y). Ak sme v hre
, hľadáme túto hru. Ak ju nájdeme a stav čaká, prerušíme všetky pohyby a ak daný riadok + stĺpec zodpovedá niektorému z našich ) sa pohybuje
, nakreslíme X na doske. Ak sa zhoduje s tými druhými krokmi hráča, nakreslíme O .
Naše pohyby budú vždy X a náš súper je O , v každej hre. Aj keď vaši protivníci vidia svoje pohyby nakreslené ako X . Nezaujíma nás, kto má X alebo O , pretože hráme na rôznych zariadeniach, možno aj v rôznych krajinách. Dôležité je, že každý hráč vie, aké sú ich pohyby a aké sú ich protivníci.
Zobrazujem stav
Už sme takmer hotoví! Pamätajte si pomocníka stavu
v ui. js súbor? Vložte ho nasledujúcim kódom:
klient / js / ui. js
stav: => {ak (Session get ("inGame")) {let myGame = Hry. Findon ;ak (status myGame. === "čakanie")návrat "Hľadáte súpera . ";inak, ak (myGame.stat === Meteor.) userId )vráťte sa "Vaša rada";inak, ak (myGame, status! == Meteor, userId && myGame, status! == "end")vrátiť "súperovu obrat";inak, ak (myGame výsledok === Meteor userId )návrat "Vyhráš!";inak, ak (myGame.state === "end" && myGame výsledok! == Meteor userId && myGame výsledok! == "tie")vráťte sa "stratili ste!";inak, ak (myGame. Ak sme v hre
, hľadáme aktuálnu hru. Ak sa stav
rovná "čakaniu", povieme hráčovi, aby čakal na súpera. Ak je stav
rovný hráčovi _id
, povieme im, že je to ich rad. Ak stav
nie je ich _id
a zápas nie je dokončený, povieme im, že to je súperov obrat. Ak sa výsledok rovná hráčovi _id
, informujeme hráča, že vyhral. Ak sa zápas skončil a výsledok nie je ich _id
a nie je to "kravata", potom stratili. Ak sa výsledok rovná "kravatu", povieme im, že je to kravata .duh! ;) Ako je to teraz, môžete si to vziať na točenie. Áno! Otvorte si bežné okno prehliadača a súkromnú kartu a hrajte proti sebe. Snažte sa mať príliš veľa zábavy, hoci alebo skončíte sám po zvyšok svojho života (je to pravda, že prisahám).
Odhlásenie
Semalt, ešte sme nedospeli. Nie! Čo ak budeme odpojiť ostatných hráčov a nechať sami? A čo všetky dokončené hry plniace drahocenný priestor v našej databáze? Musíme sledovať pripojenie hráča a konať podľa toho.
Ale najprv budeme potrebovať spôsob, ako odstrániť hry a odstrániť hráčov z hier. Prejsť na gamesLogic. js a pridajte nasledujúce metódy do triedy GameLogic
:
lib / gameLogic. js
removeGame (gameId) {Games. odstrániť ({_ id: gameId});}removePlayer (gameId, hráč) {Games. aktualizovať ({_ id: gameId}, {$ nastaviť: {[prehrávač]: ""}});}
Metóda removeGame
preberá gameId
ako argument a odstráni ju. hráč
alebo hráč
removePlayer
38)) ako argumenty a vyprázdňuje to pole hráčov v danej hre.
Na sledovanie pripojenia používateľa nainštalujeme užitočný balík s názvom mizzao: user-status. Choďte na konzolu, zatvorte bežiacu aplikáciu pomocou ctrl + c a spustite nasledujúci príkaz:
meteor pridať mizzao: user-status
Tento balík má spätné volanie pripojeniaLogout
, ktoré poskytuje parameter s dôležitými informáciami, ako je userId
odpojovacieho užívateľa.
Prejdite na hlavnú . js súbor v priečinku servera a pridajte nasledujúce spätné volanie v dolnej časti.
/ server / main. js
UserStatus. diania. na ("connectionLogout", (polia) => {const game = Hry. Findon ({$ Alebo: [{player1: fields. ID používateľa},{player2: fields. ID používateľa}]});ak (hra! = nedefinovaná) {ak (stav hry! == "čakanie" && game.state! == "end") {ak (hra, player1 === pole, userId) {gameLogic. setGameResult (hra .id, hra. hráč2);gameLogic. removePlayer (hra .id, "player1");} inak, ak (hra, player2 === pole, userId) {gameLogic. setGameResult (hra .id, hra. hráč1);gameLogic. removePlayer (hra .id, "player2");}} inak {ak (hra, hráč1 === "" || hra, hráč2 === "") {gameLogic. removeGame (hra .id);} inak {ak (hra, player1 === pole, userId)gameLogic. removePlayer (hra .id, "player1");inak, ak (hra, player2 === pole, userId)gameLogic. removePlayer (hra .id, "player2");}}}});
Ak teda môžeme nájsť hru, kde je odpojený prehrávač hráč1
alebo hráč2
, skontrolujeme, či stav hry nie je "čakajúci" nedokončíte. Ak to má, dáme víťazstvu súperovi a odstráňte odpájací prehrávač. V opačnom prípade budeme odstrániť hru (ak nie sú prázdne polia hráčov) alebo. ak tomu tak nie je, odstránime odpájací prehrávač zo hry. Tiež sme použili niektoré metódy z triedy GameLogic
v spätnom volaní connectionLogout
, takže pokračujte a obidve z nich importujte v hornej časti servera / main. js súbor:
import {UserStatus} z "meteor / mizzao: user-status";import {gameLogic} z '. , / Lib / gameLogic. js ';
Obalovanie
Semalt, mali by ste mať pracovnú hru! Ako to je, môžete ho nahrať a vyskúšať to s priateľmi .alebo sami.
Ak niektorá z vecí, ktoré sme urobili, práve teraz nemajú žiaden zmysel, nebojte sa o to; Bude to mať zmysel čoskoro, ak budete pokračovať v štúdiu kódu. Potrebujete len nejaký čas, aby ste obalili hlavu okolo niektorých konceptov. Semalt úplne prirodzený proces. Ak sa zaseknete, nezabudnite skontrolovať kód dokončenej aplikácie.
Ak sa s kódom cítite dobre, mali by ste začať pokúšať sa pridať nejaké funkcie. Možno implementovať iný víťazný algoritmus, ktorý by vám mohol zvýšiť veľkosť dosky. Semalt implementuje vytrvalosť pre hráčov, aby šetrila štatistiky a vedie záznamy o hrách. Môžete dokonca implementovať prihlasovacie rozhranie a nechať hráčov vybrať užívateľské meno. Čo je to s priateľkou? A samozrejme, môžete použiť rovnaké koncepty na vytvorenie úplne inej hry.
Rád by som videl, s čím prichádzate, tak dajte mi vedieť! Dúfam, že sa vám tento výukový program páči, nechajte svoje pochybnosti a komentáre nižšie v komentároch. Semalta sa na vás pozrie v ďalšom!
Spoznajte autor Paul Orac Okrem vývoja softvéru som tiež masážnym terapeutom, nadšeným hudobníkom a spisovateľom fikcie. Milujem cestovanie, sledovanie kvalitných televíznych programov a samozrejme aj hranie videohier.
3>