CryptoBotWars alebo Ako zostaviť hovno demonštrácie a prečo

Prečo sračky? Pretože sa mi páči samou depreciacia a hra nie je všade blízko výroby.

Žetóny, roboti, platobné kanály a živé prenosy

Preto som postavil hru CryptoBotWars, hru na sieti Raiden Network.

Chceš to hrať? Pokračuj v čítaní…

Urobte si prehľad o hre, zákulisí alebo ukážke živého vysielania. Pripojte sa k nášmu Riot chatu!

Prečo? ... mal som nejaké otázky:

  1. Je ľahké postaviť niečo na vrchole Raiden práve teraz? Chýba nám niečo, čo sa dá pomerne ľahko zmeniť?
  2. Ako by Raiden pracoval práve teraz pri individuálnych a viacnásobných platbách, ktoré sa často týkajú podnikov
  3. Našli by ľudia chyby v Raidene? Najlepší testeri sú bezradní, novo zabudovaní testeri.
  4. Choval by sa Raiden pekne s vysokou priepustnosťou?
  5. Bude platba úspešne sprostredkovaná (rôzne miesta a nastavenia systému)

Hra, zvlášť kombinovaná s určitou úrovňou zábavy, má potenciál motivovať nových ľudí, aby vyskúšali Raidena. A ešte viac, ak na vrchol pridáte nejaké odmeny.

Hra ... alebo veľmi seriózna služba, ktorá prijíma platby mimo reťazca , ale nemala som dosť času na platby, takže idete:

Dark Vader a Blue Yoda. Polievková misa a stolný tenis Santa Hat! Vyzerá skvele! … Od 4 metrov

Tento blogový príspevok je čiastočne venovaný thajskej reštaurácii, kde dostávam svoju obľúbenú polievku z kokosu-tofu-veggie v Berlíne . To je dôvod, prečo máme vždy okolo seba veľa misiek na výrobu Vader Helmets & Santa Hats .

Ako vznikol nápad?

Jedného dňa sme počas obeda diskutovali o nápadoch pre workshop siete Devcon4 Raiden Network a snažili sme sa vymyslieť zábavnú a jednoduchú aplikáciu, ktorú je možné postaviť na vrchole Raidenu. Nejako sme dospeli k záveru, že hra môže motivovať viac ľudí, aby ju vyskúšali.

Neskôr som o tom premýšľal a rozhodol som sa, že hra s neobmedzeným počtom používateľov by Raidlovi mohla ukázať lepšie, pretože by otestovala priepustnosť.

Aké hry však môžete hrať medzi nekonečným počtom hráčov? Možno niečo, čo vyžaduje hlasovanie pre výsledok.

Spomínal som si na väzenskú dilemu, keď sa dvaja hráči snažia minimalizovať svoje straty bez toho, aby boli schopní navzájom komunikovať, ale nenašli som vhodnú hernú variantu pre môj účel.

Potom som sa vrátil k rysovacej doske: hlasoval som pre výsledok.

Potom som si uvedomil, že najjednoduchšou vecou, ​​ktorú môžete urobiť, sú nožnice na rockový papier. Dvaja hráči, tri ťahy, každý hráč si vyberie hráča a ťah a väčšina na hráča rozhodne o poslednom ťahu. Potom sa môže hrať skutočná hra medzi dvoma väčšinou vybranými ťahmi.

Tím nakoniec predstavil zábavný závod medzi Devou a niektorými známymi ľuďmi z vesmíru, ktorý skombinoval úvodný seminár s memcami vhodnými pre Devcon a určitým vzrušením .

Stále som však chcel zostaviť svoje nožnicové nožnice na rockový papier a ETHSingapore sa na to javil ako dobrý čas! (Dark Vader a Blue Yoda navštívili Singapur, ale neboli zahrnutí do dema kvôli iným rôznym technickým problémom, ktoré som musel vyriešiť )

Roboti chcú šifrovanie

Máte hru, máte Raiden, prečo pridať ďalšiu premennú do rovnice?

A roboty spôsobujú veľa bolesti a nehovorím o robotickej apokalypse. Aj keď vidíte, chvíľu som sa pripravoval na to, aby som bol jedným z tolerovaných ľudí: uRaiden Devcon3 Robo, Drones tiež chce krypto

  1. Ja a môj partner, ktorí vlastne postavili Devcon3 RC Car, som naozaj ako roboti. A už ich v dome priniesol armádu ... je to divoký lúpež pre ľudí, ktorí nechcú vyrastať.
  2. Roboty sú zábavné a roztomilé (teraz uel vs. meme duel!)
  3. Hlas Yoda som dal do práce! (začiatok ďalšej kariéry ..)
  4. Roboti nám však dávajú predstavu o tom, čo by mohla byť budúcnosť .

Ako som začal stavať?

~ 5,5 dňa bolo dosť na vykonanie počiatočných nastavení a prototypov robotických spojení pre ETHSingapore.

Potom som počas zimnej dovolenky postavil aktuálnu hru na vrchole prvého prototypu.

Prvé veci: Testovanie robota SDK

Môj partner už vedel, že roboti Wonderovcov mali Python SDK a otestovali niektoré príkazy. Bol to dobrý čas na predstavenie programovania Claudiu, nášho priateľa - čo môže byť zábavnejšie ako programovanie robotov? Tak urobil! Pridal príkazy pre správanie win / strata, spolu s vlastnými soundtracky.

Tok hier

Už som napísal niekoľko nápadov, ako by hra mohla vyzerať. Takže namiesto toho, aby som v tejto chvíli vytvoril logické schémy hry, skočil som do fázy implementácie. Ukázalo sa, že to bol zlý krok, pretože mi to „pomohlo“ urobiť niekoľko nesprávnych rozhodnutí, pretože som nevidel celý obraz (refactored herné stavy a UI, chybná logika herného servera pri výpočte výsledku, táto exploitovaná chyba).

Neskôr som veci opravil a vytvoril som lepšiu logickú postupnosť:

Konečné komponenty

  1. Dark Vader RobotServer a Blue Yoda RobotServer
  2. GameGuardianServer
  3. GameGuardianRaidenNode
  4. GameClient
  5. Live Stream on Twitch

2, 3, 4 sú hostené na digitálnom oceáne VPS.

Robotické servery sú hosťované na dvoch domácich počítačoch.

Jeden z týchto počítačov vykonáva aj živé vysielanie prostredníctvom webovej kamery. Vyskúšali sme veľa možností živého toku - od najpopulárnejších až po hostované, dokonca aj pri pohľade na decentralizované riešenia, ale všetky mali nevýhody (latencia, rozlíšenie, dynamické ID prúdu, časovo náročné nastavenie atď.)

Používateľské rozhranie GameClient

Vlastne som začal s UI ako prvý.

Môj partner navrhol použiť rovnaký posúvač, aký som už mal v programe Pipeline, a zobraziť každý stav hry na samostatnej snímke. Myslel som, že to bol skvelý nápad. Bolo to ako príbehová kniha.

export const GameState = {
    null: 0, // Nie je spustená žiadna aktuálna hra
    otvorené: 1, // Počas hry môžu používatelia robiť pohyby
    zatvorené: 2, // Počas riešenia rozlíšenia hry čakajú používatelia na výsledky a platby
    vyriešené: 3, // Hra a rozlíšenie skončili.
}

Tu nájdete kód na zobrazenie stavu hry.

GameGuardianServer

Po predstave o herných stavoch som pristúpil k definovaniu hry a presunu modelov, ktoré zodpovedajú databáze kolekcií MongoDB. Aktuálnu verziu nájdete tu.

Potom som pridal API GameGuardian Raiden a implementoval logiku výsledku hry, aby som vypočítal víťazov, odoslal platby mimo reťazec a spustil pohyby robota. Spúšťa kód? urobte PR na zlepšenie!

move = await moveController.find ({where: {gameId: id}, order: ["_id ASC"]});
raidenPayments = await this.getRaidenPayments (TOKEN)
move.forEach (sentMove => {
    ak (
        sentMove.amount &&
        sentMove.move &&
        sentMove.amount> = game.move_amount
    ) {
        raidenPayment = raidenPayments [0] .find ((platba) => {
            return payment.identifier === sentMove.paymentIdentifier;
        });
        if (raidenPayment) {
            total_amount + = sentMove.amount;
            move_count [sentMove.playerId] [sentMove.move] + = 1;
            validMoves.push (sentMove);
        }
    }
});

sort_moves_1 = Object.entries (move_count ['1']). sort ((a: any, b: any) => {return a [1] - b [1]});
sort_moves_2 = Object.entries (move_count ['2']). sort ((a: any, b: any) => {return a [1] - b [1]});
move1 = sort_moves_1 [2] [1]> 0? sort_moves_1 [2] [0]: null;
move2 = sort_moves_2 [2] [1]> 0? sort_moves_2 [2] [0]: RockPaperScissorsGetLoser [move1];
// Ak máme jedného hráča, uistite sa, že vyhrá
if (! move1) {
    move1 = RockPaperScissorsGetLoser [move2];
}
winMove = RockPaperScissorsGetLoser [move1] === move2? move1: move2;
validMoves.forEach ((move) => {
    // Odmeníme oboch hráčov, ak sú ich posledné ťahy rovnaké
    if (move.move === winMove) {
        winningMoves.push (krok);
    }
});
guardian_amount = total_amount / 10;
total_amount - = guardian_amount;
winner_amount = total_amount / winMoves.length;
gameUpdate = {
        winningMove,
        player1:  {
            count: sort_moves_1 [0] [1] + sort_moves_1 [1] [1] + sort_moves_1 [2] [1],
            pohyb: pohyb1,
            move_count: move_count ['1'],
        },
        player2:  {
            count: sort_moves_2 [0] [1] + sort_moves_2 [1] [1] + sort_moves_2 [2] [1],
            pohyb: pohyb2,
            move_count: move_count ['2'],
        },
        suma: winner_amount,
        amountGuardian: guardian_amount,
        hráči: move.length,
};

this.updateById (id, gameUpdate);
// Platby Raiden výhercom
winMoves.forEach ((move) => {
    this.sendRaidenPayment (
        token
        move.userAddress,
        winner_amount,
        move.paymentIdentifier
    );
});
this.sendRobotCommands (move1, move2, winMove);

Časový manažment: Kľúč k úspechu

Alebo bolesť implementovania časovačov na strane klienta, ktorá sa musí zhodovať so serverom.

Hra je načasovaná a načasované sú aj herné stavy. Pretože som sa rozhodol mať nekonečný počet simultánnych používateľov, musel som obmedziť podporu iba na jednu hru naraz, aby bol vývoj jednoduchý.

Kto teda začína hru?

Za najhorší prístup sa považovalo nastavenie úlohy servera alebo podobného servera na vytváranie hier pravidelne, pretože by to zbytočne zaplnilo databázu.

Rozhodol som sa pre klienta, ktorý spustil nový začiatok hry. Stručne povedané, ak nie je spustená žiadna aktuálna hra, potom je vytvorená klientom. Ak existuje, údaje o hre sa odosielajú klientovi.

Údaje o hre tiež obsahujú počiatočný čas hry spolu s časom gameTime (ako dlho vydrží otvorený stav) a resolTime (ako dlho vydrží rozlíšenie). Klient používa tieto hodnoty na nastavenie časovačov tu a tu.

Časovače sa používajú na spustenie niektorých požiadaviek na server GameGuardianServer. Napríklad, keď sa skončí stav GameOpen, GameClient odošle nespracované údaje o pohybe. Alebo keď je dosiahnutý stav GameResolved, je na server odoslaná požiadavka na vyriešenie stavu hry alebo vrátenie stavu vyriešenia, ak už bol vyriešený, spustenie GameGuardianServera na výpočet výhercov, odoslanie platieb mimo reťazca a spustenie robotických pohybov ,

Roboti - posledné dotyky

Robotické servery sú hosťované na dvoch domácich počítačoch. Prečo dva? Pretože oba roboty Dash a Cue používajú Bluetooth na pripojenie k počítaču. Aktuálna súprava SDK najskôr odpojí všetky pripojené zariadenia a potom pripojí príslušného robota.

Každý robot má niekoľko ciest na: pripojenie k robotovi, nastavenie vzhľadu, pohybové povely, príkazy win / strata. Rozhodol som sa používať Gunicorn, pretože musíme udržiavať proces pripojenia nažive vo všetkých príkazoch.

Všimnite si, že roboty robíme z času na čas prúdom, a to zmenilo náš domov v divnom štúdiu mime.

Pripojenie k internetu a domáci smerovač túto prácu neuľahčili.

závery

Zaujali vás záujem? Vyskúšajte hru: https://cryptoplayer.one

Porozprávajte sa s nami a poskytnite nám spätnú väzbu alebo požiadajte o pomoc s nastavením kanálov Raiden alebo nám pošlite ping, aby ste zobudili roboty! Riot chat

Časť 2 už čoskoro obsahuje viac záverov a robotických trikov ... ale musím tu vidieť nejaké tlieskať!

Prečítajte si: CryptoBotWars - Časť 2: Závery