Basit görünen ancak kurgusu bazen yeni programcıları zorlayan bir algoritmaya sahiptir sayı tahmin oyunları. Bu tür programlar üzerinde oyuncunun kaçıncı tahmininde sayıyı bulduğu, sınırlı sayıda hak tanınması ve her tahminden sonra tavsiye edilen aralığın daraltılması gibi çok çeşitli değişiklikler yapılabilir. Böylesi durumlarda en iyi yol önce algoritmayı en genel haliyle ele almak ve can alıcı noktaları algoritma üzerinde düşünerek yavaş yavaş gerçekleştirmektir.
Random Sınıfından Türetilen rastgele Nesnesi
Öncelikle rastgele sayının nasıl üretileceği üzerinde durmak bu algoritma için gereklidir. Rastgele sayı üretme işlemi Random sınıfı aracılığıyla gerçekleştirilecekir. Random sınıfından türetilen rastgele nesnesi üzerinden Next() metod çağrısı ve gerekli parametrelerin gönderilmesi ile integer tipinde rastgele bir sayı üretilebilir. Next() metodu, gönderilen parametrelere bağlı olarak pozitif veya negatif bir tamsayı üretecektir.
Next() metodunun overload metodlarından birisi tek bir tamsayı değeri alırken bir diğeri de iki tam sayı değeri alabilir. Aşağıdaki örnekleri incelersek;
rastgele.Next(100); kodu ile 0 ile 99 aralığında bir tamsayı üretilir. İki parametre girildiğinde, yani rastgele.Next(20,100); gibi bir kullanımda ise 20 ile 99 aralığında bir sayı üretilir. Örneklerden de anlaşılacağı üzere Next() metoduna iki parametre gönderildiğinde ilk gönderilen parametre (20) küçük sayı kabul edilerek aralığa dahil edilirken ikinci gönderilen parametre (100) aralığa dahil değildir. Bu işlem sonucunda üretilen en büyük sayı 99 olacaktır.
Görüldüğü gibiNext() sanki yalnızca pozitif sayı üretiyormuş gibi görülebilir. Ancak bu metod rastgele.Next(-50,50); gibi bir şekilde kullanılırsa negatif sayılar kümesi de üretilen sayılara dahil edilebilir, sayı üretim aralığı ise [-50, 50) aralığında olacaktır.
Bu kadar laf kalabalığından sonra 0-100 aralığında rastgele sayı üretmek için kısaca aşağıdaki kodu yazabiliriz: :))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using System; using System.Text; namespace SayiTahmin { class Program { static Random rastgele = new Random(); static void Main(string[] args) { int sayi = rastgele.Next(100); } } } |
C# console uygulamalarında ana metodumuz olan Main() metodu içinde tutulan sayıya göre kullanıcıdan DAHA BÜYÜK veya DAHA KÜÇÜK sayı isteyerek yönlendirme yapan kod aşağıdaki gibidir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | using System; using System.Text; namespace SayiTahmin { class Program { static Random rastgele = new Random(); static void Main(string[] args) { int tahmin, sayi = rastgele.Next(100); while (true) { Console.Write("SAYI GİRİNİZ: "); tahmin = Convert.ToInt32(Console.ReadLine()); if (tahmin > sayi) { Console.WriteLine("Daha KÜÇÜK bir sayı giriniz."); } else if (tahmin < sayi) { Console.WriteLine("Daha BÜYÜK bir sayı giriniz."); } else { Console.WriteLine("TEBRİKLER!"); } } } } } |
Yukarıdaki kod bloğunda int tahmin, sayi = rastgele.Next(100); şeklindeki kullanımı ilk defa görüyor olabilirsiniz. Burada integer tipinde tahmin ve sayi adında iki değişken oluşturulmuştur. sayi değişkenine rastgele nesnesi Next() metodu sayesinde rastgele bir sayı atanmıştır. 19-30. satırlar aralığında kullanıcıya sayıyı bulmasını kolaylaştıracak yönlendirmeler yapılmakta, eğer sayıyı bulabilirse kullanıcı kutlanmaktadır.
Eğer kullanıcıya sınırlı sayıda hak tanınarak sayıyı bulması istenirse aşağıdaki program kodlarından yararlanılabilir. Burada hak olarak tanımlanan değişkene verilen değer ile kullanıcıya 5 hak verilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | using System; using System.Text; namespace SayiTahmin { class Program { static Random rastgele = new Random(); static void Main(string[] args) { int tahmin, sayi = rastgele.Next(100); int hak = 5; while (true) { Console.WriteLine("\n\n" + hak-- + " hakkınız var."); if (hak < 0) { Console.WriteLine("KAYBETTİNİZ!"); break; } Console.Write("SAYI GİRİNİZ: "); tahmin = Convert.ToInt32(Console.ReadLine()); if (tahmin > sayi) { Console.WriteLine("Daha KÜÇÜK bir sayı giriniz."); } else if (tahmin < sayi) { Console.WriteLine("Daha BÜYÜK bir sayı giriniz."); } else { Console.WriteLine("TEBRİKLER!"); } } } } } |
Daha çok kullanıcı dostu bir program yazmak istiyorsak, kullanıcının her tahmininden sonra “25 – 50 aralığında bir sayı giriniz” şeklinde bilgilendirme mesajları ile aralığın giderek daraltılması ve daha eğlenceli bir hale getirilmesi isteniyorsa aşağıdaki program kodları kullanılabilir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | using System; using System.Text; namespace SayiTahmin { class Program { static Random rastgele = new Random(); static void Main(string[] args) { int enKucuk = 0, enBuyuk = 100; int tahmin, sayi = rastgele.Next(enBuyuk); int hak = 5; while (true) { Console.WriteLine("\n\n" + hak-- + " hakkınız var."); if (hak < 0) { Console.WriteLine("KAYBETTİNİZ! Tutulan sayı: " + sayi); break; } Console.Write(enKucuk + " ile " + enBuyuk + " ARASI BİR SAYI GİRİNİZ: "); tahmin = Convert.ToInt32(Console.ReadLine()); if (tahmin > sayi) { if (tahmin < enBuyuk) { enBuyuk = tahmin; } } else if (tahmin < sayi) { if (tahmin > enKucuk) { enKucuk = tahmin; } } else { Console.WriteLine("TEBRİKLER!"); break; } } Console.ReadKey(); } } } |
Yukarıdaki programın örnek ekran çıktısının aşağıdaki gibi olması beklenmektedir: