Basit Oyunum ile İlgili Basit Problem

Merhaba.Arkadaşlar hemen örnek olarak sorunumu ve ve yapmak istediğimi anlatayım.
Veritabanında bulunan 100 tane oyuncuyu 1 tane bota saldırtıyorum.Güç hespalamaları oyuncuları çekme vs her şey tamam sorun yok.
Saldırı düzenlerken oyuncuları sırasıyla ya da rastgele bot yok olana kadar saldırtıyorum.Buraya kadar da sorun yok.
Benim istediğim ise oyuncuların mesela 20 kişinin aynı anda bir vuruş yapması sonra bu oyuncular 5 saniye beklerken diğer atıyorum 45 oyuncunun saldırması ve her saldırı yapan oyuncunun belli süre beklemesi.
Peki bunu yapabilir miyim ?Şöyle bir çözümüm var;oyuncuların tamamını listelere vs çekerek rastgele ekipler alıp bunların güçlerini toplayarak bot canından düşürerek yaparım.Ancak böyle bir çözümde her oyuncunun gücünü almak toplamak.Saldıran ekipi çıkarıp bekletmek.Bir sürü listeyle döngüyle uğraşmak zorunda kalacağım.Yok mudur daha kısa yolu çözümü?

def Event(a=0,b=0):
    x=a;xx=b
    loop=0
    try:
        while True:
            npc_list=server.Npc()
            print(loop)
            connect=sql.connect("C:\\Users\Efkan\PycharmProjects\pythonProject\dosya\\denemetaban.db")
            cursor=connect.cursor()
            cursor.execute(
                "SELECT level,cannon1,cannon2,cannon3,username,xp,money,npcsunk FROM players WHERE id={}".format(
                    random.choice(server_list)))
            data=cursor.fetchall()
            level=(data[0][0])
            cannon1=data[0][1]
            cannon2=data[0][2]
            cannon3=data[0][3]
            playername=data[0][4]
            playerxp=int(data[0][5])
            money=int(data[0][6])
            npcsunk=int(data[0][7])
            playerhp=10000
            power=((int(cannon1) * kartopu_power * _35power + int(cannon2) * kartopu_power * _25power + int(
                cannon3) * kartopu_power * _15power))

            npc_name=npc_list[9][0]
            npc_hp=int(npc_list[9][1])
            npc_power=4200
            npc_prize=int(npc_list[9][2])
            npc_xp=int(npc_list[9][3])
            a=6
            b=5
            while True:
                if playerhp > 0 and npc_hp > 0:
                    if a % 6 == 0:
                        time.sleep(x)
                        if npc_hp <= power:
                            # print("{} Oyuncusu {} vurdu rakip battı".format(playername, npc_hp))
                            npc_hp=0
                            break
                        # print("{} Oyuncusu {} vurdu".format(playername, power))
                        npc_hp-=int(power)
                        # print("{} oyuncusunun canı {}, {} oyuncusunun canı {}".format(playername, playerhp, npc_name,npc_hp))
                        time.sleep(x)
                    if b % 5 == 0:
                        if playerhp <= npc_power:
                            # print("{} Oyuncusu {} vurdu rakip battı".format(npc_name, playerhp))
                            playerhp=0
                            break
                        # print("{} Oyuncusu {} vurdu".format(npc_name, npc_power))
                        playerhp-=int(npc_power)
                        # print("{} oyuncusunun canı {}, {} oyuncusunun canı {}".format(playername, playerhp, npc_name,npc_hp))
                        time.sleep(xx)
                        a+=1
                        b+=1

                    else:
                        time.sleep(xx)
                        a+=1
                        b+=1
                else:
                    break
            if playerhp >= npc_hp:
                playerxp+=npc_xp
                money+=npc_prize
                npcsunk+=1
                print("Etkinliği Kazanan {}  {}  gemisi battı.{} {} altın ve {} xp kazandı".format(playername, npc_name,
                                                                                                   playername,
                                                                                                   npc_prize, npc_xp))
                cursor.execute(
                    "UPDATE players SET money={},xp={},npcsunk={} WHERE username='{}'".format(money, playerxp, npcsunk,
                                                                                              playername))
                connect.commit()
                quit()

            else:
                npc_hp=npc_hp
                print("Kazanan {}  {} oyuncusunun gemisi battı".format(npc_name, playername))
                cursor.execute("UPDATE npc SET hp={} WHERE npc='{}'".format(npc_hp, npc_name))
                connect.commit()
                loop+=1

Dip Not:Loop değişkeni kaç farklı saldırı yapıldığını tutmak için kullandım.
a,b parametreleri ise fonksiyon içerisindeki x,xx beklemelerine süre göndermek için.
Mod kullanma sebebi ise iki kişinin karşılıklı saldırılarını farklı sürelerde yaptırmak için.
Dikkat ederseniz server_list teki oyuncuları rastgele almak sadece 1 oyuncu olarak almak zorunda kalıyorum.

Ayni anda mi? Kodda bir tanesi var gibi

Yapabilirsin. Gayet kisa, temiz bir cozumu olmasi olasi fakat bunu su noktada gormemize imkan yok.

Mevcut kodda duzenlemeye gitmen lazim. Event nedir? a nedir, b nedir? x nedir, xx nedir?

Database’e baglanan kod ile dovus mekanizmasini isleten kod ile kullaniciya/NPC’ye hasar veren mekanizma ayni fonksiyonda olmamali. Kodu yaptigi ise gore ve okunabilirligi arttiracak sekilde fonksiyonel parcalara bolmen, sonra her parcayi ayri bir fonksiyon veya objeye ataman lazim.

Kodu okuyamayinca haliyle fonksiyon onermek de zor oluyor. Ama player/NPC okuyan kodlari ayirarak baslayabilirsin. Sonra vurma/batma mekanizmasi bir fonksiyona alinabilir belki. Veya ilgili power/hp/vs. ozelliklerini bir arada tutan birer Player ve NPC veya beraber Canli objesi yaratilabilir.

Hocam cevabınız için çok teşekkür ederim.Kodları düzenlemek ve fonksiyonları ayırmak ilk önceliğim olacak.
Diyelim ki veritabanınızda 100 tane oyuncu var ve bunları çekip Oyuncu() gibi bir sınıftan güçlerini,diğer özelliklerini oluşturdunuz.
Bu oyuncuların her biri 4 10 gibi değerlerde vuruş güçlerine sahip olsunlar ve 1000 HP enerjili sisteme saldırmaya çalışsınlar.Bunların her bir vuruştan sonra belli bir süre beklemelerini nasıl ve hangi mantıkla ayarlayabilirim.
Örneğin 30 oyuncu vuruş yaptı ve 5 saniye bekleyecekler.
Acaba Oyuncu sınıfında bekleme süresi vb bir örnek niteliği tanımlayarak çözebilir miyim?
Umarım anlatabilmişimdir .Sizin çözümünüz ne olurdu paylaşırsanız sevinirim.
Cevabınız için de ayrıca teşekkürler farklı çözüm yollarını uyandırdınız…
Dip Not:Hocam kodda server_list adlı bir listeden oyuncu seçiyorum bu arada.

Evet, hatta baska bir yolunu dusunemiyorum. Oyun suresini oyuncunun eline verip gerekli beklemeyi yapmasini saglamak gorevine aykiri olur.

Alternatif olarak, gecen sureyi oyuncuya raporlayip onemli yerlerde “vurmaya hazir misin” sorusu sorulabilir. (Ve evet, oyuncu sinifindan bahsediyorum.)

1 Beğeni