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.
Jawaban:
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.
sumber
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
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.
sumber
sin(cos(tan(x)))
?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:
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.
sumber
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:
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".
sumber
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.
sumber
Berikut daftar beberapa opsi, beberapa di antaranya telah dibahas:
sumber
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.
sumber