Yazan : Şadi Evren ŞEKER

Gelen bir soru üzerine aşağıdaki yazıyı yazıyorum. Soru şu şekilde:

“Konsol programında rastgele zar atan ve çıkan zarı ekrana bastıran kodu yazınız. “

Konsol ekranında zar çizdirmek için öncelikle bir tasarım yapmamız gerekiyor. Konsol ekranında sadece ascii karakterlerini basabileceğimizi düşünürsek, zarları aşağıdaki şekilde ascii ekranda göstermemiz mümkün olabilir.


Yukarıdaki her 3 satırda bir zar resmi olduğunu düşünelim. Örneğin zar ile 4 atıldığında 10 -12 satırlar arasındaki karakterler ekrana basılacak olsun.

Şimdi java ile rast gele sayı üretme işi ile ilgilenebiliriz. Bunun için java dilinde bulunan Math.random() fonksiyonunu kullanmamız gerekiyor.

Öncelikle zarları yukarıdaki şekillerde basacak bir program yerine zarın sonucunu doğrudan sayı olarak ekrana basan bir kod yazmaya çalışalım:

İlk denememizde Math.random() fonksiyonunu çalıştırmaya çalışıyor ve aşağıdaki hatalı kodu yazıyoruz:


Yukarıdaki kodu çalıştırdığımızda doğal olarak aşağıdaki hatayı alıyoruz:


Görüldüğü üzere bize Math.random() fonksiyonunun bir double değeri döndürdüğü ve bir int değerinin içerisine konulamayacağı hatası geliyor. Gerçekten de ilgili java API’si okunduğunda Maht.random() fonksiyonunun 0 ile 1 arasında bir sayı döndürdüğü görülebilir.

Zar değerimiz 1 ile 6 arasında olacağına göre (0 yok 1den başlayacağız), rastgele sayımızı 5 ile çarpıp 1 ekliyoruz.

Bu durum ilk kez rast gele sayılar ile uğraşırken karışık görülebilir ancak şöyle anlatmaya çalışalım

0 < a <1

Aralığında olan a sayısı (ki bu değer aslında Math.random() fonksiyonunun orijinal olarak ürettiği değerdir)

a * 5 yapıldığında:

0 < a < 5

Aralığında olur. a+1 yapıldığında da

1 < a < 6

Aralığında olmuş olur.

Elbette bu değer aralığına getirdikten sonra da Math.random() fonksiyonu hâlâ double değer üretmektedir. Çözüm olarak tip inkılabı yapmak (type casting) ve tipini int değerine çevirmek gerekir. Öyleyse ilgili satır aşağıdaki şekle çevrilmelidir:

int z = (int) Math.random() * 5 + 1

Kodun çalışan hali ise aşağıda verilmiştir:


Kodda dikkat edilirse 4. Satırda Math.random()*5+1 ibaresi parantez içerisine alınmıştır. Bunun sebebi başta bulunan ve tip inkılabı yapan (int) komutunun önce Math.random değerini int yapmasıdır. Dolayısıyla sonuçlar her zaman için 1 çıkacaktır (Math.random her zaman 0 ile 1 arasında değer üretecek, int çevriminden 0 olacak 5 ile çarpılıp 1 eklenince de hep 1 sonucu çıkacaktır)

Kodun çalışan hali aşağıdaki şekildedir:


Son olarak çizimi yaptıran kısma geçebiliriz. Çıkan sonuca göre ekrana farklı bir değer bastırmamız gerekiyor.

Kodu aşağıdaki şekilde yazabiliriz:


Kodun çalışan hali aşağıda verilmiştir:


Yukarıdaki kod, hedefimize ulaşmamızı sağlamasına karşılık kodda ufak bir değişiklik yapmamız mümkündür. Kodda 9×9 bir matris üzerinde * karakteri ile kodlama yaptığımıza dikkat etmişsinizdir. Bu değerlerin basıldığı durumları gösterecek olursak:

>=2 Hiçbir zaman >=4
=6 Zar tek sayı ise =6
>=4 Hiçbir zaman >=2

Görüldüğü üzere zar değerine bağlı olarak bazı karelerde * sembolü olmakta ve bazılarında olmamaktadır. Dolayısıyla kodu aşağıdaki şekilde yazmak da mümkün olabilir:


Kodun çalışması sonucu aşağıda verilmiştir:



Yorumlar

  1. oguz

    hocam bu örnegın tamamen aynısını hoca flash cs4 te yapmamızı istyr patesi gününe kadar son..ne kadar tesadüf ya..

  2. Fatih

    Hocam merhabalar bir soru sormak icin rahatsız etmiştim sizi,Bir fonksiyonumuz olsun ve parametre olarak zarSayisi alsin ve bu fonksiyon zar sayısına gore olası tum sonucları(zarların permutasyonunu ekrana bassın).ornegin zar sayısı 2 ise asagıdaki gibi sonuc elde etsin.

    Cıktı : 11 12 13 14 15 16 21 22 23 24 25 26 31 32 33 34 35 36 41 42 43 44 45 46 51 52 53 54 55 56 61 62 63 64 65 66.

    zarSayisi 3 ise aşagıdaki gibi

    Cıktı: 111 112 113 114 115 116 121 122 123 124 125 126 211 212… seklinde

    Hocam bu düz mantık ile kac zar sayısı varsa okadar ic ice dongu kurarak cozulebilir diye dusunmustum

    mesela 3 zar var ise
    for(i=1;i<=6;i++) for(j=1;j<=6;j++) for(k=1;k<=6;k++) printf("%d%d%d",i,j,k); Boyle dogru buluyor ancak 5,6,7 hatta 8 adet zar olursa butun durumlar icin ayrı dongu kurmakta sacma olacak.Isin icinden cıkamadıgım icin size sormak istedim hocam.Bunun bir matamatiksel denklemi varmı acaba veya optimum bir sonucu varmıdır ? Umarım anlatabilmişimdir derdimi hocam yardımınızı bekliyorum 🙁

Fatih için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir