AI pong tidak sempurna

19

Jadi saya mulai belajar Java dan beberapa OpenGL saat menggunakan LWJGL. Untuk memulai dengan mudah, saya sedang menulis klon dari Atari Pong. Saya mengatur layar permainan dengan benar, deteksi tabrakan, dan semua permainan sebagian besar berfungsi, sebenarnya, jika itu adalah permainan 2 pemain, saya akan selesai sekarang, tetapi karena saya berencana melakukan ini permainan pemain tunggal , Saya harus datang dengan AI sederhana untuk mengontrol pemain kedua.

Mengetahui di mana bola akan mengenai sasaran tampaknya cukup sepele, dan menciptakan AI yang selalu mengenai bola sepertinya adalah hal yang mudah dilakukan, tetapi saya ingin permainan bisa dimenangkan, jadi saya tidak bisa selalu membuat IA memukulnya. bola.

Jadi, inilah pertanyaan saya, bagaimana saya harus kode ini untuk menambahkan ketidaksempurnaan seperti manusia ke AI. Haruskah saya memutuskan secara acak apakah AI akan gagal pada titik tertentu? Atau ada hal yang lebih pintar (atau mungkin hanya jelas) yang saya lewatkan di sini?

Terima kasih banyak.

Setzer22
sumber
5
Nah umumnya Anda membuat kelelawar AI hanya bergerak dengan kecepatan tertentu sehingga jika bola ditempatkan dengan baik oleh pemain, AI tidak dapat mencapainya ..
4
Saya akan mulai dengan membatasi kecepatan di mana AI dapat memindahkan dayung, dan / atau membangun dalam jeda waktu acak (pendek) sebelum AI mulai menanggapi pukulan.
1
mungkin duplikat Apa yang membuat lawan komputer merasa hidup?
MichaelHouse
4
@ byte56 Saya tidak akan benar-benar menyebutnya dupe dari pertanyaan itu. Rasanya seperti contoh yang diberikan di sini blog.stackoverflow.com/2011/01/... di bawah "Jika Anda akan menutup pertanyaan pengguna sebagai duplikat, itu harus menjadi duplikat nyata". Pertanyaan itu adalah sumber yang bagus (dan seseorang mungkin bisa menggunakan pertanyaan itu untuk mendapatkan jawaban sendiri dengan konten yang ada di sana), tetapi itu tidak benar-benar menjawab secara spesifik pertanyaan ini, saya kira tidak.
Tetrad
1
@Tetrad Saya pikir jawabannya berakhir sangat mirip, tetapi, Anda benar, pertanyaannya berbeda. Saya pikir pertanyaan ini adalah sejenis versi yang lebih spesifik dari pertanyaan terkait. Seandainya OP melihat yang lain lebih dulu, saya tidak yakin apakah pertanyaan ini akan ditanyakan. Ketika saya memilih, saya ragu-ragu sehingga saya memutuskan dan menjawab pertanyaan dan memilih sebagai duplikat. Itu bisa baik bagi saya.
MichaelHouse

Jawaban:

20

AI pong tidak sempurna favorit saya sangat sederhana, namun mari kita lakukan beberapa kegagalan AI yang bagus.

Bola AI Tak Terlihat

Pengaturan AI : Ketika bola memantulkan dayung Anda, Anda tahu di mana itu dan seberapa cepat itu pergi. Tumbuhkan bola yang tidak terlihat pada saat itu tetapi dengan kecepatan yang lebih besar. Ini akan berakhir di mana bola yang terlihat pergi. Setiap frame, minta AI bergerak menuju lokasi bola yang tak terlihat. Hentikan bola yang tidak terlihat begitu mencapai sisi AI, jadi di situlah AI harus mengayuh dayungnya.

Hasil : AI sepertinya mencoba memprediksi jalur bola. Katakanlah pemain telah memantulkan bola pada sudut yang curam sehingga akan memantul dari dinding. AI akan melacak bola dengan sedikit cara, dan kemudian - lebih lambat dari bola - akan gagal melacaknya kembali dengan cukup cepat. Anda telah menipu AI, dan itu terlihat cukup logis dari sudut pandang manusia. Anda dapat melihat komputer mencoba memprediksi ke mana bola akan pergi, dan kemudian - oh, terjawab, itu terlalu lambat, dan Anda telah memenangkan satu poin.

Ini secara signifikan lebih baik daripada memasukkan keacakan, karena itu membuat AI terlihat relatif cerdas. Lawan yang layak. Ini juga memungkinkan AI bermain dengan aturan yang sama persis seperti manusia, yang terlihat lebih baik bagi pemain dan membuat pekerjaan Anda lebih mudah.

Pengaturan : Anda juga dapat mengubah kecepatan bola yang tidak terlihat, karena itu akan menentukan seberapa jauh AI akan merencanakannya. Semakin cepat bola yang tidak terlihat, semakin banyak waktu yang dayung harus pindah untuk memblokir, dan semakin baik pemain harus membidik.

DDR
sumber
Semua jawaban yang diberikan memberikan info yang sangat bagus, tetapi karena saya harus menandai satu untuk menjadi jawaban yang tepat, saya memilih yang ini karena saya sangat menyukai pendekatan Anda. Ini, dikombinasikan dengan beberapa hal lain yang dikatakan dalam jawaban lain (seperti bermain dengan waktu reaksi) mungkin mendapatkan AI yang benar-benar mirip manusia, dan dengan kesulitan yang mudah disesuaikan
Setzer22
Ini bekerja dengan sempurna untuk pengaturan saya karena saya memiliki sudut variabel, kecepatan, dan akselerasi berdasarkan gerakan khusus tertentu, sehingga bola berpotensi berada di semua tempat. AI dimiliki, tapi sekarang jauh lebih baik. Saya bisa melihat mengapa metode ini bukan yang terbaik untuk kecepatan terkunci dan sudut 45 derajat, tapi itu bukan permainan saya sama sekali.
jackrugile
1
Meskipun saya menyukai pendekatan ini, saya memang memiliki masalah dengan implementasi saya. Masalahnya adalah karena bola pelacak bergerak lebih cepat dari bola yang diwakilinya, itu mungkin kehilangan beberapa tabrakan yang akan terjadi pada bola yang diwakilinya. Alasannya, tentu saja, bahwa bola pelacak akan bergerak jarak yang lebih besar antara frame.
Wolfgang Schreurs
Jika Anda menginginkan kesetiaan yang lebih besar, Anda bisa menghitung ulang posisi bola pelacak dua kali per frame dan membagi dua kecepatan untuk setiap perhitungan.
DDR
22

Permainan Pong yang saya mainkan tampaknya berperilaku seperti berikut: dayung yang dikontrol AI tahu di mana bola akan mengenai bola tetapi terbatas dalam seberapa cepat bisa mencapai posisi itu. Jadi terkadang itu meleset. Saya pikir ini adalah cara yang paling jelas untuk melakukan itu.


sumber
Ini. Tidak membantu AI untuk mengetahui di mana bola akan mengenai jika hanya bisa bergerak, katakanlah, 3px per frame dan itu harus bergerak dari atas ke bawah.
KeithS
14

Ketika saya membuat klon hampir-pacman oh-begitu-mengagumkan di TI83 saya? kalkulator, masalah terbesar yang saya temui adalah bahwa "hantu" terlalu cepat. Saya harus memperlambat mereka entah bagaimana. Jadi, saya menaruh dosa lama yang besar (cos (tan (koordinat-x)))) di sana. Level yang lebih mudah akan melakukan perhitungan itu beberapa kali, dan level yang lebih keras hanya akan melakukan satu operasi saja.

Intinya adalah, WAKTU REAKSI. Teliti apa waktu reaksi manusia yang khas, dan tambahkan 10ms ke atasnya. Gunakan itu sebagai titik awal. Ketika level semakin sulit, hilangkan waktu dari waktu reaksi ... yang dapat menjadi sederhana Thread.sleep(time);untuk AI. Tunggu sejumlah waktu sebelum AI mulai bergerak.

Anda juga dapat mengontrol seberapa cepat dayung bergerak, atau, jika Anda BENAR-BENAR ingin menjadi rumit, tentukan di mana bola akan didasarkan pada berbagai tingkat informasi ... katakan hanya 2 piksel daripada vektor. Tambahkan pengubah sudut ke dinding untuk menambahkan tingkat keacakan, memaksa AI untuk menghitung ulang.

Russell Uhl
sumber
2
Bisakah Anda menjelaskan mengapa sebenarnya Anda menggunakan sin(cos(tan(x)))?
nullpotent
5
Karena saya masih muda, bodoh, dan pada TI83, sin (cos (tan (x))) menciptakan unit lag yang bagus di AI. Juga karena, setahu saya, kalkulator tidak memiliki perintah tunggu yang bisa menggunakan milidetik. Mungkin beberapa kejelasan: Saya tidak menggunakan majelis atau skrip mikro atau bahasa apa pun yang Anda dapat kompilasi untuk menjalankan hal-hal itu. Saya menggunakan kode pemrograman in-firmware (tombol prgm). Saya memiliki MAKSIMUM 8 baris kode di layar pada saat tertentu. Saya tidak dapat mengingat sesuatu yang lebih rumit untuk jeda waktu.
Russell Uhl
2
Saya belajar memprogram kode in-firmware TI83. Kemudian saya harus belajar kembali pemrograman terstruktur dalam C ++. Saya akan mengatakan TI83 mengajari saya apa kode string spaghetti, dan mengapa itu buruk. Saya belum menggunakan pernyataan goto sejak itu. Saat-saat yang menyenangkan.
ContextSwitch
2
oh tuan yang baik, para goto. Saya melihat kembali kode itu sesekali .... dan dengan cepat menyerah. Saya tidak tahu bagaimana saya bisa memprogram hal ini selama beberapa minggu selama kelas matematika saya.
Russell Uhl
1
Tidak perlu bersikap defensif tentang penundaan trigonometri Anda. Matematika floating point dalam satu lingkaran adalah cara umum untuk melakukan jeda dalam program yang ditulis beberapa dekade lalu dan kinerja / kemampuan kalkulator Anda sejalan dengan komputer era awal 80-an.
Dan Neely
6

Jika Anda hanya memperlambat dayung, maka setiap kali Anda memukul bola pada sudut yang tajam (yaitu bergerak naik dan turun bukannya langsung ke sisi lain), komputer hampir selalu akan meleset karena bola bergerak naik / turun lebih cepat dari yang bisa dikompensasi oleh dayung.

Sebaliknya, apa yang akan saya lakukan adalah bermain dengan kecepatan dayung, dan titik di mana AI bereaksi. Sebagai contoh:

  • saat pengguna memukul bola
    • AI dapat bereaksi segera dan pergi ke tempat bola akan berada. Jika cukup cepat, ia akan sampai di sana tepat waktu
  • saat bola melewati tengah lapangan
    • AI harus menunggu sampai melintasi tengah lapangan sebelum bereaksi

Hal lain yang harus diubah adalah bagaimana AI bereaksi. Anda telah menyoroti strategi di mana dayung selalu bergerak ke posisi di mana bola akan berada. Seseorang tidak selalu bisa melakukan itu. Mereka lebih cenderung mengikuti bola ke atas dan ke bawah, tidak tahu di mana tepatnya bola akan sampai ke mereka karena semua bouncing.

Jadi, metode reaksi yang lebih manusiawi adalah selalu bergerak ke arah bola. Misalnya, jika bola bergerak ke atas, maka dayung bergerak ke atas. Jika dayungnya cukup cepat, ia dapat bereaksi terhadap pantulan dari atas dan bawah. Jika dayung tidak cukup cepat, maka itu akan lebih dari kompensasi dengan bergerak ke atas ketika bola bergerak ke atas, tetapi kemudian ketika memantul, dayung mungkin tidak dapat bergerak turun cukup cepat.

Terakhir, Anda bisa bermain dengan ukuran dayung juga untuk menambah / mengurangi kesulitan.

Trenin
sumber
2

Salah satu faktor yang perlu dipertimbangkan adalah keacakan - pemain manusia selalu memiliki beberapa tingkat variasi dalam permainan mereka, jadi jika Anda ingin AI Anda terlihat seperti manusia maka Anda juga ingin memiliki beberapa variasi dalam permainan mereka.

Anda dapat mengatur rentang untuk:

  • Waktu reaksi (seberapa cepat AI mulai bergerak)
  • Kecepatan (seberapa cepat AI menggerakkan pemukul)
  • Akurasi (seberapa dekat AI akan sampai ke tempat yang sebenarnya ingin mengayuh dayung mereka, memberikan kesempatan untuk undershoot atau overshoot di mana mereka inginkan)

Kemudian pada setiap pukulan lawan, AI dapat memilih nilai dalam rentang itu dan membuat keputusan (dan gerakan) berdasarkan itu. Untuk lawan AI yang lebih mudah, Anda bisa membuat rentang itu semua agak buruk, tetapi juga memiliki rentang luas untuk memberi AI beberapa "tembakan keberuntungan". Untuk lawan yang lebih sulit, Anda bisa mengencangkan rentang itu dan menempatkan semuanya dalam rentang "baik".

Blobinator
sumber
2

Saya akan menyarankan solusi yang lebih umum yang tidak spesifik untuk hanya pong. Saya percaya ini bisa diterapkan pada game apa pun - bukan hanya pong. Anda menginginkan perilaku seperti manusia, bukan? Sehingga manusia bisa merasa seperti sedang bermain manusia ... dan karenanya dengan harapan berharap untuk menang. Jadi apa yang kamu lakukan?

Amati manusia! Bagaimana seorang pemain bisa kalah di pong? Nah, jika kita menonton dua pemain pong itu cukup jelas. Biasanya, kekalahannya adalah karena bola terlalu cepat dan waktu reaksi para pemain tertunda. Itu dua parameter, salah satunya dapat disesuaikan. Yang lainnya adalah kemampuan pemain untuk menekan arah yang benar. Jadi, Anda memiliki frekuensi kesalahan dan frekuensi reaksi - keduanya dapat disesuaikan tergantung pada kesulitannya.

AI yang mudah akan memiliki input lag yang lebih tinggi dan lebih banyak kecenderungan untuk membuat kesalahan acak - ketika AI yang lebih sulit akan disetel agar parameter ini diarahkan menjadi sulit.

Ini dapat diterapkan pada hampir semua permainan - bahkan satu seperti tic tac toe atau bahkan model yang lebih kompleks. Pendekatan ini dipecah dalam skenario yang lebih rumit tetapi cukup memadai di mana permainan di mana jumlah parameter dan ruang lingkupnya sempit.

Vaughan Hilts
sumber
1

Berikut daftar beberapa opsi, beberapa di antaranya telah dibahas:

  • Buat pemain komputer yang lebih pintar membidik bola sehingga lebih sulit bagi pemain untuk meraihnya dengan banyak pantulan, dan lakukan yang sebaliknya untuk lawan yang mudah.
  • Seorang pemain yang cerdas akan mengayuh dayung mereka ke tengah sementara bola menuju ke lawan dan mereka tidak tahu ke mana itu akan kembali.
  • Sebelum pantulan terakhir lebih sulit bagi manusia untuk memprediksi di mana bola akan berakhir. Jadikan AI memiliki ketidakakuratan yang serupa.
  • Batasi kecepatan dayung sehingga lebih lambat dari bola. Perlu kurang dari setengah kecepatan vertikal untuk dilewatkan dengan permainan sempurna.
  • Tingkatkan kecepatan bola berdasarkan kesulitan, durasi pertandingan, dll.
  • Manusia tidak bereaksi secara instan. Pemain AI seharusnya juga tidak.
  • Berikan AI kesempatan acak untuk membuat kesalahan dan melewatkan bola.
Adam
sumber
0

Saya melakukan yang kecil klon Pong juga (di LUA).

AI saya sangat sederhana tetapi tidak seburuk itu, imho.

Saya hanya memeriksa posisi bola dan jika lebih rendah saya memindahkan dayung ke bawah, jika lebih tinggi saya memindahkan dayung ke atas.

Kemudian, untuk memperbaiki kesulitan, saya menambah atau mengurangi jarak dari bola tempat dayung komputer mulai bergerak.

Pitto
sumber