|
Bu ilk makalemiz olduğu için sadece temel bilgiler vereceğim. Makaleler bittiğinde emin olun oyununuzda yapmanız gerekecek hemen hemen bütün yapay zeka(YZ) uygulamalarını biliyor olacaksınız.Her makaleyi ilgili konuyu kavratacak şekilde yazacağım , sırf sitede bulunsun diye değil. Bu makaleleri anlamanız için sadece orta derecede C++ bilgisi gerekiyor çünkü yapay zeka uygulamalarını C++ dili ile yapacağım. Yapay zeka hakkında herhangi bir altyapınızın olmasına gerek yok. Akademik ve Oyun yapay zekası arasında önemli farklar var.Akademik yapay zeka , zayıf ve güçlü olmak üzere ikiye ayrılıyor.Güçlü yapay zeka insan gibi düşünebilen , öğrenebilen( uygulanması çok zor bir kavram…) sistemler oluşturmayı hedef seçmiş uygulamalardan oluşuyor.Zayıf yapay zeka ise daha dar bir alanı ; hayatta karşılaşılan problemlere yapay zeka teknolojilerini kullanarak cevap bulmaya çalışan uygulamaları içerir.Gördüğünüz gibi zayıf yapay zeka çözüm yollarını kendisi bulmuyor , verilen tekniklerle sonuca ulaşmaya çalışıyor.Güçlü yapay zeka uygulamaları isminin çağrıştırdığı gibi güçlü sistemler istiyor.Bazı uygulamalar binlerce işlemciye sahip bilgisayarlarda dahi haftalarca sürebiliyormuş. YAPAY ZEKAYA GİRİŞ Bu ilk makalemiz olduğu için sadece temel bilgiler vereceğim. Makaleler bittiğinde emin olun oyununuzda yapmanız gerekecek hemen hemen bütün yapay zeka(YZ) uygulamalarını biliyor olacaksınız.Her makaleyi ilgili konuyu kavratacak şekilde yazacağım , sırf sitede bulunsun diye değil. Bu makaleleri anlamanız için sadece orta derecede C++ bilgisi gerekiyor çünkü yapay zeka uygulamalarını C++ dili ile yapacağım. Yapay zeka hakkında herhangi bir altyapınızın olmasına gerek yok. Akademik ve Oyun yapay zekası arasında önemli farklar var.Akademik yapay zeka , zayıf ve güçlü olmak üzere ikiye ayrılıyor.Güçlü yapay zeka insan gibi düşünebilen , öğrenebilen( uygulanması çok zor bir kavram…) sistemler oluşturmayı hedef seçmiş uygulamalardan oluşuyor.Zayıf yapay zeka ise daha dar bir alanı ; hayatta karşılaşılan problemlere yapay zeka teknolojilerini kullanarak cevap bulmaya çalışan uygulamaları içerir.Gördüğünüz gibi zayıf yapay zeka çözüm yollarını kendisi bulmuyor , verilen tekniklerle sonuca ulaşmaya çalışıyor.Güçlü yapay zeka uygulamaları isminin çağrıştırdığı gibi güçlü sistemler istiyor.Bazı uygulamalar binlerce işlemciye sahip bilgisayarlarda dahi haftalarca sürebiliyormuş. Oyunlarda uygulanan yapay zeka ise zayıf yapay zeka türüne daha yakın .Çünkü kendine verilen yöntemlerle soruna çözüm yolları arıyor .Hem yapay zeka programcısının kaynakları - işlemci ve hafıza – sınırlı.Her bir sorgulamanın kaynak tüketmesi ve oyuncuların genelde grafiklerle ilgilenmesi , oyun yapımcılarının yapay zeka ye önem vermesini engelliyor.Yapımcılar işlemci gücünü daha çok grafiklere harcıyorlar.Bununla birlikte Halo da kullanılan yapay zeka oyuncuların dikkatini çekmiş ve oyunun fazla satmasına katkı sağlamış.Son zamanlarda piyasaya çıkan F.E.A.R adlı oyun yapay zekasıyla adından iyice söz ettirdi. Hatta yapay zekasıyla her hafta elinden birkaç oyun geçen şımarık oyun eleştirmenlerini bile heyecanlandırdı.(Burada taş attığımın farkındayım J )Tabii onlar da mesleklerini yapıyorlar , saygı duyuyoruz. Bir yapay zeka programcısı olarak yapmanız gereken çok şey var.İşiniz NPC( non-player character ) leri mümkün olduğu kadar zeki yapmakla bitmiyor.NPC leri ortalama oyuncudan zeki yapmamanız da gerekli , yapay zeka seviyesini ayarlamalısınız , yani karakterleriniz kıt zekalı olmalı.Yapay zekayı öyle bir ayarlamalısınız ki NPC lerin her zaman şerefli bir mağlubiyet alması gerekir. Eğer NPC leri çok zeki yaparsanız oyuncu devamlı yenilir ve oyundan zevk almaz hale gelir. Çok yenilen oyuncular oyundan çabuk sıkılır ve koparlar.Bu da oyunun raf süresini kısaltır.Yapay zeka her zaman için zeki gibi görünmeli ama saf Anadolu çocuğu gibi bön bön ortalıkta dolanmalıdır.Dikkat ettiyseniz yapay zeka askeri , her zaman için saklanıyorum derken mutlaka bir yerlerini gösterir.Mesela Call of Duty oyununda saklanan Alman askerleri kafalarını gösteriyorlar , biz de kafalarını gördüm diyerek avlıyoruz tabii.Oyuncular NPC leri yendiği zaman mutlaka kendini zeki hissetmeli, kendisiyle gurur duymalıdır. Oyunlarda yapay zekanın uygulanması yapay zeka tekniklerinin birebir uygulanması ile olmuyor.Oyunlarda bazı hileler yapılıyor.Mesela gerçek zamanlı strateji(RTS) oyunlarında bilgisayar(yapay zeka) daha fazla kaynakla başlıyor.Düşman sizin merkez binanızın ,askerlerinizin ve savunma binalarınızın nerede olduğunu filan biliyor.Bunlar sınırlı olduğu zaman oyuna zevk katıyor(düşmanın becerisini artırıyor ) ama abartılması oyuncuyu oyundan düşürür çünkü düşman deli gibi asker gönderir ama zeki hareketler yapmaz , askerlerini harcar. Oyuncular her gün daha çok online oyunlara yöneliyorlar çünkü karşılarında insan zekası ve davranışı görmek istiyorlar. İnsan rakip olarak online Counter-Strike oyununda bir kenarda çömelip pusu atanlardan bahsetmiyorum tabii, onlar insan bile sayılmazlar.Biz zevk için oynayanlardan bahsediyoruz.Online oyuna yönelimden anlamak zorunda olduğumuz şey oyuncuların karşılarında insanla oynamak istemeleridir.Oyunda NPC ne kadar insan gibi davranabiliyorsa oyun yapay zekası o kadar başarılı olacaktır. Oyunlar piyasaya sürülmeden evvel bir sürü test aşamasından geçiyor.Bunlardan biri de yapay zekanın ayarlanması için yapılıyor.Duruma göre hileyi artırıyorlar veya azaltıyorlar.Hile artırılıyor dedim çünkü bazı durumlarda hile oyuncuya yapay zeka seviyesinin yükselmesi olarak yansıyabiliyor.(Bir de oyun yazılım olarak ,son aşamada , fazla kurcalanmak istenmiyor olabilir). Halo nun testlerinde düşman askerin gücünün artırılması(hit-point) test edicilere daha zeki düşmanla savaşıyor hissi vermiş. Oyunlardaki yapay zekanın zayıf yapay zeka olduğundan ve sorunun çözümü için mevcut tekniklerden yararlandığından bahsettim.Uygulanan teknikler kendi içinde deterministic ve non-deterministik(kesin ve kesin olmayan) olmak üzere ikiye ayrılırlar. Kesin tekniklerde kesin şartlar vardır ve bu şartlar sağlandığında mutlaka yapılması gereken iş bellidir. Bununla birlikte kesin tekniklerde oyunda olabilecek bütün durumların belirlenmesi ve kodlanması gerekir.Bu da kod yazımının uzaması ve masraf demektir.Bununla birlikte kodun hata ayıklama kısmı kolay olur çünkü olabilecek durumlar belirlidir ve kodlanmıştır.Hata çıkan durum hemen bulunur ve halledilir.Kesin olmayan cevaplar veren teknikler ise çok az da olsa öğrenme kabiliyeti içerir , bütün her şeyin kodlanması gerekmez ama hata ayıklama kısmı zor olur .Çünkü yapay zekanın ne zaman ne yapması gerektiği tam belli değildir.Gereksiz durumlar da ortaya çıkabilir.Mesela düşman asker zıplayarak sizden kaçtığının farkına vardı ve meydan kanguru sürüsü gibi zıplayan askerlerle dolmaya başladı.Ne iğrenç olur.Kesin olmayan sonuçlar veren yöntemlerde (non-deterministic) yapay zekanın kodlanması işi zor olur çünkü ortada soyut bir durum vardır ve bu oyuna uygulanmalıdır.Soyutluğun olduğu durumda yeni bir tekniğin uyarlanması , test edilmesi mevcut teknikler varken yeni maceralara koşulması oyun yapımcıları için tercih edilir bir yol değildir.Bu yüzden kesin sonuçlar içeren yapay zeka teknikleri daha çok kullanılır. Oyunlardaki yapay zekaların mevcut teknikleri kullandığından bahsettim.Yalnız bu teknikler tam olarak kesin ve kesin olmayan sonuçlar çıkaranlar diye ayrılmaz.Mesela bu makalede göstereceğim sonlu durum makinaları(SDM) kesin ve kesin olmayan (deterministic ve non-deterministik) sonuçlar çıkaracak şekilde oluşturulabilir.Biz kesin sonuçlar için kodlanmış SDM ler üretip kullanacağız. SDM ler oyunlardaki ilk yapay zeka uygulamaları için kullanılmış. Bugün bile kullanımı var çünkü kodlanması , yönetilmesi kolay bir tekniktir.Mesela ilk oyunlardan pac-man de SDM ler kullanılmış. Quake 2 de bile kullanılmış.Şimdi daha çok fuzzy logic(bulanık mantık) kullanıyor.İkisi arasındaki fark birinin tepki vermesi için kesin uyarılar alması gerektiği ; diğerinde (bulanık mantıkda) ise cevabın daha yumuşak uyarıcılar ile tetiklenebiliyor olmasıdır.Mesela SDM de düşman 10 metrede ise ve güç = 80 den yukarı ise saldır mantığı geçerlidir , durum değişimi matematiksel ifadelerle şarta bağlanmıştır.Bulanık mantıkda ise düşman yakınsa ve güçlüysen saldır diye bir mantık yürütülür.Gördüğünüz gibi ikinci durum daha izafi , yoruma açık .Kime ve neye göre yakın ? SDM ler neye benzerler? En basit bir örnekle odamızı ısıtan ampulü örnek verebiliriz. Ampulümüzün yandığı ve yanmadığı olmak üzere ki durumu vardır. Ampulümüzün olabileceği sadece iki tane durum vardır, yani durumlar sonludur.Bu durumlar arası geçişler bir makinanın çarklarının işleyişi gibi sabittir , aynen makine gibidir.Ampulümüzün durumlarını şöyle bir grafikle gösterebiliriz.
Şimdi lambanın sonlu sayıdaki durumları bellidir(2 tane) ve durum değiştirmeleri için uyarıcılar gerekir.Bu durumda uyarıcı , mesela biz , lambanın düğmesine bastığımız zaman lambanın durumu değişir.Ampul yanıyorsa sönük duruma , sönük durumda ise yanma durumuna geçer.Dışarıdan bir uyarıcı gelmiştir ve lamba halini değiştirmiştir.Aynı şey yapay zeka için de gereklidir. Yapay zeka karakterinin de kendine göre durumları vardır.Bu durumlar arası geçiş için uyarıcılar gereklidir.Askeri de durumdan duruma geçen ampule benzetirsek : Mesela yapay zeka askeri devriye durumunda olabilir , düşman saldırdığı zaman durumunu savunma haline getirebilir ve ona göre davranışını belirleyebilir.Gördüğünüz gibi uyarıcı ile yapay zeka askerinin durumu değişti ve asker yeni bir tavır takındı , zeka belirtisi gösterdi.Şimdi askerin olabileceği başka bir durumu daha kullanarak(savunma durumu) , askerin olabileceği durumların şeklini çizelim.

Tam çizemedim , kusura bakmayın.Çizim programı kullanmayı bilmiyorum.Durumları daire şeklinde gösterdim.Uyarıcıları geçişler üstüne yazmaya çalıştım. Şimdi askerimizin üç durumu(sonlu sayıda) var.Her bir durumda uyarıcı bizim farklı davranmamıza sebep oluyor.Mesela devriye durumunda düşman görülürse asker saldırı durumuna geçiyor , düşmana saldırıyor.Savunma durumunda düşman görülürse askerimiz savunmayı bırakmıyor çünkü düşman kuvvetli gelmiş olabilir ancak sayısı azalınca düşmana saldırıyor. Durumları ve geçişlerini açıklayabildiysem ne mutlu bana.Eksik kalan yerleri en sonda e-posta adresimi vereceğim , oradan sorabilirsiniz. Yukarıdaki şekli( şekille çok daha farkına varılabilir olsa da )durumları ve uyarıcıları yazıya da aktarabiliriz. 
Bunu kavradıysanız çok şeyi kavramışsınız demektir.İlerde kullanacağımız bulanık mantık da bu mantığa dayanan bir kavramdır. Şimdi sıra geldi bu durumların yazılım olarak ortaya çıkarılmasına , yalnız çok kısa bir giriş yapacağım , uygulamanın tamamını haftaya vereceğim. Oyunda binlerce askerimiz olabilir ama biz askerlerin olabileceği 3 tane durum belirlediysek durum sayısının sabit kalması ,3 tane olması ,gerekir.Her asker için ayrı bir durum olmamalıdır yani.İlgili durumun sınıfını yazarken sınıfımızı (class ) singleton class özelliğinde tasarlamalıyız.Böylelikle programımızda sadece 3 durumun birer sınıf örneği olacaktır.Eğer durumlarımızı singleton class ile yapmazsak , her bir durumdan birkaç tane oluşmasına izin verirsek ; yukarıdaki yuvarlakların sayfayı kaplaması gibi durum sayısında artış olur ve karışıklık oluşur.Çok kaynak tüketilir ve yazılım işlemez. Şimdi size singleton class nedir ve nasıl oluşturulur onu anlatacağım. Singleton class lar sistemde özel bir sınıfın örneğinin bir tane olması gerektiği durulmada üretilirler.Mesela veritabanına ulaşabilme yetkisine sahip bir tane sınıf örneği olmalıdır , şayet birden fazla olursa yazılım güvenliği tehlikeye girer.Yazıcıyı kontrol eden sınıfın örneği de bir tane olmalıdır , birden fazla olursa iş karışır.Singleton class ların bir çok alanda kullanımı var.Ana karakterimizi bile singleton class ile tanımlayabiliriz. Yukarıdaki Durum sınıflarının örneği de bir tane olmalıdır.C++ bildiğinizi kabul ediyorum.Sınıfımızda TekOrnek sınıfının bir tane kendine ait static pointer ı var.Bu pointer ihtiyaç duyulduğu zaman default constructor ile üretilebiliyor.Default constructor protected üye olduğu için sadece sınıfın içinden çağrılabilir.Static pointer örneğimizi alabilmek için ise yine static bir fonksiyon belirledik.Bu fonksiyon public kısımda tanımlandığından dışarıdan ihtiyaç duyulduğunda çağrılıyor , o da static pointer varsa getiriyor , yoksa yenisini üretip getiriyor.İşte bu kadar basit. u önekini değişkenin sınıfa üye olduğunu göstermek için kullandım. Mesela : u_TekOrnek pointer i sınıfa üyedir.
class TekOrnek { public : static TekOrnek * alTekOrnek() { if( u_TekOrnek == 0 ) u_TekOrnek = new TekOrnek ; return u_TekOrnek ; } void yaz() { cout << "Turumun tek ornegiyim ; ) " << endl ; } private: static TekOrnek* u_TekOrnek ; protected: TekOrnek(){}; ~TekOrnek(){}; }; TekOrnek* TekOrnek::u_TekOrnek = 0 ; int main() {
TekOrnek::alTekOrnek()->yaz() ; Return 0 ; }
Bir sonraki derste SDM lerin uygulamalarını göreceğiz.
Ahmet Arslan www.oyungelistirici.net'te Alparslan lakabını kullanıyorum , sorularınızı oradan sorabilirsiniz.Özelden sormak için
Bu e-Posta adresi istek dışı postalardan korunmaktadır, görüntülüyebilmek için JavaScript etkinleştirilmelidir
|