Oyun eklentileri yapmaya gelince, Python kim kaybetti?

Bilgisayar oyunları oynayan sınıf arkadaşları kesinlikle eklentilere yabancı değildir, ancak onu kullanırken bir eklenti yapmayı hiç düşündünüz mü?

4399 mini oyun web sitesini açtım ve bilinmeyen bir oyuna tıkladım. Hmm, yan tarafta suşi var. Misafirler geldikten sonra onlara gereksinimlerini söyle. Sadece menüyü takip et ve ona ver ~

Öncelikle şunu belirtmeliyiz ki, buradaki oyun eklentisi konseptinin büyük online oyunlardaki eklentilerden farklı olduğunu, canavarları otomatik olarak öldüremez, ilaç içemez ve GM'den kaçamaz ... Bu eklentinin kullanımı nedir? Güzel soru, işe yaramaz. Zamanınızı boşa harcamak, programlama becerilerinizi geliştirmek ve eklenti temeline birazcık eklemek dışında faydasızdır. Dünyayı sarsan ağlayan bir hayalet yaratıyorsanız, hepsi bu. Hedef olarak süper tanrının eklentisini açarsanız, korkarım hayal kırıklığına uğrayacaksınız, lütfen mümkün olan en kısa sürede yoldan çıkın. Amacım çok basit, bu küçük oyunu otomatik olarak oynamak.

1. Araç hazırlama

Autopy ve PIL ve pywin32 paketini kurmanız gerekir.

Autopy, otomatik işlem için bir python kitaplığıdır. Bazı fare ve klavye olaylarını simüle edebilir ve ekrana da erişebilir. Başlangıçta, giriş olaylarını simüle etmek için win32api kullanmak istedim. Bunun nispeten basit olduğunu buldum. En güçlü şey, çapraz platform olmasıdır. Lütfen arayın ve kurun.

PIL ünlüdür, Python görüntü işlemenin 1 numarasıdır, aşağıda ne için kullanılacağı açıklanacaktır.

Pywin32 aslında gerekli değil, ancak kolaylık sağlamak için (fare kendi kendine hareket ediyor, nasıl sona erdirilir) yine de kurmanız tavsiye edilir. Bu arada, bunu kazanma platformunda yaptım.Eklentiye muhtemelen sadece Windows kullanıcıları tarafından mı ihtiyaç duyuluyor?

Ekran yakalama ve görüntü işleme araçları

Ekran yakalama, oyun ipuçlarının analizi için oyun görüntüleri elde etmektir.Aslında, doğrudan Ekranı Yazdır ve görüntü işleme aracına yapıştırmak için özel bir araç yoktur. Kullanımı oldukça kolay olan ve bireysel kullanıcılar için ücretsiz olan PicPick'i kullanıyorum. Görüntü işleme çeşitli bilgiler elde etmektir, sipariş görüntüsünü elde etmek ve harici analiz ve yargılama için kaydetmek için kullanmamız gerekir. PhotoShop kullanıyorum ... Adobe'ye aslında PicPick'teki yerleşik resim düzenleyicinin yeterli olduğunu söylemeyin, resim koordinatlarını ve klip resimlerini görüntüleyebildiğiniz sürece sorun değil, ama ben PS'ye alıştım ~

Bu oyunu izlerken 8 çeşit yemek vardır ve her yemeğin sabit bir yöntemi vardır.Müşteri oturduktan sonra kafasının üstünde bir resim olacaktır.Resme bakın hangi yemeği sipariş etmek istediğini öğrenmek için sol taraftaki hammadde alanına tıklayın ve ardından ... Ne dendiğini bilmiyorum, bambu slip gibi, yemekler hazırlanıyor ve sonra pişmiş yemeği müşteriye sürüklüyor.

Müşterinin kafasında gösterilen resmin konumu sabittir ve toplamda yalnızca dört konum vardır. Tek tek analiz edebiliriz ve hammaddelerin konumu da sabittir. Her yemeğin yöntemi daha nettir, böylece tamamen yargılayabiliriz. Program, inceliğin bir kısmını yapmamıza ve iyi sunmamıza yardımcı olabilir, böylece para akıyor :)

2. Fareyi hareket ettirin

Bu komut, fareyi hızlı bir şekilde belirtilen ekran koordinatlarına hareket ettirecektir. Ekran koordinatlarının ne olduğunu biliyor musunuz. Sol üst köşe (0,0) ve ardından aşağı doğru artar, bu nedenle 1024 × 768 ekranın sağ alt köşesinin koordinatları ... siz Evet tahmin ettiniz (1023,767).

Maalesef, bu komutu gerçekten kullanırsanız ve ardından mevcut koordinatları almak için autopy.mouse.get_pos () kullanırsanız, bunun açık (100,100) değil, örneğin makinemde daha küçük olduğunu görürsünüz (97 , 99), çözünürlükle ilgili. Bu hareket, kullanıcı ve pencerelerde mouse_event işlevidir. API'yi bilmiyorsanız, bunu bilmekte fayda vardır, ancak koordinatlar çok doğru değildir. Benim kadar merak ediyorsanız, otopinin kaynak kodunu okuyabilirsiniz.Mutlak koordinatları hesaplamak için kullandığı algoritmanın sorunları olduğunu buldum:

point.x * = 0xFFFF / GetSystemMetrics (SM_CXSCREEN);

Önce bölün ve sonra burada çarpın.Küçük bir hesaplama yöntemi öğrenmiş olanlar, tamsayı işlemleri için çarpıp sonra bölmeniz gerektiğini bilmelidir, aksi takdirde nispeten büyük bir hata üretecektir.

point.x = point.x * 0xffff / GetSystemMetrics (SM_CXSCREEN);

Daha doğru olacak, teorik olarak biraz daha yavaş olacak, ancak kodu değiştirip yeniden derleyemeyecek kadar tembelim, birkaç piksel kısa, bu bizi burada fazla etkilemeyecek ~ dersimizi öğrenelim

3. Fareyi tıklayın

Bu nispeten basit, ancak buradaki işlemlerin çok çok hızlı olduğunu unutmayın.Oyunun tepki vermemiş olması ve onu tamamlamış olmanız ve sonra başarısız olmanız mümkündür ... Yani gerekirse bir süre uyuyun.

4. Klavye işlemi

Bu sefer klavyeyi kullanmadık, bu yüzden bunun hakkında konuşmayacağım.

Nasıl yapılır? Sadece müşterinin kafasındaki görüntüyü analiz edin. Görüntü edinmeyle başlayalım ~

En sevdiğiniz görüntü düzenleyiciyi açın ve ölçmeye başlayın ~ Görüntünün ekrandaki belirli konumunu bilmemiz gerekiyor. Bir cetvelle ölçülebilir. Doğrudan ölçmek de mümkündür, ancak ekranın sol üst köşesindeki konumu kullandım (yani nokta 1 Referans konumu olarak, resim bir kez değiştiğinde, sadece bir noktanın koordinatlarını değiştirmemiz gerekir, aksi takdirde her noktayı tekrar yazmak mutlu olmaz.

En soldaki müşteri avatarındaki resme baktığımızda, aralığı belirlemek için iki noktaya ihtiyacımız var, yani resmin sol üst köşesi ve sağ alt köşesi, yani nokta 2 ve nokta 3. Arkada üç müşteri pozisyonu vardır, sadece bir artış ekleyin: for döngüsü bunun için doğmuştur!

Benzer şekilde, hammaddelerimizin konumu, "bambu hasır" ın konumu, vb. Hepsi bu yöntemle elde edilebilir. Elde edilen tüm konumların oyun ekranının sol üst köşesine göre göreceli olduğunu unutmayın. Görüntü yakalama yöntemine gelince, PIL'in ImageGrab'ın kullanımı çok kolaydır ve otomatik olarak görüntü de yakalayabilir. Neden kullanmıyorsunuz? Aşağıda bunun hakkında konuşacağım.

5. Görüntüyü analiz edin

Eklentimizde çok zor bir soru ortaya çıkıyor, hangi yemeği aldığımızı nasıl bileceğiz? İnsan gözü için ... köpek gözü için bile, bu çok kolay bir soru, "bir bakışta bilin"! Evet, burası insanların makinelerden daha iyi olduğu yerdir.Çok basit şeyler yapıyoruz ama bilgisayarlar aptal ve net değil.

Otomatik görüntü sınırlamaları

Autopy api'ye bakarsanız, find_bitmap yöntemiyle bir bitmap paketine sahip olduğunu göreceksiniz, bu da büyük bir görüntüde küçük bir örnek görüntü bulmaktır. Akıllı, düşünebilirsin, tüm oyun ekranını kesebiliriz ve ardından hangi yemeğin çağrıldığını bulmak için bu yöntemi kullanarak tüm yemeklerin küçük resimlerini hazırlayabiliriz.

Aslında başta bunu yapma dürtüsü vardı ama hemen pes ettim ... Bu yöntem görüntüleri bulur, hızından bahsetmiyorum, "tam eşleşme" koşulu var, görüntüde RGB değeri 1'den farklı olan bir piksel var. Öğrenemeyecek.

Flaşın bir vektör çizimi olduğunu biliyoruz.Zum yaptıktan sonra ekranda nokta matrisli bir resim gösteriyor.Buradaki değişkenler çok büyük. Teoride, aynı girdinin ve aynı algoritmanın sonuçları aynı olmalı, ancak çizim arka planı nedeniyle Beklemek arasındaki ilişkide her zaman küçük bir fark olacaktır ve bu harika işlevi kullanılamaz kılan bu küçük farktır ...

Peki, kullanamamak iyi bir şey, yoksa akıllı görüntü analizi algoritmamıza nasıl yol açabilirim?

Benzerlik görsel arama ilkesi

Google'ın "Görselle Arama" işlevini kullanmış olmanız gerektiğine inanıyorum, değilse, güncel değilsiniz, gidin ve deneyin! Bir resim girdiğinizde, size bu resme benzer tüm resimleri gösterecektir, bu nedenle sevdiğiniz bir resim bulduğunuzda ve çok küçük olduğunu düşündüğünüzde, doğru resmi bulmak için temelde bu yöntemi kullanabilirsiniz. Of ~

Kullanıcının sırasını değerlendirmek için bu benzer prensibi kullanmalıyız. Elbette algoritmamız Google kadar karmaşık olamaz. Zhihu ile ilgili bu sorunu açıklayan çok güzel bir makale var. İlgileniyorsanız, bir göz atabilirsiniz. I Doğrudan uygulamayı verin:

Bu sınıfın bir metodu olduğu için, bir self parametresi vardır ve onu yok sayın. Buradaki img, bir Resim nesnesine aktarılmalıdır; bu, resim dosyasındaki okumanın sonucu veya bir ekran görüntüsü almanın sonucu olabilir. Ölçeklendirilen boyut (18,13) gerçek duruma göre benim tarafımdan belirlenir, çünkü müşterinin avatarındaki yemeğin görüntüsü temelde bu orandır. Gerçekler, bu oranın hala çok önemli olduğunu kanıtladı, çünkü bulaşıklarımız biraz benzer, oran uygun değilse, sıkıştırmadan sonra bozulacak ve yanlış yargılamak kolay (daha önce acı çektim).

Bir resmin "parmak izini" elde ettikten sonra, onu standart resim parmak iziyle karşılaştırabiliriz, onu nasıl karşılaştırabiliriz, iki dizginin karşılık gelen konumlarındaki farklı karakterlerin sayısı olan "hamming mesafesini" kullanmalıyız. Uygulama da çok basit ...

def hamming_dist (self, hash1, hash2):

dönüş toplamı (itertools.imap (operator.ne, hash1, hash2))

Peki, hazırlanan standart resmi kullanabilir, hesaplanan özellik kodunu önceden okuyup saklayabilir ve ardından ekran görüntüsünü onlarla karşılaştırabiliriz. En küçük mesafeli olan karşılık gelen çanaktır.Kod aşağıdaki gibidir:

Başlangıç mesafesi 50'dir. Yakalanan görüntü herhangi bir menüye kıyasla 50'den büyükse, bu ne anlama geliyor?

O pozisyondaki görüntünün bir yemek olmadığını, yani müşterinin henüz o pozisyonda oturmadığını veya oyunu en aza indirdiğimizi (patron geliyor), bununla başa çıkmak çok önemli, rastgele en yakını bulsun ama hiç değil Garnitürler işlenir.

6. Otomatik pişirme

Sorun çok basit. Sadece menünün içindekileri kaydetmemiz ve ilgili pozisyona tıklamamız gerekiyor. Onu aramak için bir sınıf olarak yazdım:

Bu, bu eklentideki en az teknik kategori :) Lütfen yorum ve belge yazmadığım için beni affet, çünkü çok basitler, anladığına inanıyorum.

Tüküremiyorum, kendi kendime bir köşede konuşuyorum
önceki
Anne kaçtı ve babası ortadan kayboldu, 12 yaşındaki çocuk ağır hasta büyükbabasına bakmak için hastanede yalnızdı
Sonraki
Tarihteki en güçlü kulaklık stratejisi, tüm bu kulaklıkları kullandınız mı?
Üçüncü kral! Melo meydan okuma sahnesinde duran bir piramit tanrısı var
Kobe, emekli olduktan sonra İtalya'da göründü, He Dou Dagger'ın fotoğrafı popüler oldu! Xiaobian ve onun fotoğrafına bak
SUV sürüş kontrolünün kralı olarak adlandırılan, FAW-Volkswagen T-ROC ile yapılan tam röportaj
Cep telefonlarında yaygın olarak kullanılan 4 ücretsiz müzik dinleme uygulamasını indirdiniz mi?
Milano şehrinin sembollerini sayın
Liverpool ile Roma arasındaki ilk maçın arkasında genç bir ölüm hikayesi vardı.
Programcı sabahın erken saatlerine kadar fazla mesai yaptı ve bilgisayarını şirkette bıraktı.Ertesi gün patronun yaptığı açıklamayı görünce şok oldu.
İnternette kimse köpek olduğunu bilmeyecek
Yılların tadını korumak için bir kutu beyaz çayın saklayın
Katlanan davet mektubu dikkat çekiyor, OPPO Pakistan büyük hamleler yapabilir
Kobe, emekli olduktan sonra İtalya'da göründü, He Dou Dagger'ın fotoğrafı popüler oldu!
To Top