Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Workflow

Bagaimana membangun sebuah Bot Python yang dapat memainkan permainan Web

by
Difficulty:BeginnerLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Evita Karlina (you can also view the original English article)

Dalam tutorial ini kita akan menjelajahi seluk-beluk bangunan bot berbasis Computer Vision permainan dalam Python, yang akan mampu memainkan permainan Flash populer Sushi pergi bulat. Anda dapat menggunakan teknik yang diajarkan dalam tutorial ini untuk membuat bots untuk pengujian secara otomatis permainan web Anda sendiri.


Hasil akhir Tinjauan

Mari kita lihat hasil akhir yang akan kita upayakan:


Prasyarat

Tutorial ini, dan semua kode di dalamnya, mensyaratkan bahwa beberapa tambahan Python Perpustakaan diinstal. Mereka menyediakan pembungkus Python bagus untuk sekelompok tingkat rendah C kode yang sangat memudahkan proses dan kecepatan skrip bot.

Beberapa kode dan Perpustakaan adalah Windows-spesifik. Mungkin ada yang setara dengan Mac atau Linux, tetapi kami tidak akan membahasnya dalam tutorial ini.

Anda akan perlu untuk men-download dan menginstal Perpustakaan berikut:

  • Python pencitraan Perpustakaan
  • Numpy
  • PyWin
  • Semua hal di atas memiliki installer diri; Menjalankan mereka akan secara otomatis menginstal modul ke direktori \lib\site-packages dan, secara teori, menyesuaikan pythonPath Anda sesuai. Namun dalam prakteknya ini tidak selalu terjadi. Harus Anda mulai menerima pesan impor kesalahan setelah instalasi, Anda mungkin perlu secara manual menyesuaikan variabel lingkungan Anda. Informasi lebih lanjut tentang menyesuaikan variabel Path dapat ditemukan di sini.

Alat akhir yang kita perlukan adalah program layak cat. Saya sarankan Paint.NET sebagai pilihan gratis yang sangat baik, tetapi setiap program dengan penguasa yang menampilkan pengukuran mereka dalam pixel dapat digunakan.

Kita akan menggunakan beberapa permainan sebagai contoh-contoh sepanjang jalan


Pengenalan

Tutorial ini ditulis untuk memberikan pengenalan dasar proses membangun bots bahwa bermain game berbasis browser. Kita akan mengambil pendekatan ini mungkin sedikit berbeda dari apa paling harapkan ketika mereka berpikir bot. Daripada membuat program yang berada di antara kode injeksi klien dan server (seperti bot Gempa atau C / S), bot kami akan murni berada di 'luar'. Kami akan mengandalkan teknik Computer Vision-esque dan panggilan Windows API untuk mengumpulkan informasi yang diperlukan dan menghasilkan gerakan.

Dengan pendekatan ini, kita kehilangan sedikit halus detail dan kontrol, tapi membuat untuk itu dalam waktu singkat dev dan kemudahan penggunaan. Mengotomatisasi fungsi permainan tertentu dapat dilakukan dalam beberapa baris kode pendek, dan bot penuh, mulai-ke-akhir (untuk sebuah permainan sederhana) dapat memutar dalam beberapa jam.

Kebahagiaan pendekatan cepat ini adalah sedemikian rupa sehingga sekali Anda mendapatkan akrab dengan apa yang komputer dapat dengan mudah 'melihat', Anda akan mulai untuk melihat permainan sedikit berbeda. Sebuah contoh yang baik ditemukan dalam teka-teki permainan. Membangun umum melibatkan mengeksploitasi keterbatasan kecepatan manusia untuk memaksa Anda ke dalam kurang dari solusi optimal. Sangat menyenangkan (dan sangat mudah) untuk 'mematahkan' game-game ini dengan menulis dalam gerakan yang tidak pernah bisa dilakukan oleh manusia.

Bot ini juga sangat berguna untuk pengujian game sederhana - tidak seperti manusia, bot tidak akan bosan bermain skenario yang sama berulang-ulang.

Source code untuk semua contoh tutorial, sebagai baik sebagai salah satu contoh selesai bots, dapat ditemukan di sini.

Selamat bersenang-senang!


Langkah 1: Buat sebuah proyek Python yang baru

Dalam folder baru, klik kanan dan pilih New > dokumen teks.

Python_Snapshot_of_entire_screen_area

Setelah dibuat, ganti nama file dari 'Dokumen Teks Baru' menjadi 'quickGrab.py' (tanpa tanda kutip) dan konfirmasikan bahwa Anda ingin mengubah ekstensi nama file.

Python_Snapshot_of_entire_screen_area

Akhirnya, klik kanan pada file kami baru dibuat dan pilih "Mengedit dengan IDLE" dari menu konteks untuk memulai editor

Python_Snapshot_of_entire_screen_area

Langkah 2: Mengkonfigurasi meraih layar pertama Anda

Kami akan mulai bekerja pada bot kami dengan menjelajahi fungsi ambil dasar layar. Sekali up dan menjalankan, kita akan melangkah melalui baris demi baris, seperti fungsi ini (dan yang banyak iterasi) akan menjadi tulang punggung dari kode kita.

Di quickgrab.py masukkan kode berikut:

Menjalankan program ini harus memberikan gambaran lengkap dari area layar:

Python_Snapshot_of_entire_screen_area

Kode saat ini meraih penuh lebar dan tinggi dari area layar Anda dan menyimpannya sebagai PNG di direktori kerja Anda saat ini.

Sekarang mari kita melangkah melalui kode untuk melihat persis bagaimana kerjanya.

Pertama tiga baris:

.. berkas aptly bernama 'Impor pernyataan'. Ini memberitahu Python untuk memuat dalam modul terdaftar pada saat runtime. Ini memberikan kami akses ke metode mereka melalui sintaks module.attribute.

Modul pertama adalah bagian dari Python Image Library yang kami pasang sebelumnya. Seperti namanya, itu memberi kita fungsionalitas dasar layar gabbing bot kami akan bergantung pada.

Baris kedua impor modul OS (Operating System). Ini memberikan kita kemampuan untuk dengan mudah menavigasi sekitar direktori sistem operasi kami. Ini akan sangat berguna setelah kami mulai mengatur aset ke dalam folder yang berbeda.

Impor akhir ini adalah waktu built-in modul. Baik menggunakan ini sebagian besar untuk stamping saat ke snapshot, tetapi hal ini dapat sangat berguna sebagai timer untuk bot yang perlu peristiwa yang dipicu atas sejumlah tertentu detik.

Berikut empat baris membuat jantung fungsi screenGrab() kami.

Pertama baris def screenGrab() mendefinisikan nama fungsi kita. Kurung kosong berarti mengharapkan tanpa argumen.

Baris 2, box=() memberikan tuple kosong ke variabel bernama 'box'. Kita akan mengisi ini dengan argumen-argumen di langkah berikutnya.

Jalur 3, im = ImageGrab.grab() menciptakan gambaran lengkap dari layar Anda dan kembali gambar RGB ke im contoh

Jalur 4 dapat agak rumit jika Anda tidak terbiasa dengan bagaimana modul waktu bekerja. Im.save bagian pertama (panggilan "Simpan" metode dari kelas gambar. Mereka mengharapkan dua argumen. Yang pertama adalah lokasi di mana untuk menyimpan file, dan yang kedua adalah file format.

Di sini kita mengatur lokasi dengan terlebih dahulu memanggil os.getcwd(). Ini mendapat direktori saat ini sedang dijalankan dari kode dan kembali sebagai string. Selanjutnya kita tambahkan +. Ini akan digunakan di antara setiap argumen baru untuk menggabungkan semua senar bersama-sama.

Bagian berikutnya ' \\full_snap__ memberikan kami file nama deskriptif yang sederhana. (Karena backslash karakter escape dengan Python, kita harus menambahkan dua dari mereka untuk menghindari membatalkan keluar salah satu surat kami).

Berikut adalah sedikit berbulu: str(int(time.time())). Ini mengambil keuntungan dari metode Type built-in Python. Kami akan menjelaskan bagian ini dengan bekerja dari dalam ke luar:

time.time() mengembalikan jumlah detik sejak jaman, yang diberikan sebagai tipe Float. Karena kami menciptakan nama file yang kita tidak bisa memiliki desimal di sana, jadi kami terlebih dahulu mengubahnya ke integer oleh pembungkus di int(). Ini membuat kita dekat, tapi Python tidak concatenate tipe Int dengan jenis String, jadi langkah terakhir adalah untuk membungkus segala sesuatu dalam fungsi str() untuk memberikan kita sebuah timestamp dapat digunakan baik untuk nama file. Dari sini, semua yang tersisa adalah menambahkan ekstensi sebagai bagian dari string: + '.png' dan lewat argumen kedua yang lagi jenis ekstensi: "PNG".

Bagian terakhir dari kode kita mendefinisikan fungsi main(), dan mengatakan itu untuk memanggil fungsi screenGrab() setiap kali dijalankan.

Dan di sini, pada akhirnya, adalah sebuah konvensi Python yang memeriksa apakah script tingkat atas, dan jika demikian memungkinkan untuk menjalankan. Diterjemahkan, ini hanya berarti bahwa itu hanya mengeksekusi main() jika dijalankan dengan sendirinya. Sebaliknya - jika, misalnya, ia dimuat sebagai modul dengan skrip Python yang berbeda - ia hanya memasok metode-metodenya daripada mengeksekusi kodenya.


Langkah 3: Berlari kotak

ImageGrab.grab() fungsi menerima satu argumen yang mendefinisikan sebuah kotak yang melompat-lompat. Ini adalah tupel koordinat mengikuti pola (x, y, x, y) mana,

  1. Pasangan pertama nilai (x, y.. mendefinisikan sudut kiri atas dari kotak
  2. Pasangan kedua... x, y) mendefinisikan kanan bawah.

Menggabungkan ini memungkinkan kita untuk hanya menyalin bagian layar yang kita butuhkan.

Mari kita menempatkan ini ke dalam praktek.

Untuk contoh ini, kita akan menggunakan game yang disebut Sushi Go Round. (Cukup adiktif. Anda sudah diperingatkan.) Membuka permainan dalam tab baru dan mengambil snapshot menggunakan kode screenGrab() kami yang ada:

Python_Snapshot_of_sushi_game_full_screen

Sebuah snapshot dari area layar penuh.


Langkah 4: Mendapatkan Koordinat

Sekarang saatnya untuk mulai pertambangan beberapa koordinat untuk kotak kami melompat-lompat.

Membuka snapshot terbaru dalam editor foto.

Python_Snapshot_of_sushi_game_full_screen

Posisi (0,0) selalu terletak di sudut kiri atas gambar. Kami ingin untuk pad x dan y koordinat sehingga fungsi snapshot kami baru set (0,0) ke sudut paling kiri dari area bermain permainan.

Alasan untuk ini dua kali lipat. Pertama, itu membuat menemukan koordinat dalam permainan jauh lebih mudah ketika kita hanya perlu menyesuaikan nilai dalam kaitannya dengan area bermain versus seluruh area resolusi layar Anda. Kedua, meraih bagian layar yang lebih kecil mengurangi biaya pemrosesan yang diperlukan. Layar penuh meraih menghasilkan sedikit data yang dapat membuat sulit untuk melewatinya beberapa kali per detik.

looking_at_xy

Jika tidak sudah, mengaktifkan layar penguasa di editor Anda dan zoom in pada sudut atas area bermain hingga Anda dapat melihat pixel secara rinci:

looking_at_x_y

Arahkan kursor ke pixel pertama dari area bermain dan periksa koordinat ditampilkan pada penggaris. Ini akan menjadi nilai-nilai dua tupel kotak kami. Pada mesin saya spesifik nilai-nilai ini adalah 157, 162.

Menavigasi ke tepi bawah area bermain untuk mendapatkan bawah sepasang koordinat.

looking_at_x_y

Ini menunjukkan koordinat 796 dan 641. Menggabungkan ini dengan pasangan kita sebelumnya memberikan kotak dengan Koordinat (157,162,796,641).

Mari kita menambahkan ini ke kode kita.

Dalam garis 6 kami telah memperbarui tupel terus koordinat area bermain.

Simpan dan menjalankan kode. Membuka gambar yang baru disimpan dan Anda akan melihat:

play_area_snapshot.png

Sukses! Perebutan area bermain yang sempurna. Kita tidak selalu perlu untuk melakukan jenis intensif berburu untuk koordinat. Setelah kami masuk ke win32api kami akan pergi ke beberapa metode lebih cepat untuk pengaturan koordinat ketika kita tidak perlu pixel akurasi sempurna.


Langkah 5: Perencanaan ke depan untuk fleksibilitas

Seperti berdiri sekarang, kita sudah keras-kode koordinat berkaitan dengan setup kami saat ini, dengan asumsi browser kami, dan kami resolusi. Hal ini umumnya ide yang buruk untuk hard-kode koordinat dalam cara ini. Jika, misalnya, kami ingin menjalankan kode pada komputer yang berbeda - atau katakan, iklan baru di situs web bergeser posisi area bermain sedikit - kita harus secara manual dan susah payah memperbaiki semua panggilan koordinat kami.

Jadi kita akan menciptakan dua variabel baru: x_pad dan y_pad. Ini akan digunakan untuk menyimpan hubungan antara area permainan dan seluruh layar. Ini akan membuatnya sangat mudah untuk port kode dari satu tempat ke tempat karena setiap koordinat baru akan relatif terhadap dua variabel global yang akan kita buat, dan untuk menyesuaikan perubahan di area layar, semua yang diperlukan adalah mengatur ulang kedua variabel.

Karena kita sudah melakukan pengukuran, setting bantalan untuk sistem kita saat ini sangat mudah. Kami akan mengatur bantalan untuk menyimpan lokasi pixel pertama di luar area bermain. Dari pertama sepasang x, y koordinat di tupel kotak kami, kurangi 1 dari setiap nilai. Jadi 157 menjadi 156, dan 346 menjadi 345.

Mari kita menambahkan ini ke kode kita.

Sekarang bahwa ini ditetapkan, kami akan mulai untuk menyesuaikan tupel kotak harus berhubungan dengan nilai-nilai ini.

Untuk pasangan yang kedua, kita akan pertama mengurangi nilai-nilai bantalan (156 dan 345) dari Koordinat (796, 825), dan kemudian menggunakan nilai-nilai tersebut dalam Pad + nilai sama format.

Di sini menjadi koordinat x 640 (769-156), dan y menjadi 480 (825-345)

Ini mungkin tampak agak berlebihan pada awalnya, tetapi melakukan langkah tambahan ini menjamin perawatan mudah di masa depan.


Langkah 6: Membuat Docstring

Sebelum kita melangkah lebih jauh, kita akan membuat docstring di bagian atas proyek kami. Karena sebagian besar kode kita akan berbasis di sekitar layar tertentu koordinat dan hubungan ke koordinat, penting untuk mengetahui keadaan di bawah yang semuanya akan line up dengan benar. Sebagai contoh, hal-hal seperti resolusi saat ini, browser, Toolbar diaktifkan (karena mereka mengubah daerah browser), dan setiap penyesuaian yang diperlukan untuk pusat area bermain di layar, Semua mempengaruhi posisi relatif koordinat. Memiliki semua ini didokumentasikan sangat membantu proses pemecahan masalah ketika menjalankan kode di beberapa browser dan komputer.

Satu hal terakhir untuk menyadari adalah berubah-ruang iklan di situs game populer. Jika semua panggilan Ambil Anda tiba-tiba berhenti berperilaku seperti yang diharapkan, baru menambahkan sedikit pergeseran hal pada layar adalah taruhan yang baik.

Sebagai contoh, saya biasanya memiliki komentar berikut di bagian atas kode Python saya:

Menjatuhkan semua informasi ini pada awal Python file membuatnya cepat dan mudah double memeriksa semua pengaturan dan layar kesejajaran tanpa harus pori melalui kode Anda mencoba mengingat tempat Anda menyimpan yang satu khas koordinat x.


Langkah 7: Mengubah quickGrab.py menjadi alat berguna

Kita akan memotong proyek kita pada titik ini, membuat dua file: satu untuk menampung semua kode bot kita, dan yang lainnya untuk bertindak sebagai utilitas tangkapan layar umum. Kita akan mengambil banyak layar gambar seperti kita mencari koordinat, sehingga memiliki modul terpisah yang siap untuk pergi akan membuat hal-hal yang jauh lebih cepat.

Simpan dan tutup proyek kami saat ini.

Di folder Anda, klik kanan pada quickGrab.py dan pilih 'salin' dari menu.

play_area_snapshot.png

Sekarang klik kanan dan pilih 'sisipkan' dari menu

play_area_snapshot.png

Pilih file disalin dan mengubah nama itu untuk 'code.py'

play_area_snapshot.png

Sekarang semua baru kode penambahan dan perubahan akan dibuat dalam code.py. quickGrab.py sekarang akan berfungsi murni sebagai alat snapshot. Kita hanya perlu membuat satu modifikasi terakhir:

Ubah ekstensi file dari .py, ke .pyw dan konfirmasikan perubahannya.

play_area_snapshot.png

Ekstensi ini memberitahu Python untuk menjalankan script tanpa meluncurkan konsol. Jadi sekarang, quickGrab.pyw memenuhi namanya. Klik dua kali pada file dan diam-diam akan mengeksekusi kode di latar belakang dan menyimpan sebuah snapshot ke direktori kerja Anda.

Biarkan game tetap terbuka di latar belakang (pastikan untuk membisukannya sebelum musik yang diputar membuat Anda gila); kami akan segera kembali ke sana. Kami memiliki beberapa konsep/alat lain untuk memperkenalkan sebelum kita masuk ke mengendalikan hal-hal pada layar.


Langkah 8: Win32api - Tinjauan Singkat

Bekerja dengan win32api dapat sedikit menakutkan pada awalnya. Ini membungkus kode Windows C tingkat rendah - yang untungnya didokumentasikan dengan sangat baik di sini, tetapi sedikit seperti labirin untuk menavigasi melalui beberapa go-around pertama Anda.

Sebelum kita mulai script apapun tindakan yang berguna, kita akan mengambil dekat melihat beberapa fungsi API yang kita akan mengandalkan. Setelah kita memiliki jelas memahami setiap parameter itu akan mudah untuk menyesuaikan mereka untuk melayani tujuan apa pun kita perlu dalam permainan.

Win32api.mouse_event():

Parameter pertama dwFlags mendefinisikan 'aksi' mouse. Ini kontrol hal-hal seperti gerakan, mengklik, bergulir, dll...

Daftar berikut menunjukkan parameter yang paling umum digunakan saat scripting gerakan.

dwFlags:

  • win32con. MOUSEEVENTF_LEFTDOWN
  • win32con. MOUSEEVENTF_LEFTUP
  • win32con. MOUSEEVENTF_MIDDLEDOWN
  • win32con.MOUSEEVENTF_MIDDLEUP
  • win32con. MOUSEEVENTF_RIGHTDOWN
  • win32con.MOUSEEVENTF_RIGHTUP
  • win32con. MOUSEEVENTF_WHEEL

Setiap nama cukup jelas. Jika Anda ingin mengirim klik kanan virtual, Anda akan melewati win32con.MOUSEEVENTF_RIGHTDOWN untuk dwFlags parameter.

Dua parameter, dx dan dy, menggambarkan posisi mutlak mouse sepanjang x dan y sumbu. Sementara kita bisa gunakan parameter ini untuk scripting gerakan mouse, mereka menggunakan sistem koordinat yang berbeda daripada yang kita telah menggunakan. Jadi, kita akan meninggalkan mereka diatur ke nol dan bergantung pada bagian yang berbeda dari API untuk kami mouse bergerak kebutuhan.

Parameter keempat adalah dwData. Fungsi ini digunakan jika (dan hanya jika) dwFlags berisi MOUSEEVENTF_WHEEL. Jika tidak dapat dihilangkan atau diatur ke nol. dwData menentukan jumlah gerakan pada roda gulir mouse Anda.

Sebuah contoh cepat untuk memperkuat teknik ini:

Jika kita membayangkan permainan dengan sistem pemilihan senjata yang mirip dengan Half-Life 2 - di mana senjata dapat dipilih dengan memutar roda mouse - kita akan menemukan fungsi berikut untuk menyaring daftar senjata:

Di sini kami ingin mensimulasikan menggulir roda mouse untuk menavigasi senjata kami teoritis daftar, jadi kami melewati... MOUSEEVENTF_WHEEL 'action' untuk dwFlag. Kita tidak perlu dx atau dy, data posisi, jadi kami meninggalkan mereka diatur ke nol, dan kami ingin gulir satu klik di arah maju untuk setiap 'senjata' dalam daftar, jadi kami melewati integer 120 untuk dwData (setiap klik roda sama dengan 120).

Seperti yang Anda lihat, bekerja dengan mouse_event adalah hanya masalah memasukkan argumen yang tepat ke tempat yang tepat. Mari kita sekarang pindah ke beberapa fungsi lebih bermanfaat


Langkah 5: Dasar Mouse klik

Kita akan membuat tiga fungsi baru. Satu klik-kiri Umum fungsi, dan dua yang menangani spesifik turun dan Serikat.

Buka code.py dengan IDLE dan tambahkan berikut ini ke daftar pernyataan impor kami:

Seperti sebelumnya, ini memberi kami akses ke isi modul via sintaks module.attribute.

Selanjutnya kami akan membuat kami pertama mouse klik fungsi.

Ingat bahwa semua yang kita lakukan di sini adalah menetapkan 'action' argumen pertama dari mouse_event. Kita tidak perlu untuk menyampaikan informasi posisi, jadi kami akan berangkat parameter koordinat di (0,0), dan kita tidak perlu untuk mengirim info tambahan, sehingga dwData menjadi diabaikan. time.sleep(.1) fungsi memberitahu Python untuk menghentikan eksekusi untuk waktu yang ditentukan dalam tanda kurung. Kami akan menambahkan ini melalui kode kami, biasanya untuk waktu yang sangat singkat. Tanpa ini, 'mengklik' dapat maju itu sendiri dan api sebelum menu memiliki kesempatan untuk memperbarui.

Jadi apa yang kita buat di sini adalah klik-kiri umum. Satu tekan, satu rilis. Kita akan menghabiskan sebagian besar waktu kita dengan yang satu ini, tapi kami akan membuat dua lebih banyak variasi.

Dua berikutnya adalah hal yang sama persis, tetapi sekarang setiap langkah dibagi menjadi fungsinya sendiri. Ini akan digunakan ketika kita perlu tahan tombol mouse untuk jangka waktu (untuk menyeret, menembak, dll..).


Langkah 9: Gerakan Mouse dasar

Dengan mengklik keluar dari jalan, semua yang tersisa adalah menggerakkan mouse di sekitar pada layar.

Tambahkan fungsi untuk code.py:

Kedua fungsi melayani tujuan yang jelas berbeda. Yang pertama akan digunakan untuk scripting gerakan dalam program. Berkat konvensi penamaan yang baik, tubuh fungsi tidak persis seperti SetCursorPos() menyiratkan. Memanggil fungsi ini menyetel tetikus ke koordinat yang dilewati sebagai tupel x, y. Perhatikan bahwa kami telah menambahkan di x dan y bantalan; Hal ini penting untuk melakukan ini di mana saja koordinat disebut.

Yang kedua adalah alat sederhana yang kita akan menggunakan saat menjalankan Python interaktif. Mencetak ke konsol saat ini posisi mouse sebagai x, y tupel. Hal ini sangat mempercepat proses menavigasi melalui menu tanpa harus mengambil snapshot dan keluar seorang penguasa. Kami tidak akan selalu dapat menggunakannya, karena beberapa aktivitas mouse harus spesifik-pixel, tetapi ketika kami bisa, itu adalah penghemat waktu yang fantastis.

Dalam langkah berikut kami akan menaruh beberapa teknik ini baru untuk menggunakan dan mulai menavigasi menu dalam game. Namun sebelum kita lakukan, menghapus konten saat ini main() di code.py dan menggantinya dengan pass. Kami akan bekerja dengan prompt interaktif untuk langkah berikutnya, jadi kami tidak akan membutuhkan fungsi screenGrab().


Langkah 10: Menavigasi menu permainan

Dalam hal ini, dan beberapa langkah berikutnya, kita akan mencoba untuk mengumpulkan sebanyak koordinat acara seperti yang kita dapat menggunakan metode get_cords() kami. Menggunakan kami akan mampu dengan cepat membangun kode untuk hal-hal seperti menavigasi menu, membersihkan meja dan membuat makanan. Setelah kita memiliki set ini, itu hanya akan menjadi masalah mengaitkan mereka ke dalam logika yang bot.

Mari kita mulai. Simpan dan menjalankan kode Anda untuk memunculkan Python shell. Karena kami mengganti tubuh main() dengan lulus pada langkah terakhir, Anda akan melihat sebuah shell yang kosong berdasarkan berjalan.

play_area_snapshot.png

Sekarang, sebelum kita bahkan bisa dimainkan bagian dari permainan ada empat menu awal kita perlu untuk mendapatkan. Mereka adalah sebagai berikut:

  1. Awal "bermain" tombol
    play_button.png
  2. iPhone "Lanjutkan" tombol
  3. Tombol 'Lewati' Tutorial
  4. Hari ini tujuan "Lanjutkan" tombol
    .png

Kita harus mendapatkan koordinat untuk masing-masing dan tambahkan mereka untuk fungsi baru yang disebut startGame(). Posisi siaga shell sehingga Anda dapat melihat itu dan area bermain. Ketik fungsi get_cords() tapi jangan tekan kembali Gerakkan mouse Anda ke atas tombol yang Anda butuhkan koordinat. Pastikan untuk mengklik lagi, seperti yang kita inginkan fokus untuk tetap di shell. Arahkan mouse Anda ke item menu dan sekarang tekan tombol kembali. Ini akan mengambil lokasi mouse dan mencetak ke konsol tupel yang mengandung x, y nilai. Ulangi langkah ini untuk tiga menu tersisa.

Meninggalkan shell terbuka dan mengaturnya sehingga Anda dapat melihatnya serta editor siaga. Kita sekarang akan menambahkan fungsi startGame() kami dan mengisinya dengan koordinat baru yang kami peroleh.

Kami sekarang memiliki fungsi kompak yang baik untuk menelepon pada awal setiap permainan. Ini menetapkan posisi kursor untuk masing-masing lokasi menu kami sebelumnya didefinisikan, dan kemudian memberitahu mouse untuk klik. time.sleep(.1) memberitahu Python untuk menghentikan eksekusi untuk 1/10 detik antara setiap klik, yang memberikan cukup waktu untuk memperbarui di antara menu.

Simpan dan jalankan kode Anda dan Anda akan melihat hasil yang mirip dengan ini:

Sebagai manusia lemah aku butuh sedikit lebih lama dari kedua untuk menavigasi semua menu dengan tangan, tetapi bot kami sekarang dapat melakukannya di sekitar.4 detik. Tidak buruk sama sekali!


Langkah 11: Mendapatkan koordinat makanan

Sekarang kita akan mengulangi proses yang sama untuk masing-masing tombol ini:

play_button.png

Sekali lagi, di Python shell, ketik get_cords(), arahkan mouse Anda ke kotak makanan Anda perlu, dan tekan Enter untuk menjalankan perintah.

Sebagai pilihan tambahan untuk mempercepat sesuatu sepanjang, jika Anda memiliki kedua monitor, atau dapat mengatur python shell dengan cara yang Anda dapat melihat itu serta area permainan, daripada mengetik dan menjalankan get_cords() setiap kali kita membutuhkannya , kita dapat mengatur sederhana untuk loop. Menggunakan time.sleep() metode untuk menghentikan eksekusi cukup lama bagi Anda untuk memindahkan mouse ke lokasi berikutnya yang membutuhkan koordinat.

Di sini adalah untuk loop dalam tindakan:

Kami akan membuat sebuah class baru yang disebut tali dan menggunakannya untuk menyimpan semua nilai-nilai koordinat yang kami kumpulkan. Mampu memanggil Cord.f_rice menawarkan pembacaan besar keuntungan atas melewati koordinat langsung ke mousePos(). Sebagai suatu pilihan, Anda juga dapat menyimpan segala sesuatu dalam kamus, tapi aku menemukan sintaks kelas yang lebih menyenangkan.

Kami akan menyimpan banyak koordinat kami di kelas ini, dan akan ada beberapa tumpang tindih, sehingga menambahkan awalan 'f_' yang memungkinkan kita tahu bahwa kita mengacu pada lokasi makanan, daripada, katakanlah, sebuah lokasi di menu telepon.

Kita akan kembali kepada mereka dengan sedikit. Ada sedikit lebih banyak koordinasi berburu yang harus dilakukan!


Langkah 12: Mendapatkan koordinat piring kosong

Setiap kali seorang pelanggan selesai makan, mereka meninggalkan di belakang piring yang perlu mengklik untuk dihapus. Jadi kita perlu mendapatkan lokasi dari piring kosong juga.

play_button.png

Saya telah mencatat posisi mereka dengan raksasa merah 'X'. Ulangi pola yang sama seperti dua langkah untuk mendapatkan koordinat mereka. Menyimpannya dalam string komentar untuk saat ini.

Kita sudah dekat. Hanya beberapa langkah persiapan awal sebelum kita membahas hal-hal yang sangat menyenangkan.


Langkah 13: Mendapatkan koordinat telepon

OK, ini akan menjadi akhir set koordinat kita harus saya cara spesifik ini.

Yang satu ini memiliki lebih banyak untuk melacak sehingga Anda mungkin ingin untuk melakukannya dengan secara manual memanggil fungsi get_cords() daripada yang sebelumnya digunakan untuk loop metode. Bagaimanapun, kita akan pergi melalui semua menu telepon untuk mendapatkan koordinat untuk setiap item.

Satu ini sedikit lebih terlibat untuk mencapai salah satu layar pembelian kita perlu, Anda perlu memiliki cukup uang untuk benar-benar membeli sesuatu. Jadi Anda akan perlu untuk membuat beberapa potongan sushi sebelum Anda pergi tentang bisnis koordinat berburu. Paling-paling, Anda harus membuat dua gulungan sushi, saya percaya. Yang akan mendapatkan Anda cukup untuk membeli beras sekedarnya, yang akan membawa kita ke layar yang kita butuhkan.

Ada enam menu yang kita miliki untuk mendapatkan:

  1. Telepon
    play_button.png
  2. Menu Awal
  3. Topping
  4. Beras
    .png
  5. Pengiriman
    .png

Kita perlu untuk mendapatkan koordinat untuk segala sesuatu tetapi Sake (meskipun Anda dapat jika Anda inginkan. Saya menemukan bot bekerja dengan baik tanpa itu. Saya sangat rela mengorbankan sesekali review dalam game yang buruk karena tidak memiliki kode pada logika.)

Mendapatkan Koordinat:

Kita akan menambahkan semua ini untuk kelas tali kami. Kita akan menggunakan awalan 't_' untuk menunjukkan jenis makanan yang telepon > item menu topping.

Baik-baik saja! Kami akhirnya telah ditambang semua nilai-nilai koordinat yang kita butuhkan. Jadi mari kita mulai membuat sesuatu yang berguna!


Langkah 14: Kliring Tabel

Kita akan mengambil kami direkam sebelumnya koordinat dan menggunakan mereka untuk mengisi sebuah fungsi yang disebut clear_tables().

Seperti yang Anda lihat, ini kurang lebih persis seperti fungsi startGame() kami sebelumnya. Beberapa perbedaan kecil:

Kami tidak punya time.sleep() fungsi di antara berbeda klik peristiwa. Kami tidak harus menunggu menu diperbarui, jadi kami tidak perlu membatasi kecepatan klik kami.

Kita, namun, memiliki satu panjang time.sleep() di akhir. Sementara tidak benar-benar diperlukan, it's nice untuk menambahkan jeda ini kadang-kadang dalam eksekusi kode kita, sesuatu yang cukup lama untuk memberi kita waktu untuk secara manual keluar dari loop utama yang bot jika diperlukan (yang kita akan mendapatkan). Jika tidak, benda itu akan terus mencuri posisi mouse Anda berulang-ulang, dan Anda tidak akan bisa menggeser fokus ke shell cukup lama untuk menghentikan skrip - yang dapat lucu dua atau tiga kali pertama saat Anda berjuang melawan mouse , tapi dengan cepat kehilangan pesonanya.

Jadi pastikan untuk menambahkan beberapa jeda yang dapat diandalkan dalam bot Anda sendiri!


Langkah 15: Membuat Sushi

Hal pertama yang perlu kita lakukan adalah belajar cara membuat sushi. Klik buku resep untuk membuka instruksi manual. Semua jenis sushi yang dihadapi sepanjang permainan akan ditemukan dalam halaman-halamannya. Aku akan mencatat tiga pertama di bawah ini, tapi aku meninggalkan Anda untuk Katalog sisanya.

play_button.png

Sekarang kita akan mengatur fungsi yang akan menerima argumen untuk "jenis sushi" dan kemudian mengumpulkan bahan-bahan yang tepat berdasarkan nilai yang berlalu.

Ini berfungsi sama seperti semua yang lain, tetapi dengan satu perubahan kecil: daripada melewati koordinat secara langsung, kami menyebut mereka sebagai atribut dari kelas tali kami.

FoldMat() fungsi ini disebut pada akhir setiap sushi proses pembuatan. Ini klik tikar untuk menggulung sushi yang kami hanya berkumpul. Mari kita mendefinisikan fungsi itu sekarang:

Mari kita secara singkat berjalan meskipun panggilan mousePos() ini karena itu adalah sedikit berbatu bersama-sama. Kita mengakses nilai pertama tupel f_rice dengan menambahkan [0] pada akhir atribut. Ingat bahwa ini adalah nilai x. Klik di atas tikar kita hanya perlu menyesuaikan nilai-nilai x kita oleh segelintir piksel, jadi kami menambahkan 40 ke arus x koordinat, dan kemudian lulus f_rice [1] dengan y. Pergeseran ini x kami posisi hanya cukup untuk hak untuk memungkinkan kita untuk memicu tikar.

Perhatikan bahwa setelah panggilan foldMat() kita memiliki time.sleep() panjang. Tikar mengambil beberapa waktu untuk roll, dan makanan tidak dapat diklik sementara animasi mereka menjalankan, sehingga Anda hanya perlu menunggu.


Langkah 16: Menavigasi Menu Telepon

Dalam langkah ini kita akan mengatur semua mousePos() untuk menunjuk ke item menu yang sesuai, tetapi kita akan meninggalkan sana sekarang. Ini adalah bagian dari program yang akan dibungkus dan dikendalikan oleh logika yang bot. Kami akan meninjau kembali fungsi ini setelah mendapatkan beberapa teknik baru di bawah ikat pinggang kita.

Itu saja untuk langkah ini. Kami akan melakukan lebih banyak dengan ini nanti.


Intro singkat: Membuat melihat komputer

Kita sekarang sampai potongan-potongan yang sangat menarik. Kita akan mulai melihat bagaimana membuat komputer 'melihat' acara di layar. Ini adalah bagian yang sangat menarik dari proses ini, dan itu mudah untuk diselesaikan.

Bagian lain yang rapi bot bangunan adalah bahwa akhirnya bot dapat memberikan kita, para pemrogram, dengan informasi yang cukup bahwa pekerjaan lebih lanjut visi tidak diperlukan. Sebagai contoh, dalam kasus Sushi bot, setelah kita mendapatkan tingkat pertama berjalan, bot adalah menyemburkan data yang cukup akurat tentang apa yang terjadi pada layar bahwa semua harus kita lakukan sejak saat itu adalah mengambil data tersebut memiliki "melihat" dan hanya mengatakan itu bagaimana bereaksi terhadap hal itu.

Lain sebagian besar bot bangunan adalah belajar permainan, tahu apa nilai-nilai yang Anda butuhkan untuk melacak versus yang Anda dapat mengabaikan. Misalnya, kami akan membuat tidak ada upaya untuk melacak uang tunai di tangan. Ini adalah hanya sesuatu yang akhirnya menjadi tidak relevan dengan bot. Semua itu perlu tahu adalah jika ia memiliki cukup makanan untuk terus bekerja. Jadi alih-alih menjaga tab pada total uang, hanya memeriksa untuk melihat jika itu mampu sesuatu, terlepas dari harga, karena karena berhasil dalam permainan, itu hanya masalah waktu beberapa detik sebelum Anda mampu untuk mengisi sesuatu. Jadi jika itu tidak mampu membelinya Sekarang, hanya mencoba lagi dalam beberapa detik.

Yang membawa saya ke poin saya akhir. Bahwa brute force metode versus yang elegan. Visi algoritma mengambil waktu pemrosesan yang berharga. Memeriksa beberapa poin di banyak wilayah berbeda di area bermain dapat dengan cepat menggerogoti kinerja bot Anda, sehingga muncul pertanyaan 'apakah bot perlu tahu apakah _______ Jerman telah terjadi atau tidak?'.

Sebagai contoh, pelanggan dalam permainan Sushi dapat dianggap sebagai memiliki empat negara: tidak hadir, tunggu, makan, dan selesai makan. Setelah selesai, mereka meninggalkan piring kosong berkedip. Saya bisa mengeluarkan kekuatan pemrosesan pada memeriksa semua lokasi piring dengan menjentikkan semua lokasi enam piring dan kemudian memeriksa terhadap nilai yang diharapkan (yang rentan terhadap kegagalan karena piring flash on dan off, membuat negatif palsu kemungkinan besar), atau... Saya bisa saja kekerasan jalan melalui dengan mengklik setiap piring lokasi setiap beberapa detik. Dalam praktek ini adalah setiap bit sebagai efektif sebagai solusi 'elegan' membiarkan bot menentukan keadaan dari pelanggan. Mengklik enam lokasi membutuhkan sepersekian detik di mana ketika mengambil dan memproses enam gambar yang berbeda relatif lambat. Kita dapat menggunakan waktu kita diselamatkan pada pengolahan tugas gambar lebih penting lainnya.


Langkah 17: Mengimpor Numpy dan ImageOps

Tambahkan baris berikut ke daftar impor pernyataan.

ImageOps adalah modul PIL lainnya. Hal ini digunakan untuk melakukan operasi (seperti grayscaling) pada gambar.

Saya akan secara singkat menjelaskan kedua bagi mereka yang tidak akrab dengan Python. Laporan standar impor kami memuat modul namespace (kumpulan nama-nama variabel dan fungsi). Jadi, untuk mengakses item dalam lingkup modul, kita harus menggunakan modul.attribute sytax. Namun, dengan menggunakan dari ___ impor pernyataan kita mewarisi nama ke dalam lingkup lokal kami. Artinya, sintaks module.attribute tidak lagi diperlukan. Mereka yang tidak tingkat atas, jadi kita menggunakannya seperti yang kita akan setiap Python built-in fungsi lainnya, seperti str() atau list(). Dengan mengimpor Numpy dengan cara ini, memungkinkan kita untuk menghubungi array(), bukan numpy.array().

Wildcard * cara mengimpor semuanya dari modul.


Langkah 18: Membuat melihat komputer

Metode pertama kita akan menjelajahi adalah memeriksa nilai RGB tertentu dari sebuah pixel terhadap nilai yang diharapkan. Metode ini baik untuk hal-hal statis seperti menu. Sejak ia mengisahkan piksel tertentu, itu biasanya sedikit terlalu rapuh untuk memindahkan objek. Namun, yang bervariasi dari kasus ke kasus. Kadang-kadang itu adalah teknik yang sempurna, waktu lain Anda harus memilah metode yang berbeda.

Buka Sushi pergi bulat di browser Anda dan memulai permainan baru. Mengabaikan pelanggan Anda dan membuka menu telepon. Anda memulai dengan tidak ada uang di bank, sehingga semuanya harus diklik keluar sebagai berikut. Ini akan menjadi nilai-nilai RGB kita akan memeriksa.

play_button.png

Dalam code.py, gulir ke fungsi screenGrab() Anda. Kami akan membuat perubahan berikut:

Kami telah membuat dua perubahan kecil. Di dalam baris 5 kita komentar kami simpan pernyataan. Di jalur 6 sekarang kita kembali objek gambar untuk digunakan di luar fungsi.

Simpan dan menjalankan kode. Kami akan melakukan lebih banyak pekerjaan interaktif.

Dengan topping menu buka dan semua item yang diklik, jalankan kode berikut:

Ini menetapkan mengambil snap shot kami di screenGrab() im contoh. Di sini, kita dapat memanggil metode getpixel(xy) untuk mengambil data tertentu pixel.

Sekarang kita perlu untuk mendapatkan nilai-nilai RGB untuk masing-masing item greyed keluar. Ini akan membuat kami 'diharapkan nilai' yang bot akan menguji melawan ketika membuat panggilan getpixel() sendiri.

Kita sudah memiliki koordinat yang kita butuhkan dari langkah-langkah sebelumnya, sehingga semua yang harus kita lakukan adalah melewati mereka sebagai argumen untuk getpixel() dan perhatikan output.

Output dari sesi interaktif kami:

Kita perlu menambahkan nilai-nilai ini ke fungsi buyFood() kita dalam cara yang memungkinkan untuk tahu apakah sesuatu tersedia.

Di sini kita melewati nama bahan ke fungsi buyFood(). Serangkaian jika / elif pernyataan yang digunakan untuk menangkap parameter berlalu dan menanggapi sesuai. Garpu setiap mengikuti logika yang sama persis, kita hanya akan menjelajahi yang pertama.

Hal pertama yang kita lakukan setelah garpu if adalah klik pada ponsel dan buka item menu yang tepat - dalam hal ini menu Rice.

Selanjutnya kita mengambil snapshot cepat dari area layar dan memanggil getpixel() untuk mendapatkan nilai RGB untuk pixel pada koordinat Cord.buy_rice. Kami kemudian tes ini terhadap nilai RGB ditetapkan sebelumnya untuk Kapan item tidak diperdulikan. Jika itu mengevaluasi ke True, kita tahu bahwa item ini tidak lagi diklik, dan kami punya cukup uang untuk membelinya. Akibatnya, jika itu dievaluasi ke False, kita tidak mampu membelinya.

Memberikan kita mampu bahan, kami hanya menavigasi melalui kotak yang tersisa yang diperlukan untuk membeli makanan.

Akhirnya, jika kita tidak mampu makanan, kami memberitahu Python untuk menutup menu, menunggu satu detik, dan kemudian coba proses lagi. Hal ini biasanya hanya beberapa detik antara menjadi mampu membeli sesuatu versus tidak mampu untuk membeli sesuatu. Kami tidak akan melakukannya dalam tutorial ini, tetapi cukup mudah untuk menambahkan logika tambahan ke fungsi ini untuk membiarkan bot memutuskan apakah perlu terus menunggu sampai mampu membeli sesuatu, atau jika bebas untuk melakukan tugas lain dan kembali pada lain waktu.


Langkah 19: menjaga melacak yang bahan

Baiklah, sekarang kita akan perlahan, sedikit demi sedikit, mulai menggantikan tempat-tempat yang mana kami, entitas eksternal, memberikan masukan dan keputusan dengan logika yang dapat menjalankan dengan sendirinya.

Kita perlu perangkat cara menjaga melacak yang berapa banyak bahan yang kita miliki di tangan. Kita bisa melakukan ini dengan ping layar di daerah-daerah tertentu, atau dengan rata-rata setiap kotak bahan (kita akan mendapatkan teknik ini nanti), tapi sejauh ini, metode termudah dan tercepat adalah untuk hanya menyimpan semua item tangan di dalam kamus.

Jumlah setiap bahan tetap konstan di setiap tingkat. Anda akan selalu dimulai dengan 10 item 'umum' (beras, nori, roe), dan 5 item 'premi' (udang, ikan salmon, unagi).

play_button.png

Mari kita menambahkan informasi ini ke kamus.

Kunci kamus kami menyimpan nama bahan, dan kami akan bisa mendapatkan jumlah saat ini dengan menjelajahi nilainya.


Langkah 20: Menambahkan pelacakan kode

Sekarang kita memiliki kamus nilai. Mari kita bekerja ke dalam kode. Setiap kali kami membuat sesuatu, kami akan mengurangi bahan yang digunakan. Setiap kali kita toko, kami akan menambahkan mereka kembali.

Mari kita mulai dengan memperluas fungsi makeFood()

Sekarang setiap kali kita membuat sepotong Sushi, kami mengurangi nilai-nilai dalam kamus foodOnHand kami sesuai dengan jumlah. Selanjutnya kami akan menyesuaikan buyFood() untuk menambahkan nilai.

Sekarang setiap kali bahan yang dibeli, kami menambahkan kuantitas nilai sesuai Kamus.


Langkah 21: Memeriksa Makanan di Tangan

Sekarang bahwa kita memiliki makeFood() dan buyFood() fungsi kita dibentuk untuk memodifikasi Kamus foodOnHand, kita perlu menciptakan fungsi baru untuk memantau semua perubahan dan periksa apakah bahan telah jatuh di bawah ambang tertentu.

Di sini kita mengatur untuk loop untuk iterate melalui pasangan kunci dan nilai dari kamus foodOnHand kami. Untuk setiap nilai, memeriksa apakah nama sama dengan salah satu bahan-bahan yang kami butuhkan. Jika demikian, ia kemudian memeriksa untuk melihat apakah nilai kurang dari atau sama dengan 3; dan akhirnya, ini menyediakan kurang dari 3, panggilan buyFood() dengan jenis bahan sebagai parameter.

Mari kita coba ini sedikit.

Segala sesuatu tampaknya bekerja cukup baik, jadi mari kita beralih ke beberapa lebih banyak gambar pengakuan tugas.


Langkah 22: Nilai-nilai RGB melintasi - Setup

Pergi lebih lanjut dengan bot kami, kita perlu untuk mengumpulkan informasi tentang sushi yang jenis adalah dalam gelembung dimana pelanggan. Melakukan hal ini dengan metode getpixel() akan sangat melelahkan karena Anda perlu menemukan area di setiap gelembung pemikiran yang memiliki nilai RGB unik yang tidak dibagi oleh jenis sushi / gelembung pikiran lainnya. Diberikan pixel gaya seni, yang pada dasarnya memiliki palet warna yang terbatas, Anda akan memiliki untuk melawan ton warna tumpang tindih dalam jenis sushi. Selain itu, untuk setiap jenis sushi baru diperkenalkan melalui keluar permainan, Anda harus secara manual memeriksa untuk melihat apakah itu memiliki RGB unik yang tidak ditemukan dalam salah satu jenis sushi lain. Setelah ditemukan, itu pasti akan di koordinat berbeda daripada yang lain sehingga berarti menyimpan nilai-nilai lebih koordinat - jenis sushi 8 setiap kali gelembung 6 kursi lokasi berarti 48 unik diperlukan Koordinat!

Jadi, secara ringkas, kita membutuhkan metode yang lebih baik.

Masukkan metode kedua: gambar menjumlahkan/rata-rata. Versi ini bekerja dari daftar nilai-nilai RGB bukan satu piksel tertentu. Untuk setiap snapshot yang kami ambil, gambar di-grayscaled, dimuat ke dalam array, dan kemudian dijumlahkan. Jumlah ini diperlakukan sama seperti RGB nilai dalam metode getpixel(). Kita akan menggunakannya untuk menguji dan membandingkan beberapa gambar.

Fleksibilitas dari metode ini adalah sedemikian rupa sehingga sekali it's set up, dalam kasus kami bot sushi, bekerja tidak lebih diperlukan pada bagian kami. Seperti jenis sushi baru diperkenalkan nilai RGB unik disimpulkan dan dicetak ke layar untuk kita gunakan. Ada tidak perlu untuk memburu koordinat apapun lebih spesifik seperti dengan getpixel().

Yang mengatakan, ada masih sedikit setup yang diperlukan untuk teknik ini. Kita akan perlu untuk membuat beberapa kotak melompat-lompat baru sehingga kami memproses hanya daerah kita butuhkan daripada area bermain seluruh layar.

Marilah kita memulai. Arahkan ke fungsi screenGrab() Anda dan buat salinannya yang kedua. Ganti nama salinan untuk grab() dan buat perubahan berikut:

Baris 2: Kami mengambil screengrab seperti yang kami miliki sebelumnya, tapi sekarang kami mengonversinya menjadi skala abu-abu sebelum menetapkannya ke instance im. Konversi ke skala abu-abu membuat melintasi semua nilai warna lebih cepat; alih-alih setiap piksel memiliki nilai Merah, Hijau, dan Biru, ia hanya memiliki satu nilai mulai dari 0-255.

Jalur 3: Kami menciptakan sebuah array nilai warna gambar menggunakan getcolors() metode PIL dan menetapkan mereka untuk variabel

Baris 4: Kami jumlah semua nilai array dan mencetak mereka ke layar. Berikut adalah angka-angka yang kita akan menggunakan ketika kita membandingkan dua gambar.


Langkah 23: Mengatur Kotak Batas Baru

Memulai permainan baru dan menunggu untuk semua pelanggan untuk mengisi. Klik ganda pada quickGrab.py untuk mengambil snapshot dari area bermain.

play_button.png

Kita akan perlu untuk mengatur berlari kotak dalam setiap dari gelembung.

Perbesar hingga Anda dapat melihat detil pixel

play_button.png

Untuk setiap balon, kita perlu memastikan bahwa kiri atas dari kotak melompat-lompat kami dimulai pada lokasi yang sama. Untuk melakukannya, menghitung dua 'tepi' dari kiri dalam gelembung. Kami ingin piksel putih di kedua 'tepi' untuk menandai pertama x, y lokasi kami.

play_button.png

Untuk mendapatkan pasangan terbawah, tambahkan 63 ke posisi x, dan 16 ke y. Ini akan memberikan Anda sebuah kotak yang mirip dengan yang di bawah ini:

play_button.png

Jangan khawatir bahwa kita tidak mendapatkan seluruh gambar jenis Sushi. Karena kita sedang menjumlahkan semua nilai, bahkan perubahan kecil dalam satu piksel akan berubah total dan biarkan kami tahu sesuatu yang baru adalah pada layar.

Kita akan membuat enam baru fungsi, masing-masing sebuah versi khusus dari kami grab() umum, dan mengisi argumen mereka melompat-lompat dengan koordinat semua gelembung. Setelah dibuat, kami akan membuat fungsi sederhana untuk memanggil semuanya sekaligus, hanya untuk tujuan pengujian.

Oke! Banyak kode, tapi itu semua hanya khusus versi sebelumnya didefinisikan fungsi. Masing-masing mendefinisikan kotak pembatas, dan meneruskannya ke ImageGrab.Grab. Dari sana, kami mengkonversi ke array nilai RGB dan mencetak jumlah ke layar.

Pergi ke depan dan menjalankan beberapa kali sementara memainkan permainan. Pastikan untuk memverifikasi bahwa setiap jenis sushi, terlepas dari gelembung yang ada dalam, menampilkan jumlah yang sama setiap kali.


Step 24: Membuat Sushi jenis Kamus

Setelah Anda memverifikasi bahwa masing-masing jenis sushi selalu menampilkan nilai yang sama, mencatat jumlah mereka menjadi sebuah kamus sebagai berikut:

Memiliki angka-angka sebagai kunci dan string sebagai nilai-nilai akan membuatnya mudah untuk mengocok hal-hal dari fungsi untuk fungsi tanpa kehilangan lagu dari segala sesuatu.


Langkah 25: Buat kelas gelembung No

Langkah terakhir dalam pengumpulan gelembung kami adalah mendapatkan jumlah untuk saat tidak ada gelembung yang hadir. Kita akan menggunakan ini untuk memeriksa Kapan pelanggan datang dan pergi.

Memulai permainan baru dan get_all_seats() dengan cepat lari sebelum seseorang memiliki kesempatan untuk muncul. Angka-angka yang ia akan mencetak kami akan menempatkan ke dalam kelas yang disebut kosong. Seperti sebelumnya, Anda dapat menggunakan Kamus jika Anda lebih suka.

Kami sedang hampir sana sekarang! Satu langkah terakhir dan kami akan memiliki bot yang sederhana dan berfungsi!


Langkah 26: Puting ini semua bersama

Waktu untuk akhirnya tangan kontrol untuk bot kami. Kami akan script logika dasar yang akan membiarkannya menanggapi pelanggan, membuat pesanan mereka dan mengisi bahan ketika mulai menjalankan rendah.

Aliran dasar akan mengikuti ini: Periksa kursi > jika pelanggan, membuat pesanan > memeriksa makanan > jika rendah, membeli makanan > jelas tabel > ulangi.

Ini yang panjang; ayo kita mulai.

Hal pertama yang kita lakukan adalah memeriksa makanan di tangan. dari sana, kami mengambil snapshot dari posisi satu dan menetapkan jumlah untuk s1. Setelah itu kita periksa untuk melihat s1 yang tidak sama dengan Blank.seat_1. Jika tidak, kami memiliki pelanggan. Kami memeriksa kamus sushiTypes kami untuk melihat jumlahnya sama dengan s1 kami. Jika tidak, kami kemudian menelepon makeFood() dan lulus sushiType sebagai argumen.

Clear_tables() dipanggil setiap dua kursi.

Hanya satu potongan terakhir sisa: menyiapkan loop.


Langkah 27: Loop utama

Kami akan mengatur sangat sederhana sementara loop untuk bermain game. Kami tidak membuat mekanisme penghentian apa pun, jadi untuk menghentikan eksekusi, klik di shell dan tekan Ctrl C untuk mengirim interupsi keyboard.

Dan hanya itu! Refresh halaman, memuat permainan, dan mengatur bot Anda longgar!

Jadi, itu sedikit kikuk dan membutuhkan perbaikan, tetapi ia berdiri sebagai kerangka yang layak bagi Anda untuk iterate berdasarkan.

Versi bot yang lebih lengkap dapat ditemukan di sini. Ini memiliki beberapa perbaikan seperti menjaga melacak yang apa yang dibuat, tidak terjebak dalam menu telepon, dan optimasi umum lainnya.


Kesimpulan

Sekarang Anda memiliki semua alat yang Anda butuhkan untuk pergi tentang membangun bot sederhana Anda sendiri. Teknik-teknik yang kita digunakan dalam tutorial ini cukup primitif di dunia Computer Vision, tapi masih, dengan ketekunan cukup, Anda dapat membuat banyak hal yang keren dengan mereka - bahkan di luar wilayah permainan bots. Kami, misalnya, menjalankan beberapa skrip yang didasarkan pada teknik-teknik ini untuk mengotomatisasi tugas-tugas berulang-ulang perangkat lunak di kantor. Cukup memuaskan untuk menghapus tugas manusia hanya dengan beberapa baris kode.

Terima kasih untuk membaca, dan jika Anda memiliki masalah atau komentar, pastikan untuk meninggalkan catatan di bawah ini. Keberuntungan, bersenang-senang.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.