CryptoBotWars ili kako napraviti usrani demo i zašto

Zašto sranje? Jer volim samouništavanje i igra je tamo gdje nema proizvodnje.

Tokeni, roboti, kanali za plaćanje i prijenos uživo

Tako sam izgradio CryptoBotWars, igru ​​na Raiden Network-u.

Želite li igrati? Nastavi čitati…

Pogledajte igru, iza kulisa ili uzorak prijenosa uživo. I pridružite se našem Riot chatu!

Zašto? ... Imao sam nekoliko pitanja:

  1. Je li lako odmah na Raidenu izgraditi nešto? Nedostaje li nam nešto što je prilično lako promijeniti?
  2. Kako bi Raiden trenutno radio za uplate jedan prema mnogima i više osoba, slučajevi koji se često odnose na tvrtke
  3. Bi li ljudi pronašli bube u Raidenu? Najbolji su testeri, novi, ugrađeni testeri.
  4. Bi li se Raiden lijepo ponašao s visokom propusnošću?
  5. Hoće li se plaćanja uspješno posredovati (razne lokacije i postavke sustava)

Igra, posebno u kombinaciji s određenim stupnjem zabave, može potaknuti nove ljude da isprobaju Raiden. Čak štoviše, dodate li i malo nagrade na vrh.

Igra ... ili vrlo ozbiljna usluga koja bi prihvatila plaćanja izvan lanca , ali nisam imao dovoljno vremena za ovo, pa eto:

Tamni Vader i Plavi Yoda. Zdjela za supe i kapa s ping-pongom Santa! Izgleda super! … Udaljen 4 m

Ovaj blogpost djelomično je posvećen tajlandskom restoranu u kojem nabavljam svoju omiljenu berlinsku juhu od kokosovog oraha i tofu-povrća . Zbog toga uvijek imamo hrpu posuda za pravljenje automobila za izradu Vader kaciga i Santa šešira .

Kako je došlo do ideje?

Jednog dana, za vrijeme ručka, raspravljali smo o idejama za radionicu Devcon4 Raiden Network, pokušavajući smisliti zabavnu i jednostavnu aplikaciju koja se može graditi na vrhu Raidena. Nekako smo došli do zaključka da igra može potaknuti više ljudi da ih isprobaju.

Nakon toga sam malo više razmislio o tome i odlučio sam da igra s neograničenim brojem korisnika može bolje prikazati Raiden jer bi testirala propusnost.

Ali koje igre možete igrati između beskonačnog broja igrača? Možda nešto što zahtijeva glasovanje za ishod.

Prisjetio sam se modela dileme zatvorenika, gdje dva igrača pokušavaju umanjiti svoj gubitak bez mogućnosti međusobne komunikacije, ali nisu mogli pronaći prikladnu varijantu igre za moju svrhu.

Potom sam se vratio na ploču za crtanje: glasao za ishod.

Tada sam shvatio da je najjednostavnija stvar koju možete napraviti škare za papir. Dva igrača, tri poteza, svaki korisnik odabire igrača i potez i većina po igraču odlučuje o konačnom potezu. Tada se stvarna igra može igrati između dva većinski izabrana poteza.

Na kraju je ekipa prikazala zabavnu utrku između Deve i nekih poznatih ljudi u svemirskom prostoru, kombinirajući uvodnu radionicu s Devcon-ovim prigodnim uspomenama i nekim uzbuđenjem .

Ali, ipak sam želio izraditi svoj demo-papir-škare za novinare i ETHSingapore izgledao je kao pravo vrijeme za to! (Dark Vader i Blue Yoda posjetili su Singapur, ali oni nisu bili uključeni u demonstraciju, zbog drugih različitih tehničkih problema koje sam morao riješiti )

Roboti žele kripto

Imate igru, imate Raidena, zašto dodavati drugu varijablu u jednadžbu?

A roboti uzrokuju puno boli i ne govorim o apokalipsi robota. Iako vidite, već neko vrijeme pripremam se da budem jedan od toleriranih ljudi: uRaiden Devcon3 Robo, Dronovi također žele kriptovalute

  1. Ja i moj partner, koji smo zapravo napravili Devcon3 RC Car, stvarno volimo robote. I on je već doveo armiju u kuću ... to je divlji robowest za ljude koji ne žele odrasti.
  2. Roboti su zabavni i simpatični ( vs. meme duel sad!)
  3. Uključio sam svoj Yoda glas na posao! (početak još jedne karijere ..)
  4. Ali zapravo roboti nam daju osjećaj kakva bi budućnost mogla biti .

Kako sam započeo graditi?

~ 5,5 dana bilo je dovoljno za početnu instalacijsku i prototipsku vezu protokola za ETHSingapore.

Zatim sam tijekom zimskog odmora izgradio trenutnu igru ​​na vrhu prvog prototipa.

Prvo stvari prvo: testiranje robota SDK

Moj partner je već znao da Wonder Roboti imaju Python SDK i testirali su neke naredbe. Bilo je ovo dobro vrijeme za upoznavanje Claudiua, našeg prijatelja u programiranju - što može biti zabavnije od programiranja robota ?? Tako je i učinio! Dodao je naredbe za ponašanje pobjede / poraza, zajedno s prilagođenim zvučnim zapisima.

Igra protoka

Već sam napisao neke ideje kako igra može izgledati. Dakle, umjesto da u ovom trenutku zapravo stvorim logičke dijagrame igre, preskočio sam fazu implementacije. Pokazalo se da je to loš potez, jer mi je "pomogao" da donesem neke pogrešne odluke, jer nisam vidio cijelu sliku (ponovno aktivirano stanje igre i korisničko sučelje, neispravna logika poslužitelja igara za izračunavanje ishoda, ovaj bug iskorištavanja.

Kasnije sam stvari popravio i stvorio bolji logički slijed:

Konačne komponente

  1. Dark Vader RobotServer i plavi Yoda RobotServer
  2. GameGuardianServer
  3. GameGuardianRaidenNode
  4. GameClient
  5. Prenos uživo na Twitch

2, 3, 4 smješteni su na Digital Ocean VPS.

Poslužitelji robota nalaze se na dva kućna računala.

Jedno od ovih računala također vrši live streaming putem web kamere. Isprobali smo puno opcija prijenosa uživo - od najpopularnijih do samoposluženih, čak i gledajući decentralizirana rješenja, ali svi su imali nedostatke (latencija, razlučivost, dinamički id stream, dugotrajno postavljanje itd.)

Korisničko sučelje GameClient

Zapravo sam prvo započeo s korisničkim sučeljem.

Moj partner predložio je da koristim isti klizač koji sam već imao u Pipelineu i da svako stanje igre prikazujem na pojedinačnom slajdu. Mislio sam da je to sjajna ideja. Osjećalo se kao knjiga priča.

export const GameState = {
    null: 0, // Ne radi trenutna igra
    otvoreno: 1, // Tijekom igre igra se može kretati
    zatvoreno: 2, // Tijekom vremena rješavanja igre korisnici čekaju rezultate i plaćanja
    riješeno: 3, // Igra i razrješenje je završeno.
}

Ovdje možete pogledati kod za prikaz stanja igre.

GameGuardianServer

Nakon što sam imao ideju o stanju igre, nastavio sam s definiranjem igre i pomicanja modela koji odgovaraju zbirci baze podataka MongoDB. Pogledajte trenutnu verziju ovdje.

Tada sam dodao GameGuardian Raiden API i implementirao logiku ishoda igre, kako bih izračunao pobjednike, poslao izvan lančane isplate i pokrenuo poteze robota. Potaknuo kod? napravite PR da biste ga poboljšali!

potezi = čekaju moveController.find ({gdje: {gameId: id}, red: ["_id ASC"]});
raidenPayments = čekajte ovo.getRaidenPayments (TOKEN)
potezi.forEach (sentMove => {
    ako (
        sentMove.amount &&
        sentMove.move &&
        sentMove.amount> = igra.move_amount
    ) {
        raidenPayment = raidenPayments [0] .find ((plaćanje) => {
            uzvratno plaćanje.identifier === sentMove.paymentIdentifier;
        });
        ako (raidenPayment) {
            total_amount + = sentMove.amount;
            move_count [sentMove.playerId] [sentMove.move] + = 1;
            validMoves.push (sentMove);
        }
    }
});

sorted_moves_1 = Object.entries (move_count ['1']). sort ((a: bilo koji, b: bilo koji) => {return a [1] - b [1]});
sorted_moves_2 = Object.entries (move_count ['2']). sort ((a: bilo koji, b: bilo koji) => {return a [1] - b [1]});
move1 = sorted_moves_1 [2] [1]> 0? sorted_moves_1 [2] [0]: nula;
move2 = sorted_moves_2 [2] [1]> 0? sorted_moves_2 [2] [0]: RockPaperScissorsGetLoser [premjestiti1];
// Ako imamo jednog igrača, pobrinite se da pobijedi
ako (! move1) {
    move1 = RockPaperScissorsGetLoser [move2];
}
winMove = RockPaperScissorsGetLoser [move1] === move2? potez1: potez2;
validMoves.forEach ((premjestiti) => {
    // Nagrađujemo oba igrača ako su njihovi konačni potezi isti
    ako (move.move === winMove) {
        winningMoves.push (korak);
    }
});
guardian_amount = total_amount / 10;
total_amount - = čuvar_amount;
winner_amount = total_amount / winnerMoves.length;
gameUpdate = {
        winningMove,
        player1:  {
            broj: sorted_moves_1 [0] [1] + sorted_moves_1 [1] [1] + sorted_moves_1 [2] [1],
            premjestiti: move1,
            move_count: move_count ['1'],
        }
        player2:  {
            broj: sorted_moves_2 [0] [1] + sorted_moves_2 [1] [1] + sorted_moves_2 [2] [1],
            potez: move2,
            move_count: move_count ['2'],
        }
        iznos: dobitnik_iznosa,
        iznosGuardian: guardian_amount,
        igrači: move.length,
};

this.updateById (id, gameUpdate);
// Izvršite Raiden isplate pobjednicima
winMoves.forEach ((potez) => {
    this.sendRaidenPayment (
        tako,
        move.userAddress,
        winner_amount,
        move.paymentIdentifier
    );
});
this.sendRobotCommands (move1, move2, winMove);

Upravljanje vremenom: ključ uspjeha

Ili bol zbog implementacije tajmera na strani klijenta, koja se mora podudarati s poslužiteljem.

Igra je tempirana, a stanja igre također su tempirana. Kako sam odabrao beskonačan broj istodobnih korisnika, morao sam ograničiti podršku samo na jednu igru ​​u isto vrijeme, kako bih jednostavno razvijao razvoj.

Tko započinje igru?

Čini se da je postavljanje poslužiteljskog posla ili sličnog kreiranja igara za redovito stvaranje igara najgori pristup jer bi napunilo bazu podataka na beskoristan način.

Odlučio sam se za pokretanje klijenta novim pokretanjem igre. Ukratko, ako se ne radi trenutna igra, tada je kreira jedan klijent. Ako postoje, podaci o igri šalju se klijentu.

Podaci igre također sadrže početno vrijeme igre, zajedno s timeTime (koliko će trajati otvoreno stanje) i resolutionTime (koliko će trajati rezolucija). Klijent koristi ove vrijednosti za podešavanje timera ovdje i ovdje.

Mjerači vremena koriste se za pokretanje nekih zahtjeva GameGuardianServer. Na primjer, kada GameOpen stanje završi, GameClient šalje neobrađene podatke o potezu. Ili kad se dosegne stanje GameResolla, poslužitelju se pošalje zahtjev za rješavanje stanja igre ili vraćanje stanje rješavanja ako je već riješeno, aktivirajući GameGuardianServer za izračun pobjednika, slanje izvan lančanih plaćanja i pokretanje robota premješta ,

Roboti - završni dodiri

Poslužitelji robota nalaze se na dva kućna računala. Zašto dvoje? Jer oba Dash & Cue robota koriste Bluetooth za povezivanje s računalom. Trenutačni SDK prvo isključuje sve spojene uređaje, a zatim povezuje odgovarajućeg robota.

Svaki robot ima više ruta za: povezivanje s robotom, postavljanje izgleda, premještanje govornih naredbi, naredbe pobjeda / gubitak. Odlučio sam se za upotrebu Gunicorn-a, jer moramo postupak veze živjeti održavati u svim naredbama.

Imajte na umu da roboti prenosimo povremeno i to je naš dom pretvorilo u čudan mime studio.

Internetska veza i usmjerivač kuće nisu olakšali posao.

Zaključci

Potaknulo je vaše zanimanje? Isprobajte igru: https://cryptoplayer.one

Razgovarajte s nama kako biste dobili povratne informacije ili zatražili pomoć u postavljanju svojih Raiden kanala ili nas pingi da probudimo robote! Bunt chat

Drugi dio uskoro dolazi s više zaključaka i trikovima sa robotima ... ali ovdje moram vidjeti neke klape!

Pročitajte: CryptoBotWars - Dio 2: Zaključci