CryptoBotWars veya Boktan Demolar Nasıl Oluşturulur ve Neden

Neden boktan? Çünkü ben kendimi mahrum bırakmayı seviyorum ve oyun üretime yakın değil.

Jetonlar, Robotlar, Ödeme Kanalları ve Canlı Yayınlar

Bu yüzden, Raiden Network'te bir oyun olan CryptoBotWars'ı yaptım.

Oynamak ister misin? Okumaya devam etmek…

Oyunda, sahne arkasında veya canlı yayın örneğinde gizli bir göz atın. Ve Riot sohbetimize katılın!

Neden? … Bazı sorularım vardı:

  1. Şu an Raiden'in üstüne bir şey inşa etmek kolay mı? Değiştirmesi oldukça kolay olan herhangi bir şeyden yoksun muyuz?
  2. Raiden şu an için bire çok ve çok bire bir ödemeler için, işlerle ilgili sık sık görülen davalarda nasıl çalışır?
  3. İnsanlar Raiden'de böcek bulur mu? En iyi test edenler ipucu olmayan, yeni yerleşik test cihazlarıdır.
  4. Raiden yüksek verim ile iyi davranır mı?
  5. Ödemelere başarıyla aracılık edilir mi (çeşitli yerler ve sistem kurulumları)

Özellikle bir dereceye kadar eğlence ile birleştirilen bir oyun, Raiden'ı denemek için yeni insanları teşvik etme potansiyeline sahip. Daha da ötesi, üstüne bazı ödüller eklerseniz.

Bir oyun… ya da zincir dışı ödemeleri kabul edecek çok ciddi bir hizmet , ama ikincisi için yeterli zamanım olmadı, o yüzden işte:

Karanlık Vader ve Mavi Yoda. Çorba kasesi ve masa tenisi Santa Hat! Harika görünüyor! … 4 metreden uzakta

Bu blog pisti kısmen en sevdiğim Berlin hindistancevizi-tofu-vejeterya çorbasını Thai yediğim Tay restoranına adanmıştır. Bu yüzden Vader Helmets & Santa Hats yapmak için her zaman etrafta bir avuç kasemiz var.

Fikir nasıl ortaya çıktı?

Bir gün, öğle yemeğinde, Raiden üzerine inşa edilebilecek eğlenceli ve basit bir uygulama düşünmeye çalışan Devcon4 Raiden Network atölyesi için fikirleri tartışıyorduk. Her nasılsa, bir oyunun denemek için daha fazla insanı teşvik edebileceği sonucuna vardık.

Bunu biraz daha sonra düşündüm ve sınırsız sayıda kullanıcılı bir oyunun Raiden'ı daha iyi sergileyebileceğine karar verdim.

Ama sonsuz sayıda oyuncu arasında hangi oyunları oynayabilirsin? Belki de bir sonuç için oy vermeyi gerektiren bir şey.

İki oyuncunun birbiriyle iletişim kuramadan kaybını en aza indirmeye çalıştığı ancak amacım için uygun bir oyun çeşidi bulamadığı Mahk Dilmun Dilemma modelini hatırladım.

Daha sonra çizim tahtasına geri döndüm: bir sonuç için oy kullandım.

Sonra yapabileceğin en basit şeyin taş-kağıt-makas olduğunu fark ettim. İki oyuncu, üç hamle, her kullanıcı bir oyuncu ve bir hamle seçer ve oyuncu başına çoğunluk son hamleyi seçer. Ardından asıl oyun, seçilen iki çoğunluk hareketi arasında oynanabilir.

Sonunda, ekip Deva ile uzayda tanınmış bazı insanlar arasında eğlenceli bir yarış sergiledi ve tanıtım atölyesini Devcon'a uygun memler ile biraz heyecanlandıran ile birleştirdi.

Ancak, yine de rock-paper-scissors demo'umu oluşturmak istedim ve ETHSingapore bunu yapmak için iyi bir zaman gibi geldi! (Dark Vader ve Blue Yoda Singapur'u ziyaret etti, ancak çözmek zorunda kaldığım diğer çeşitli teknik sorunlar nedeniyle gösteriye dahil edilmediler. )

Robotlar Kripto İstiyor

Bir oyunun var, Raiden var, neden denklemine başka bir değişken ekledin?

Robotlar çok fazla acıya neden oluyor ve Robot Apocalypse hakkında konuşmuyorum. Gördüğünüz halde, uzun zamandır hoşgörülü insanlardan biri olmaya hazırım: uRaiden Devcon3 Robo, Dronlar da kripto istiyor

  1. Ben ve aslında Devcon3 RC Car'ı yapan ortağım, robotları gerçekten seviyoruz. Ve çoktan eve bir ordu getirdi ... büyümek istemeyen insanlar için en vahşi olanı.
  2. Robotlar eğlenceli ve sevimli (şimdi meme uel meme düello!)
  3. Yoda sesimi işe koyuyorum! (başka bir kariyere başlıyor ..)
  4. Fakat aslında robotlar bize geleceğin ne olabileceğine dair bir fikir veriyor.

İnşa etmeye nasıl başladım?

ETHSingapore için ilk kurulum ve robot prototip bağlantılarını yapmak için 5.5 gün yeterliydi.

Daha sonra, kış tatili boyunca mevcut oyunu ilk prototipin üzerine kurdum.

İlk önce ilk şeyler: Robot SDK’yı test etmek

Ortağım, Wonder Robots'un bir Python SDK'sı olduğunu zaten biliyordu ve bazı komutları test etti. Programlamaya bir arkadaşımız olan Claudiu'yu tanıtmak için iyi bir zamandı. Programlama robotlarından daha eğlenceli ne olabilir ki? Öyleyse yaptı! Özel müziklerle birlikte kazan / kaybet davranışı için komutlar ekledi.

Oyun akışı

Oyunun neye benzeyeceğine dair bazı fikirler yazmıştım. Böylece, aslında bu noktada oyunun mantık şemalarını oluşturmak yerine, uygulama aşamasına geçtim. Bu kötü bir hamle olarak ortaya çıktı çünkü “resmin” bütün resmi göremediğim için bazı yanlış kararlar almamı sağladı (refactored oyun durumları ve UI, sonucun hesaplanmasında hatalı oyun sunucusu mantığı, bu istismar hatası).

Sonunda işleri daha sonra düzelttim ve daha iyi bir mantık sırası yarattım:

Son Bileşenler

  1. Karanlık Vader RobotServer ve Mavi Yoda RobotServer
  2. GameGuardianServer
  3. GameGuardianRaidenNode
  4. Oyun istemcisi
  5. Twitch Canlı Yayın

2, 3, 4 Digital Ocean VPS'de barındırılmaktadır.

Robot sunucular iki ev bilgisayarında barındırılmaktadır.

Bu bilgisayarlardan biri aynı zamanda web kamerasından canlı yayın yapıyor. Pek çok canlı yayın seçeneği denedik - en popülerden kendi ev sahipliğine, hatta merkezileşmemiş çözümlere bakarken bile, hepsinin dezavantajları (gecikme, çözünürlük, dinamik akış kimliği, kurulum için zaman harcayan vs.) vardı.

GameClient UI

Aslında ilk önce UI ile başladım.

Eşim zaten Pipeline'da olan aynı sürgüyü kullanmayı ve her oyun durumunu ayrı bir slaytta göstermesini önerdi. Bunun harika bir fikir olduğunu düşündüm. Bir hikaye kitabı gibi hissettim.

ihracat const GameState = {
    null: 0, // Geçerli oyun yok
    açık: 1, // Oyun süresince kullanıcılar hamle yapabilir
    kapandı: 2, // Oyun çözünürlük süresi boyunca, kullanıcılar sonuçları ve ödemeleri bekliyor
    çözüldü: 3, // Oyun ve çözünürlük sona erdi.
}

Oyun durumu kodunu burada görebilirsiniz.

GameGuardianServer

Oyun durumları hakkında bir fikir edindikten sonra, MongoDB koleksiyonları veritabanına karşılık gelen oyunu tanımlamaya ve modelleri hareket ettirmeye devam ettim. Buradaki güncel sürüme bakınız.

Daha sonra GameGuardian Raiden API'sini ekledim ve kazananları hesaplamak, zincir dışı ödemeleri göndermek ve robot hareketlerini tetiklemek için oyun sonuç mantığını uyguladım. Kod tarafından tetiklendi mi? geliştirmek için bir PR yapmak!

moving = bekliyor bekliyor moveController.find ({where: {gameId: id}, sipariş: ["_id ASC"]});
raidenPayments = bunu bekliyor.getRaidenPayments (TOKEN)
moving.forEach (sentMove => {
    Eğer (
        sentMove.amount ve&
        sentMove.move &&
        sentMove.amount> = game.move_amount
    ) {
        raidenPayment = raidenPayments [0] .find ((ödeme) => {
            return.det.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) => {bir [1] - b [1]} döndür);
sort_moves_2 = Object.entries (move_count ['2']). sort ((a: any, b: any) => {bir [1] - b [1]} döndür);
move1 = sort_moves_1 [2] [1]> 0? Sort_Moves_1 [2] [0]: Boş;
move2 = sıralanmış_ hareketler_2 [2] [1]> 0? sort_moves_2 [2] [0]: RockPaperScissorsGetLoser [move1];
// Bir oyuncumuz varsa, kazandığından emin ol
if (! move1) {
    move1 = RockPaperScissorsGetLoser [move2];
}
winningMove = RockPaperScissorsGetLoser [move1] === move2? move1: move2;
validMoves.forEach ((move) => {
    // Her iki oyuncuyu da son hamlelerinin aynı olması durumunda ödüllendiririz
    if (move.move === winningMove) {
        winningMoves.push (hareket);
    }
});
guardian_amount = total_amount / 10;
total_amount - = guardian_amount;
winner_amount = total_amount / winningMoves.length;
gameUpdate = {
        winningMove,
        player1:  {
            count: Sort_Moves_1 [0] [1] + Sort_Moves_1 [1] [1] + Sort_Moves_1 [2] [1],
            taşı: taşı1,
            move_count: move_count ['1'],
        },
        player2:  {
            count: Sort_Moves_2 [0] [1] + Sort_Moves_2 [1] [1] + Sort_Moves_2 [2] [1],
            taşı: taşı2,
            move_count: move_count ['2'],
        },
        tutarı: winner_amount,
        amountGuardian: guardian_amount,
        oyuncu: hamle.
};

this.updateById (id, gameUpdate);
// Kazananlara Raiden ödemeleri yapın
winningMoves.forEach ((hareket) => {
    this.sendRaidenPayment (
        JETON,
        move.userAddress,
        winner_amount,
        move.paymentIdentifier
    );
});
this.sendRobotCommands (move1, move2, winningMove);

Zaman Yönetimi: Başarının Anahtarı

Veya müşteri tarafında zamanlayıcıları uygulamanın acısı, sunucuya uyması gerekir.

Oyun zamanlanmış ve oyun durumları da zamanlanmış. Sonsuz sayıda eşzamanlı kullanıcıya sahip olmayı seçtiğim için, gelişmeyi basitleştirmek için bir seferde yalnızca bir oyuna olan desteği kısıtlamak zorunda kaldım.

Peki oyuna kim başlar?

Bir sunucu cron işi veya düzenli olarak oyun oluşturmak için benzer şekilde ayarlamak, veritabanını işe yaramaz bir şekilde dolduracağı için en kötü yaklaşım gibi görünüyordu.

Yeni oyun başlangıcını tetikleyen bir müşteri seçtim. Kısacası, eğer mevcut bir oyun mevcut değilse, o zaman bir müşteri tarafından yaratılır. Varsa, oyun verileri müşteriye gönderilir.

Oyun verileri aynı zamanda oyunun startTime'ını, gameTime (açık durum ne kadar sürecek) ve resolTime (çözünürlük ne kadar sürecek) ile birlikte içerir. İstemci, zamanlayıcıları burada ve burada ayarlamak için bu değerleri kullanır.

Zamanlayıcılar, GameGuardianServer'a yapılan bazı istekleri tetiklemek için kullanılır. Örneğin, GameOpen durumu sona erdiğinde, GameClient ham hamle verilerini gönderir. Veya GameResolved durumuna ulaşıldığında, sunucuya, oyun durumunu çözmesi veya daha önce çözülmüşse çözüm durumunu döndürmesi için bir istek gönderilir, GameGuardianServer'ı kazananları hesaplamak, zincir dışı ödemeleri göndermek ve robot hareketlerini tetiklemek için tetikler. .

Robotlar - son dokunuşlar

Robot sunucular iki ev bilgisayarında barındırılmaktadır. Neden iki? Çünkü her iki Dash & Cue robotu da bilgisayara bağlanmak için Bluetooth kullanıyor. Mevcut SDK önce tüm bağlı cihazların bağlantısını keser, ardından uygun robotu bağlar.

Her robotun birden fazla rotası vardır: robota bağlanma, görünümü ayarlama, konuşma komutlarını taşıma, kazan / kaybet komutları. Gunicorn'u kullanmayı seçtim, çünkü bağlantı işlemini tüm komutlar boyunca canlı tutmamız gerekiyor.

Zaman zaman robotları canlı yayınladığımızı ve bunun tuhaf bir mim stüdyosunda evimizi dönüştürdüğünü unutmayın.

İnternet bağlantısı ve ev yönlendirici işi daha kolay hale getirmedi.

Sonuçlar

İlginizi mi arttırdınız? Oyunu deneyin: https://cryptoplayer.one

Raiden kanallarınızı ayarlamak veya robotları uyandırmak için bize ping etmek için geri bildirim vermek veya yardım istemek için bizimle sohbet edin! İsyan sohbet

2. Bölüm yakında daha fazla sonuç ve robot numarasıyla gelecek… ama burada bazı alkışlar görmem gerek!

Oku: CryptoBotWars - Bölüm 2: Sonuçlar