Mundarija:
2025 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2025-01-13 06:58
Ushbu qo'llanmada men sizga Arduino yordamida sun'iy intellekt bilan Tic Tac Toe o'yinini qanday qurishni ko'rsataman. Siz Arduino -ga qarshi o'ynashingiz yoki Arduino -ning o'ziga qarshi o'yinini ko'rishingiz mumkin.
Men "minimax algoritmi" deb nomlangan algoritmdan foydalanaman, uni nafaqat Tic Tac Toe uchun AI yaratish uchun, balki to'rt qatorli, dama yoki hatto shaxmat kabi boshqa o'yinlar uchun ham ishlatish mumkin. Shaxmat kabi o'yinlar juda murakkab va algoritmning ancha nozik versiyalarini talab qiladi. Bizning Tic Tac Toe o'yini uchun biz algoritmning eng oddiy versiyasidan foydalanishimiz mumkin, lekin shunga qaramay juda ta'sirli. Aslida, AI juda yaxshi, shuning uchun Arduino -ni mag'lub etishning iloji yo'q!
O'yinni qurish oson. Sizga faqat bir nechta komponentlar va men yozgan eskiz kerak. Agar siz uning qanday ishlashini tushunmoqchi bo'lsangiz, men algoritmga batafsilroq tushuntirish qo'shdim.
1 -qadam: qurish va o'ynash
Tic Tac Toe o'yinini yaratish uchun sizga quyidagi komponentlar kerak bo'ladi:
- Arduino Uno
- 9 ta WS2812 RGB LED
- 9 ta tugma
- ba'zi sim va o'tish kabellari
Fritzing eskizida ko'rsatilgandek, komponentlarni ulang. Keyin kodni Arduino -ga yuklang.
Odatiy bo'lib, birinchi burilishni Arduino oladi. Vazifalarni biroz qiziqarli qilish uchun birinchi harakat tasodifiy tanlanadi. Birinchi harakatdan so'ng, Arduino mumkin bo'lgan eng yaxshi harakatni aniqlash uchun minimax algoritmidan foydalanadi. Siz Arduino -ni tiklash orqali yangi o'yinni boshlaysiz.
Serial monitorni ochish orqali siz Arduino "o'ylashini" ko'rishingiz mumkin. Har bir mumkin bo'lgan harakat uchun algoritm reytingni hisoblab chiqadi, bu harakat Arduino uchun g'alaba (10 bahosi) yoki yo'qotilishiga (-10 qiymati) yoki durangga (0 qiymatiga) olib kelishini ko'rsatadi.
Shuningdek, siz eskizning boshida "#define DEMO_MODE" qatoriga izoh qoldirib, Arduino -ning o'ziga qarshi o'yinini ko'rishingiz mumkin. Agar siz o'zgartirilgan eskizni yuklasangiz, Arduino birinchi harakatni tasodifiy bajaradi, so'ngra minimax algoritmidan foydalanib, har bir o'yinchi uchun eng yaxshi harakatni aniqlaydi.
E'tibor bering, siz Arduino bilan g'alaba qozona olmaysiz. Agar xato qilsangiz, har bir o'yin durang bilan yakunlanadi yoki yutqazasiz. Buning sababi shundaki, algoritm har doim eng yaxshi harakatni tanlaydi. Siz bilganingizdek, har ikki o'yinchi xato qilmasa, Tic Tac Toe o'yini har doim durang bilan tugaydi. Demo rejimida har bir o'yin durang bilan tugaydi, chunki hammamiz bilamizki, kompyuterlar hech qachon xato qilmaydi;-)
2 -qadam: Minimax algoritmi
Algoritm ikkita komponentdan iborat: baholash funktsiyasi va qidirish strategiyasi. Baholash funktsiyasi - taxta pozitsiyalariga raqamli qiymat beradigan funksiya. Agar pozitsiya yakuniy pozitsiya bo'lsa (ya'ni, ko'k o'yinchi yoki qizil o'yinchi g'olib bo'lgan yoki hech bir o'yinchi yutmagan pozitsiya), baholash funktsiyasi juda oddiy: Aytaylik, Arduino ko'k, odam o'yinchisi qizil o'ynaydi. Agar pozitsiya ko'k uchun g'alaba qozonadigan pozitsiya bo'lsa, funktsiya bu pozitsiyaga 10 qiymatini belgilaydi; agar bu qizil uchun g'alaba qozonadigan pozitsiya bo'lsa, funktsiya -10 qiymatini belgilaydi; va agar pozitsiya durang bo'lsa, funktsiya 0 qiymatini belgilaydi.
Navbat Arduinoga kelganida, u baholash funktsiyasining qiymatini oshiradigan harakatni tanlamoqchi, chunki qiymatni ko'paytirish u durangdan ustunlikni (10 dan katta) va mag'lubiyatga emas, 0 -10 dan katta). O'xshash dalilga ko'ra, raqib shunday o'ynashni xohlaydilarki, u baholash funktsiyasining qiymatini kamaytiradi.
Yakuniy bo'lmagan pozitsiya uchun algoritm rekursiv qidirish strategiyasi yordamida baholash funktsiyasining qiymatini hisoblab chiqadi. Joriy pozitsiyadan boshlab, u ko'k o'yinchi va qizil o'yinchi bajarishi mumkin bo'lgan barcha harakatlarni simulyatsiya qiladi. Buni diagrammada bo'lgani kabi daraxt sifatida ko'rish mumkin. Yakuniy pozitsiyaga etib kelganida, u orqaga chekinishni boshlaydi va baholash funktsiyasining qiymatini past rekursiya darajasidan yuqori rekursiya darajasiga ko'taradi. Baholash funktsiyasining pastki rekursiya sathidan pozitsiyagacha bo'lgan qiymatini maksimal (agar tegishli rekursiya bosqichida ko'k o'yinchining navbatida bo'lsa) yoki minimalini (agar tegishli rekursiya bosqichida qizil o'yinchining navbatida bo'lsa) belgilaydi. yuqori rekursiya darajasi. Nihoyat, algoritm orqaga chekinishni tugatib, hozirgi holatiga qaytganida, maksimal baholash funktsiyasi qiymatiga ega bo'lgan harakatni (yoki harakatlardan birini) oladi.
Bu biroz mavhum ko'rinishi mumkin, lekin aslida bu unchalik qiyin emas. Diagrammaning yuqori qismida ko'rsatilgan pozitsiyani ko'rib chiqing. Birinchi rekursiya bosqichida ko'k uch xil harakatni bajarishi mumkin. Moviy baholash funktsiyasining qiymatini maksimal darajada oshirishga harakat qiladi. Moviy harakatlarning har biri uchun qizil bo'lishi mumkin bo'lgan ikkita harakat mavjud. Qizil baholash funktsiyasining qiymatini minimallashtirishga harakat qiladi. Ko'k o'ng yuqori burchakda o'ynaydigan harakatni ko'rib chiqing. Agar markaziy maydonda qizil o'ynasa, qizil g'alaba qozongan (-10). Agar, aksincha, qizil pastki markaziy qutida o'ynasa, ko'k keyingi harakatda g'alaba qozonadi (10). Shunday qilib, agar ko'k o'ng yuqori burchakda o'ynasa, markaziy maydonda qizil rang o'ynaydi, chunki bu baholash funktsiyasining qiymatini kamaytiradi. Xuddi shunday, agar ko'k pastki pastki oynada o'ynasa, qizil yana markaziy oynada o'ynaydi, chunki bu baholash funktsiyasini kamaytiradi. Agar ko'k rang markaziy maydonda o'ynasa, qizilning qaysi harakati muhim emas, ko'k doim g'alaba qozonadi (10). Ko'k rang baholash funktsiyasini maksimal darajada oshirishni xohlaganligi sababli, u markaziy oynada o'ynaydi, chunki bu pozitsiya boshqa ikkita harakatga (-10) qaraganda baholash funktsiyasining (10) katta qiymatiga olib keladi.
3 -qadam: Muammolarni bartaraf etish va keyingi qadamlar
Agar siz tugmachani bosganingizda va tugmachaga mos keladigan boshqa LED yonib tursa, ehtimol siz A0-A2 yoki 4-6 pinlaridagi simlarni aralashtirib yubordingiz yoki LEDlarni noto'g'ri tartibda uladingiz.
Shuni ham yodda tutingki, algoritm har doim ham Arduino -ni iloji boricha tezroq g'alaba qozonishiga imkon beradigan harakatni tanlamaydi. Aslida, men bir muncha vaqt algoritmni tuzatishga sarfladim, chunki Arduino g'alaba qozonadigan harakatni tanlamadi. Biroz vaqt o'tgach, men uning harakatini tanlaganini angladim, shundan keyin u bir harakatni yutishini kafolatladi. Agar xohlasangiz, algoritmni o'zgartirishga urinib ko'rishingiz mumkin, shunda u har doim g'alabali harakatni keyingi g'alabadan afzal ko'radi.
Ushbu loyihaning kengaytirilishi 4x4 yoki hatto 5x5 o'lchamli Tic Tac Toe uchun AI yaratish uchun algoritmdan foydalanish bo'lishi mumkin. Shunga qaramay, algoritm tekshirishi kerak bo'lgan pozitsiyalar soni juda tez o'sib borayotganiga e'tibor bering. Siz o'yinchi uchun pozitsiya yaxshi yoki yomon bo'lishi ehtimoliga asoslanib, yakuniy bo'lmagan pozitsiyalarga baho berib, baholash funktsiyasini yanada aqlli qilish usullarini topishingiz kerak bo'ladi. Agar siz muqobil harakatlarga qaraganda keyingi tadqiqotlarga unchalik loyiq bo'lmasa, rekursiyani erta to'xtatib, qidiruvni yanada oqilona qilishga harakat qilishingiz mumkin.
Xotirasi cheklanganligi sababli Arduino bunday kengaytmalar uchun eng yaxshi platforma emas. Rekursiya dasturni bajarish vaqtida to'plamning o'sishiga imkon beradi va agar to'plam juda ko'p o'ssa, u dastur xotirasini buzishi mumkin, bu esa nosozliklar yoki tartibsiz xatti -harakatlarga olib kelishi mumkin. Men Arduino -ni ushbu loyiha uchun tanladim, chunki men bu muammoning eng yaxshi tanlovi uchun emas, balki ta'lim maqsadlarida amalga oshirilishi mumkinligini ko'rishni xohladim.