Game Maker’da “Sayı Tahmin Etme” Oyunu Tasarlamak

Posted: 12 Temmuz 2011 by yasirkula in Diğer Dersler, Game Maker, Oyun Tasarımı
Etiketler:, , , , , , , , , , , , , , , , , , , , ,

Herkese selam, hepiniz iyisinizdir umarım. Bu derste sizlerle sırf GML kodları kullanarak ve de hiçbir sprite kullanmadan, sadece ve sadece tek bir objenin tek bir eventinin tek bir GML aksiyonunu kullanarak, basit bir sayı tahmin oyununun tasarım aşamasını paylaşacağım. Oyunumuz anladığınız üzere bilgisayarın rasgele oluşturduğu bir sayıyı en az hamlede tahmin etmeye dayalı. Oyunumuzda ayrıca 3 zorluk seviyesi bulunacak. Bu dersi anlamak için basit de olsa Game Maker’ın temel yapısını bilmelisiniz. Ayrıca biraz da olsa GML (Game Maker Language) bilgisi işinizi epey kolaylaştıracaktır.

NOT: Bu derste yaptığımız örneğin, onun gelişmiş bir versiyonunun ve de ekstra bir örnek olan “Aklından Bir Sayı Tut!” örneğinin “.gmk” ve “.exe” hâllerini içeren Winrar arşivi için link:

https://www.box.com/s/2b66e4e939058b6d1f3d

Derse başlamadan önce saçma ve anlamsız bir şekilde ortam şartlarından bahsetmek isteği duydum!? Şu an yatağımın üzerinde, beni hiç yarı yolda bırakmayan ACER marka orta düzey laptopumla; bir sağa bir sola uzanıp durarak bu yazıyı yazmaktayım (Söylentilere kulak verin; dizüstünüzü araya yastık ya da minder koymadan dizinizin üstüne koymayın.). Saatim gece yarısı 00:23’ü göstermekte. Ancak 2-3 dakika hata payı olabilir. Ortam o kadar karanlık ki yazıyı yazdığım klavyeyi bile göremiyorum. Çok ciddiyim. Ama neyse ki Q tuş düzenini ezbere döktürüyorum artık 🙂 . Şu anda bulunduğum şartların en kötü tarafı ise ne yazık ki gürültü olmasın diye müziği açamamam 😦 😦 . Çok üzücü değil mi? Şimdiyse laptopumun şarj simgesine mouse’mi götürüp bakıyorum. Yaklaşık 3 saatlik vaktim varmış. Yeter heralde, başlayalım o zaman.

Başlıyoruz

Öncelikle şunu söyleyeyim; şu anda tasarlayacağımız oyunu ben de şimdi anlatırken tasarlayacağım ilk kez, yani daha önceden tasarlamadım. Sadece fikri kafamda oluşturdum. Anlayacağınız dersi doğaçlama bir şekilde yazıyorum. 🙂

Şimdi Game Maker’ı açın ve yeni bir obje oluşturun. Adını istediğiniz bir şey verebilirsiniz, ben “oyun_mekanizma” koydum. Ardından elinizi eteğinizi mouse’den çekip oyunun yapısının nasıl işleyeceğini anlatmama izin verin.

Öncelikle, başlarda da bahsettiğim gibi oyunumuz 3 zorluk derecesinde oynanabilecek. Kolay zorlukta oyuncunun, bilgisayarın rasgele oluşturduğu sayıyı tahmin etme hakkı sınırsız olacak. Yani kaybetmek diye bir şey olmayacak bu zorlukta. Normal zorlukta ise oyuncunun bir miktar tahmin hakkı olacak ve bu hakları bitmeden doğru sayıyı bulamazsa kaybedecek. Zor zorluktaysa oyuncunun epey az tahmin hakkı olacak. Bunlara ek olarak zorluk arttıkça bilgisayarın oluşturabileceği sayı aralığı da genişleyecek.

Oyuncu oyunu açtığında ilk olarak ona zorluğu soran bir kutucukla karşılaşacak. Ardından zorluk seviyesine göre oyun başlayacak ve oyuncu oyunu bitirdiğinde; zorluğa ve kullandığı tahmin sayısına göre bir puan elde edecek. Ardındansa oyuncuya tekrar oynamak isteyip istemediği sorulacak. Kabul ederse oyuna restart atılacak, aksi takdirde oyundan çıkılacak. Oyunun yapısı basit anlamda işte böyle olacak. 🙂

Oyunu Tasarlamak

A) Zorluğun Ayarlanması ve Çeşitli Değişkenlerin Değerlerinin Atanması

Şimdi Game Maker’a geri dönün ve oluşturduğumuz objeyi açıp bir “Create” eventi oluşturun. Ardından “control” sekmesinden bir “Execute Code” aksiyonunu boş listeye sürükleyin. Şimdi oyunun başında sorulacak olan zorluk seviyesini kodlayalım. Bunun için aşağıdaki kodları “Execute Code” aksiyonunun içine yazın:

////Zorluğun Seçilmesi
yanit=show_message_ext("Bir zorluk seviyesi seçin..
Kolay Zorluk: Limitsiz tahmin hakkı, minimum puan getirisi, maksimum 300'e uzanan sayı aralığı.
Normal Zorluk: 15 tahmin hakkı, normal puan getirisi, maksimum 450'e uzanan sayı aralığı.
Zor Zorluk: 8 tahmin hakkı, yüksek puan getirisi, maksimum 600'e uzanan sayı aralığı.","Kolay","Normal","Zor");

if(yanit==1)
{
    global.zorluk=1;
    global.tahmin_hakki=-1;
    global.sayi=irandom(300);
}
else if(yanit==2 || yanit==0)
{
    global.zorluk=2;
    global.tahmin_hakki=15;
    global.sayi=irandom(450);
}
else
{
    global.zorluk=3;
    global.tahmin_hakki=8;
    global.sayi=irandom(600);
}

Şimdi izin verirseniz bu GML kod parçasında neler yaptığımızı anlatayım. Öncelikle en başta “yanit” isimli bir değişken oluşturup onun değerinin bir sorgudan gelmesini sağlıyoruz. Burada “show_message_ext(a1,a2,a3,a4)” GML fonksiyonunun işlevi şudur: Oyuncunun karşısına bir pencere çıkar ve fonksiyonda yazdığınız ilk metni(a1) bu pencerede gösterir. Bu kodun “show_message(b1)” fonksiyonundan farkı ise kullanıcının karşısına sadece bir yazı çıkarmakla kalmaması, aynı zamanda aynı pencerede ona bir de soru sormuş olmasıdır.

Sorunun maksimum 3 şıkkı olabilir ve bu şıklarda da sırayla (a2), (a3) ve (a4) bölümlerinde yazılan seçenekler gösterilir. Örneğin bir soruyu 2 şıklı yapmak içinse (a4) kısmı boş bırakılır. Şıklar yazılırken aralarına “,”(Virgül) işareti konmak zorundadır. Siz 2 şıklı bir soru soracak olsanız bile (a3)’den sonra bir virgül koymak zorundasınız. Burada yazmış olduğumuz sorgu, çalıştırıldığı takdirde şöyle görünecektir:

Şimdi “show_message_ext” fonksiyonuyla bir sorgu sorup verilen yanıtı “yanit” isimli değişkene atadık. Oyuncu eğer sorumuza ilk şıkla cevap verirse, yani “Kolay”ı seçerse “yanit” değişkenine 1 değeri döner. Aynı şekilde “Normal”i seçerse 2, “Zor”u seçerse de 3 değeri döner. Son bir seçenek olan ESC tuşuna basarsa da “yanit” değişkeninin değeri 0 olur.

Biz de kodun bu ilk parçacığından sonra basit bir if-else yardımıyla seçilen zorluk değerini belirliyor, ve ona göre “global.zorluk”, ”global.tahmin_hakki” ve “global.sayi” değişkenlerinin değerlerini ayarlıyoruz. Hemen bunları açıklayayım:

global.zorluk” değişkeni adı üstünde zorluğu temsil ediyor ve değeri 1 ise zorluğun “Kolay”, 2 ise “Normal”, 3 ise “Zor” olduğunu belli ediyor.

global.tahmin_hakki” değişkeni de yine adından da anlaşılacağı üzere oyuncunun maksimum tahmin hakkını ifade ediyor. Burada kafanızı karıştırabilecek tek şeyin “Kolay” zorluk seçildiğinde değerinin neden “negatif” bir değer olan -1 olduğunu düşünüyorum. Bunun nedeni ise ilerleyen zamanlarda kullanacağımız algoritma sayesinde bu değer negatif olursa oyuncunun sonsuza dek tahmin edebilme hakkının olabileceğidir.

global.sayi” değişkeni ise bilgisayarın rasgele ürettiği bir sayıyı depolamaya yaramaktadır. Yani bizim oyunda bulmaya çalışacağımız sayıyı temsil etmektedir. Burada kullanılan “irandom(X)” fonksiyonunun kullanımı ise gayet basittir. Bu fonksiyon sayesinde bilgisayar; 0 ile “X” arasında rasgele bir tamsayı (integer) üretir. Bunun “random(X)”den farkı ise eğer “random(X)” kullanırsak oluşturulacak rasgele sayının bir gerçek (reel) sayı olacağı, yani küsüratlı olabileceğidir. Biz de bu yüzden, oluşturulacak sayının küsüratlı olmaması için “irandom(X)” fonksiyonunu kullandık. İşte bu kadar basit. 🙂

Ve böylece ilk bölümü de bitirmiş olduk. Siz en iyisi ikinci bölüme geçmeden önce çalışma dosyanızı kaydedin. (CTRL + S)

B) Oyun Yapısının Kodlanması

Şimdi “oyun_mekanizma” objemizin “Create” eventindeki “Execute Code” aksiyonunu tekrar açın ve ilk yazdığımız kodların altına, yeni bir satıra geçip şu kodları ekleyin:

////Oyun Yapısının Kodlanması

for(tahmin_sayisi=1;tahmin_sayisi!=global.tahmin_hakki+1;tahmin_sayisi+=1)
{
    ////Oyuncudan Bir Sayı Tahmininin Alınması
    if(global.zorluk==1)
    {
        tahmin=get_integer("0 ile 300 arasında bir sayı söyleyin..#Tahmin Hakkınız: Sınırsız","");
    }
    else if(global.zorluk==2)
    {
        tahmin=get_integer("0 ile 450 arasında bir sayı söyleyin..#Tahmin Hakkınız: "+string(global.tahmin_hakki-tahmin_sayisi+1)+"","");
    }
    else
    {
        tahmin=get_integer("0 ile 600 arasında bir sayı söyleyin..#Tahmin Hakkınız: "+string(global.tahmin_hakki-tahmin_sayisi+1)+"","");
    }

    ////Oyuncunun Sayı Tahmininin Değerlendirilmesi
    if(tahmin==global.sayi)
    {
        score=1500*global.zorluk*global.zorluk/tahmin_sayisi;
        if((show_message_ext("Tebrikler! "+string(global.sayi)+" sayısını "+string(tahmin_sayisi)+" tahminde buldunuz.
Zorluğa bağlı olarak puanınız "+string(score)+".#Tekrar oynamak ister misiniz?","Evet","Hayır",""))==2)
        {
            highscore_set_strings("Yüksek Skorlar","boş","...Çıkmak İçin ESC Tuşuna Basın...");
            highscore_show(score);
            game_end();
            exit;
        }
        else
        {
            highscore_set_strings("Yüksek Skorlar","boş","...Çıkmak İçin ESC Tuşuna Basın...");
            highscore_show(score);
            game_restart();
            exit;
        }
    }
    else if(tahmin>global.sayi)
    {
        if(show_message_ext(string(tahmin)+" değeri yüksek, daha düşük bir sayı tahmin etmeyi deneyin :)","Tamam","Çıkış","")==2)
        {
            game_end();
            exit;
        }
    }
    else
    {
        if(show_message_ext(string(tahmin)+" değeri düşük, daha yüksek bir sayı tahmin etmeyi deneyin :S","Tamam","Çıkış","")==2)
        {
            game_end();
            exit;
        }
    }
}

Şimdi oyunun neredeyse tamamının işleyişini topladığımız bu kod kümesini baştan sona açıklayayım.

Öncelikle “for()” döngüsünün işleyişini bilmeniz size burada büyük katkı sağlayacaktır. Bilmiyorsanız basitçe anlatayım:

for()” deyiminin içinde isteğe bağlı olarak 3 kısım bulunur. İlk kısımda sırf bu “for()” döngüsüne has değişkenler tanımlayabiliriz. Bu değişkenler ekstra local (yerel) değişkenlerdir, çünkü sırf bu “for()” döngüsünde kullanılabilirler. Ben bu kısımda “tahmin_sayisi=1” değişken tanımlamasını yaptım.

for()” deyiminin ikinci kısmında tıpkı “if()”deki gibi bir değerin sınaması yapılır. Ben burada “for()”un ilk kısmında tanımladığım “tahmin_sayisi” değişkeninin, seçilen zorluğa göre belirlenen “global.tahmin_hakki” değişkeninin 1 fazlasına eşit olup olmadığını test ediyorum. Peki neden? Çünkü benim burada yapmak istediğim şey oyuncunun hiç tahmin hakkı kalmış mı diye test etmek. Eğer kalmışsa, yani “tahmin_sayisi” değişkeni “global.tahmin_hakki” değişkenine eşit değilse o zaman “for()” döngüsünün içine yazılan kodlar kümesi gerçekleştirilmeye başlanır. Eşitlik sınamasının “global.tahmin_hakki”nin 1 fazlasına göre yapılmasının nedeni ise şöyle: Mesela “Normal” zorlukta oynayan bir oyuncuyuz. İlk bölümde yaptığımız işlemlere göre 15 tahmin hakkımız var. Biz sayıyı tahmin etmeye çalışıp durduk ama 15. yani son tahminimize geldiğimiz halde bulamadık. Şu anda son tahminimizi yapmayı beklerken bilgisayar kodu yazdığımız gibi yorumluyor. “tahmin_sayisi!=global.tahmin_hakki” ve bunu test ediyor. “tahmin_sayisi”nın değerine bakıyor: 15. “global.tahmin_hakki”nin değerine bakıyor: O da 15. Ardından bu değerleri işleme sokuyor. “for(;15!=15;)” sınamasında 15’in 15’e eşit olduğunu görüyor ve “for()” döngüsünden çıkıyor. Yani biz son hakkımız olan 15. tahmin hakkımızı kullanamıyoruz! İşte bu son hakkımızda ortaya çıkan sorunu düzeltmek için “for()” döngüsü içerisinde “tahmin_sayisi” ile “global.tahmin_hakki” değişkeninin 1 fazlasının eşit olup olmadığına bakılıyor. Hiç usanmadan gayet uzun ve net bir şekilde anlattım bunun sebebini, umarım anlaşılmıştır. 🙂

NOT: Yazımın başlarında, zorluk kısmını kodlarken belirttiğim “Kolay” zorluktaki “global.tahmin_hakki” değerinin -1 olması işte burada işe yarıyor. “for()” döngüsündeki “tahmin_sayisi” değişkeninin değeri başlangıçta ve de sonrasında minimum 1 olacağından dolayı “tahmin_sayisi” değişkeni “global.tahmin_hakki” değişkeninin 1 fazlasına hiçbir zaman eşit olmayacak ve “for()” döngüsü sürekli döndürülecek. Yani limitsiz tahmin hakkımız olacak.

Gelelim “for()”un son kısmına. Burada ise “for()” döngüsü bir kere döndükten sonra üzerinde değişiklik yapılacak değişkenler ayarlanır. Ben burada “tahmin_sayisi+=1” işlemini yazarak her “for()” döngüsünden sonra kullanıcının kullandığı tahmin hakkının 1 artmasını sağladım. Epey basit bir şey yani.

NOT: “for()” döngüsünün içindeki bu 3 kısım birbirinden “;”(Noktalı Virgül) ile ayrılmak zorundadırlar. Döngünün herhangi bir parçasını boş bıraksanız bile oraya bir “;” koymak zorundasınız. Örneğin “for(;a>b;a+=1)” gibi. Burayı aklınızdan çıkarmayın.

Evet, “for()”un işleyişini anlattığımıza göre gelelim bu “for()” döngüsünün içine yazdığımız kodların ne işe yaradığına.

İlk parçacığı çok az anlatacağım çünkü gayet anlaşılır ve basit. Oyuncuya seçtiği zorluğa göre bir mesaj gösteriliyor ve ondan bir tamsayı girmesi isteniyor. Alınan tamsayının değeri ise “tahmin” isimli bir değişkene aktarılıyor. Burada tam sayıyı almak için kullanılan kod “get_integer()”dir. Bunun çalışması ise şöyle:

get_integer()”den sonra ilk olarak kullanıcıdan bir tamsayı girmesini istemek için bir yazı yazılır; “Bir tamsayı girin” gibi. Ardından araya “,”(Virgül) konur ve normal şartlarda tamsayının gireceği boş kutucukta ne yazacağı buraya girilir. Ben oraya boş bir “” parçası ekledim.

Bu ilk kısımla ilgili son söylenecek şey ise “+string(a)+” parçacığının kullanımı. Bu kullanıma alışın çünkü çoğu işlemde işinize epey yarıyor. Bir yazının herhangi bir yerinde bir değişkenin değerini göstermek için kullanılır kendisi. Yapmanız gereken tek şey yazıyı değişken isminin gösterileceği noktada kesip araya “+string(a)+” parçasının eklemek. Burada “a” ise gösterilecek değişkenin ismini temsil ediyor. Durumdan duruma göre “string(a)+” veya “+string(a)” şeklinde de kullanabilirsiniz. İlk gösterdiğimi eğer değişkeni bir yazının en başında gösterecekseniz, ikinci gösterdiğimi ise değişkeni yazının sonunda gösterecekseniz kullanabilirsiniz.

Ve böylece kullanıcıdan bir sayı tahmin etmesini istediğimiz kısmı tamamladık. Gelelim sonraki kod parçalarına.

1) Öncelikle bir “if()” sorgusuyla oyuncudan alınan “tahmin” değişkeninin değerinin, bilgisayarım rasgele oluşturduğu “global.sayi” değişkenine eşit olup olmadığına bakılır. Eğer eşitse şu işlemler uygulanır:

İlk önce skor hesaplanması yapılır. 1500 alt taban puanı, seçilen zorluğun baş katsayısının karesiyle çarpılır (Kolay zorluk için 1 ile, Normal zorluk için 4 ile, Zor zorluk için 9 ile) ve oyuncunun sayıyı bularken yaptığı tahmin sayısına bölünür. Yani oyunu ne kadar zor zorlukta bitirirseniz o kadar çok puan, sayıyı ne kadar az tahminde bulursanız yine o kadar çok puan kazanırsınız. Ardından elde edilen skor “score” adlı, Game Maker’ın kendi içinde kayıtlı bir değişkene aktarılır. Ancak istersek başka bir değişkene de aktarabilirdik değerini ama ben bunu kullanmak istedim.

Skorun hesaplanmasından sonra kullanıcıya bir mesajla tahmin ettiği sayının değeri, tahmin sayısı ve elde ettiği puan gösterilir. Ardından ona yeniden oynamak isteyip istemediği sorulur. Eğer “Hayır” derse, yani 2. seçeneği seçerse “show_highscore(score)” kodu vasıtasıyla yüksek skor tablosu gösterilir ve kullanıcıdan skoru için bir isim girmesi istenir. Ardından “game_end()” kodu ile de oyundan çıkılır. Burada “game_end()” kodunun altında neden “exit;” kodunu kullandık peki? Çünkü biz her ne kadar “game_end()” kodunu çalıştırsak da henüz “for()” döngüsünden kurtulamadık ve bu yüzden oyun “for()” döngüsünden çıkana kadar oyundan çıkılmaz. Bunu çözmek içinse “exit;” vasıtasıyla; “game_end()” kodu çalıştırıldıktan sonra “for()” döngüsünden anında çıkma işlemini gerçekleştiriyoruz.

Yok eğer kullanıcı oyunu yeniden oynamak istiyorsa, yani “Evet” seçeneğini seçtiyse yine yüksek skor tablosu gösterilir, ardından bu sefer “game_restart()” kodu ile oyuna restart atılması işlemi çalıştırılır ve yine “exit;” ile “for()” döngüsünden çıkılması sağlanarak oyuna anında restart atılması sağlanır.

NOT: Bu kısımda kullandığımız “highscore_set_strings()”in işlevi şudur: Yüksek skor tablosundaki sırayla başlık, boş bölümler ve çıkış yazılarının istediğiniz şekilde yazdırılmasını sağlar. Çok kafaya takmayın bunu.

2) 1. kısımda yapılan “if()” sorgusunda eğer “tahmin” değişkeninin değeri “global.sayi” değişkeninin değerine eşit değilse, bu sefer “tahmin” değişkeninin “global.sayi” değişkeninden büyük olup olmadığına bakılır.

Eğer büyükse kullanıcıya girdiği sayının büyük olduğunu, daha küçük bir sayı girmesinin gerektiğini söyleyen bir mesaj gösterilir. Ancak bu mesajın altında 2 şık da vardır: “Tamam” ve “Çıkış”. Burada amaç; kullanıcı eğer hemen o anda oyundan çıkmak istiyorsaÇıkış” butonuna basarak oyundan çıkabilmesidir. Bu en çok da “Kolay” zorlukta işe yarar çünkü “Kolay” zorlukta herhangi bir tahmin sayısı kısıtlaması olmadığından dolayı kullanıcı sayıyı tahmin etmediği sürece oyundan çıkamaz. Biz de bunun için ona böyle bir kolaylık sunuyoruz.

3) Eğer ki 1. ve 2. kısımda yapılan sorguların ikisi de tutmuyorsa; yani “tahmin” değişkeninin değeri ne “global.sayi”ya eşit, ne de ondan büyükse; anlayacağınız “tahmin” değişkeninin değeri “global.sayi”dan küçükse bu sefer oyuncuya 2. kısımda gösterilen mesajın farklı bir versiyonu gösterilir ve ondan daha büyük bir sayı girmesi istenir. İşte bu kadar basit! 🙂

4) Artık “for()” döngüsünü bitirdik! Öncelikle kullanıcının tahmin hakkı var mı yok mu baktık, sonra eğer varsa kullanıcıdan bir sayı girmesini istedik ve girilen sayıyla işlem yapıp onun bilgisayarın rasgele ürettiği “global.sayi”ya göre sorgularını yapıp kullanıcıya ona göre geri dönüş yaptık. Ayrıca kullanıcıya her daim oyundan çıkma fırsatı da vererek gayet kullanıcı dostu bir oyun yapısı hazırladık. Şimdi Game Maker’a geri dönün ve yeni bir oda oluşturup içine objenizin bir kopyasını (instance) yerleştirin ve oyunu çalıştırın. Eğer kodları düzgün yapıştırdıysanız oyununuz gayet sorunsuz bir şekilde çalışacaktır. Bunlar da oyundan birkaç resim:

Oyunu oynadıktan bir süre sonra sizin de fark edeceğiniz üzere; eğer “Normal” veya “Zor” zorlukta oynuyorsanız ve sayıyı tahmin haklarınız bitmeden bulamadıysanız, yani “for()” döngüsünün dönmesinin son bulmasına sebep olduysanız mesaj kutuları yok olur ve boş, gri bir pencere ile karşı karşıya kalırsınız. Bunun sebebi henüz; eğer tahmin haklarımız biterse yapılacak şeyleri, yani “for()” döngüsü sonlanırsa yapılacak şeyleri kodlamamış olmamızdır. Bunu ise bir sonraki bölümde yapacağız. 🙂

İsterseniz şimdi oyun dosyanızı kaydedin ve bir sonraki aşamaya geçin.

C) Son Rötuşlar

Evet, artık neredeyse oyunumuz bitti. Yapmamız gereken birkaç son ayarlama kaldı o kadar. Bunun için öncelikle “oyun_mekanizma” objesinin “Create” eventindeki “Execute Code” aksiyonunun en altına, yani “for()” döngüsünün bitiminin de altına şu kodları ekleyin:

////Oyuncu Sayıyı Hakları Bitmeden Bulamazsa Yapılacaklar

if(show_message_ext("Üzgünüm, "+string(global.sayi)+" sayısını "+string(global.tahmin_hakki)+" tahmin hakkında bulamadın.
Belki daha kolay bir zorluk seçmelisin. Tekrar oynamak ister misin??","Evet","Hayır","")==2)
{
    game_end();
}
else
{
    game_restart();
}
////Ve oyunumuzun kodlamaları tamamen bitti! Hayırlı olsun 🙂

Artık heralde bu kodları kendiniz yorumlayabilirsiniz, çünkü herhangi yabancı bir şey kullanmadık. Burada yaptığımız şey eğer oyuncu tahmin hakkı bitmeden sayıyı bilemezse ona bunu bir mesajla belirtip tekrar oynamayı isteyip istemediğini sormaktır. Bu kadar basit. Burada “game_end()” ve “game_restart()” kodlarından sonra “exit;” komutunu koymadığımıza dikkat edin. Çünkü ortalıkta herhangi bir “for()” döngüsünün içinde olmak söz konusu değil, bu yüzden de “exit;” komutu eklemek sadece yer israfı olurdu.

Artık oyununuz tamamen işlevsel ve herhangi sorunu da yok. Yeni eklediğimiz kodun oyundan bir resmini aşağıda görebilirsiniz:

Size oyununuzu daha güzel göstermek için son bir işlem daha önereyim. Fark ettiğiniz üzere oyunumuzu oynarken arka planda; objemizi koyduğumuz oda boş bir şekilde gözükmektedir ve de o olmasa oyunumuz daha güzel görünebilir. Bunun için yapmanız gereken objenin kopyasını koyduğunuz odayı açmak ve sol taraftan “settings” seçeneğini seçmek. Ardından alt taraftaki “Width” (Genişlik) ve “Height” (Yükseklik) değerlerini 1 yapmak sorununuzu çözecektir. 🙂

Eğer ki oyununuzda herhangi bir hata alıyorsanız; yukarıdaki 3 bölümde yaptığımız işlemlerdeki kodların hepsinin derlenmiş halini aşağıdan kopyalayıp objenizin içindeki tüm kodları sildikten sonra oraya yapıştırın. İşte kodlar:

////Zorluğun Seçilmesi
yanit=show_message_ext("Bir zorluk seviyesi seçin..
Kolay Zorluk: Limitsiz tahmin hakkı, minimum puan getirisi, maksimum 300'e uzanan sayı aralığı.
Normal Zorluk: 15 tahmin hakkı, normal puan getirisi, maksimum 450'e uzanan sayı aralığı.
Zor Zorluk: 8 tahmin hakkı, yüksek puan getirisi, maksimum 600'e uzanan sayı aralığı.","Kolay","Normal","Zor");

if(yanit==1)
{
    global.zorluk=1;
    global.tahmin_hakki=-1;
    global.sayi=irandom(300);
}
else if(yanit==2 || yanit==0)
{
    global.zorluk=2;
    global.tahmin_hakki=15;
    global.sayi=irandom(450);
}
else
{
    global.zorluk=3;
    global.tahmin_hakki=8;
    global.sayi=irandom(600);
}

////Oyun Yapısının Kodlanması
for(tahmin_sayisi=1;tahmin_sayisi!=global.tahmin_hakki+1;tahmin_sayisi+=1)
{
    ////Oyuncudan Bir Sayı Tahmininin Alınması
    if(global.zorluk==1)
    {
        tahmin=get_integer("0 ile 300 arasında bir sayı söyleyin..#Tahmin Hakkınız: Sınırsız","");
    }
    else if(global.zorluk==2)
    {
        tahmin=get_integer("0 ile 450 arasında bir sayı söyleyin..#Tahmin Hakkınız: "+string(global.tahmin_hakki-tahmin_sayisi+1)+"","");
    }
    else
    {
        tahmin=get_integer("0 ile 600 arasında bir sayı söyleyin..#Tahmin Hakkınız: "+string(global.tahmin_hakki-tahmin_sayisi+1)+"","");
    }

    ////Oyuncunun Sayı Tahmininin Değerlendirilmesi
    if(tahmin==global.sayi)
    {
        score=1500*global.zorluk*global.zorluk/tahmin_sayisi;
        if((show_message_ext("Tebrikler! "+string(global.sayi)+" sayısını "+string(tahmin_sayisi)+" tahminde buldunuz.
Zorluğa bağlı olarak puanınız "+string(score)+".#Tekrar oynamak ister misiniz?","Evet","Hayır",""))==2)
        {
            highscore_set_strings("Yüksek Skorlar","boş","...Çıkmak İçin ESC Tuşuna Basın...");
            highscore_show(score);
            game_end();
            exit;
        }
        else
        {
            highscore_set_strings("Yüksek Skorlar","boş","...Çıkmak İçin ESC Tuşuna Basın...");
            highscore_show(score);
            game_restart();
            exit;
        }
    }
    else if(tahmin>global.sayi)
    {
        if(show_message_ext(string(tahmin)+" değeri yüksek, daha düşük bir sayı tahmin etmeyi deneyin :)","Tamam","Çıkış","")==2)
        {
            game_end();
            exit;
        }
    }
    else
    {
        if(show_message_ext(string(tahmin)+" değeri düşük, daha yüksek bir sayı tahmin etmeyi deneyin :S","Tamam","Çıkış","")==2)
        {
            game_end();
            exit;
        }
    }
}

////Oyuncu Sayıyı Hakları Bitmeden Bulamazsa Yapılacaklar

if(show_message_ext("Üzgünüm, "+string(global.sayi)+" sayısını "+string(global.tahmin_hakki)+" tahmin hakkında bulamadın.
Belki daha kolay bir zorluk seçmelisin. Tekrar oynamak ister misin??","Evet","Hayır","")==2)
{
    game_end();
}
else
{
    game_restart();
}
////Ve oyunumuzun kodlamaları tamamen bitti! Hayırlı olsun 🙂

İşte bir yazının daha sonuna geldik. Umarım yazı yardımcı olmuştur, çünkü epey uğraştım anlaşılır olması için. Başka yazılarda görüşmek üzere!

NOT: Bu yazı tamamlandığında saat 17:26’ydı çünkü laptopumun şarjı bittiğinden uyudum ve ertesi gün öğle vakitlerinde yazıma devam ettim. Bu önemli bilgiyi sizlerle paylaştığıma göre artık hoşçakalın 🙂

Yorumlar
  1. SnipeR95 diyor ki:

    Çok Güzel Bi Paylaşım Olmuş Tebrikler.. 😀

  2. Meraklı diyor ki:

    Üstad ilk kodda hata var.

  3. yasirkula diyor ki:

    fce Facebook’sa yns43 yazınca sonuç alamadım :S Sorununuzu burada belirtirseniz de yardımcı olabilirim 🙂

  4. rustem diyor ki:

    LÜTFEN BANA ULAŞIRMISIN SKYPE FELAN ANLATIRSIN İMEİL rustemov.rustem@hotmail.com Yazdiklarindan hic bi sey analamadim OYUNUN HAZIR HALI SENDE VARMI?

  5. Pelin diyor ki:

    Androiddede kullanilabilirmi bu kod?

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s