Oyun kodlayan ya da kodlama işine sırf oyun yazabilmek için girmiş programcıların en çok sevdiği kütüphaneyi inceliyoruz, rand() / srand() rasgele sayı üretme fonksiyonlarıyla birlikte!
Stdlib.h Kütüphanesi
Bu kütüphanede yine matematiksel işlemler için kullanılmaktadır ancak kütüphanesi math.h dan farklıdır.Bu kısımda göreceğimiz fonksiyonları kullanabilmek için stdlib.h kütüphanesini programınıza #include<stdlib> şeklinde entegre etmeniz gerekmektedir.
ABS() Fonksiyonu
Absolute kelimesinin kısaltılmışı olan bu fonksiyon aynı İngilizce anlamı gibi mutlak değer anlamına gelmektedir. Daha önceki makalemde Fabs() fonksiyonundan bahsetmiştim şimdide abs fonksiyonununda aynı işlevi gördüğünden bahsediyorum arada tek bir fark diğer makalemde double türünde değer alıp vermeniz gerektiğini söylemiştim bu fonksiyonda ise int türünde değer alıp vermeniz gerekmektedir. Kısaca aradaki tek fark parametre değerlerinin farkıdır...
RAND() Fonksiyonu
Rand() fonksiyonu özellikle oyun türü simülasyonlarda rasgele sayı üretmek için bol bol kullanılan ve çok da sevilen bir fonksiyondur çünkü şöyle bir düşündüğümüzde hemen hemen bütün oyunlarda ihtiyaç duyulur ve bu fonksiyonun en güzel özelliği belirli bir aralıkta tutabilmemizdir sonucu. Bir tavla oyununda mesela zar en fazla 6 gelebilir böyle bir durumda sonucu sınırlayabilmek bize büyük avantaj kazandırır.RAND() fonksiyonu İngilizce random yani rasgele kelimesinden gelmektedir. Rand() fonksiyonunda integer deger döndürüp hiçbir parametre almamsına dikkat etmeliyiz. Daha önce kullandıgımız fonksiyonlarda () kısmına hangi sayı için işlem yapıyorsak onu alıyorduk ama artık rand() fonksiyonu için bir şey yazmayacağız. Birkaç örnekle devam edelim..
#include<stdio.h>
#include<stdlib.h>
int sayisal();
int main()
{ int x;
do{
printf("Bu Haftanin Sansli Sayilari Siralamak icin 1 e basin";
scanf("%d",&x);
}while(x!=1);
sayisal();
getchar();getchar();
return 0;
}
int sayisal()
{
int i,a;
for(i=0;i<6;++i)
{
a = (rand()%49)+1;
printf("Bu haftanin sansli %d. rakami: %d \n",i+1,a);
}
}
şimdi burada kodlara biraz göz atarsak şu noktalara dikkat çekmemiz gerekiyor.
1.si #include<stdlib.h> kütüphanesini kesinlikle entegre ediyoruz.
2.si rand() fonksiyonunu int olarak aldık ama parametre kısmı boş yani void olmalı biz void yazmayıp boş bırakmayı tercih ettik.
3.sü rand() fonksiyonunu 49 tane rakam ve 1 den 49 a kadar olması için mod yöntemini kullandık ve 0 dan değil de 1 den başlasın diye 1 ekledik...
Ve çok önemli bir açık var programımızda çok şanlı iseniz programın bazen aynı sayıyı tekrar ürettiğini göreceksiniz ee sayısal lotoda aynı sayıyı 2 kez yazamayacağınıza göre bunu engellemek için bir kısım daha yazmalısınız.. Bunu 2 şekilde yapabilirsiniz. Ya dizi oluşturup ayrıca dizide birbirine benzeyen varmı kontrol edersiniz yada switch Case yapısı ile 6 farklı değişkene her bir üretilen sayıyı atayıp eğer aynı sayıya denk geldiyseniz tekrar başa dönüp yeni bir değer daha bulmasını isteyebilirsiniz.
Şimdi dikkatli kullanıcıyla dikkatsiz kullanıcıyı burada ayırdık sanırım. Aslında 2 kez arka arkaya programı çalıştırırsanız görürsünüz ki program hep aynı sayıyı üretiyor yani 6 sayıda hiç değişmiyor bunun için başka bir fonksiyona geçiyoruz..
SRAND() Fonksiyonu
Bu fonksiyon rand() fonksiyonu ile birlikte çalışır ve bu fonksiyon aldığı değere göre rand() fonksiyonuna bir değer çıkarttırır. Şöyle ki; az önceki programımızın fonksiyon kısmını şöyle değiştirirsek:
#include<stdio.h>
#include<stdlib.h>
int sayisal();
int main()
{ int x;
do{
printf("Bu Haftanin Sansli Sayilari Siralamak icin 1 e basin";
scanf("%d",&x);
}while(x!=1);
sayisal();
getchar();getchar();
return 0;
}
int sayisal()
{
int i,a;
srand(5);
for(i=0;i<6;++i)
{
a = (rand()%49)+1;
printf("Bu haftanin sansli %d. rakami: %d \n",i+1,a);
}
}
Yeni üretilen sayıların farklı olduğunu görürsünüz ancak yine bir sorun var bu seferde srand() fonksiyonu farklı değer almazsa yine hep aynı değer alacaktır.. BU aslında çok büyük bir sorundur ancak çözümüde bir o kadar güzeldir.BU mantığı özenerek anlatmak istiyorum çünkü hemen hemen tüm programlama dillerinde bunun kullanıldığını biliyorum. Hayatımızda sürekli değişen ve hiçbir zaman aynısı olmayacak birşeye ihtiyacımız var değil mi? Çünkü srand() fonksiyonu sürekli yeni değer almalı o zaman ona sürekli değişen bir şey bulmalı derken sağ olsun C 'nin yaratıcıları bize time() fonksiyonunu sunmuş. Evet sürekli değişen şey zamandır ve bunu srand() fonksiyonu için kullanacağız. Neresi ilginç bunun diyen sesler duyuyorum peki bu zaman yani time() fonksiyonun 1 Ocak 1970 tarihinden bu güne kadar olan Saniyelerden herhangi birini seçtiğini söylersem
Bu kadar bilgiden sonra srand() fonksiyonunu zamana göre değiştiren kodu görelim:
degistir = time(NULL);
srand(degistir);
rand()%49+1
İşte bu artık sürekli yeni sayı elde edebiliriz...Az önceki kodumuzu yeni haline göre modifiye edersek. Time.h kütüphanesini eklemeyi unutmayalım.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int sayisal();
int main()
{ int x;
do{
printf("Bu Haftanin Sansli Sayilari Siralamak icin 1 e basin";
scanf("%d",&x);
}while(x!=1);
sayisal();
getchar();getchar();
return 0;
}
int sayisal()
{
int i,a;
int degistir;
degistir=time(NULL);
srand(degistir);
for(i=0;i<6;++i)
{
a = (rand()%49)+1;
printf("Bu haftanin sansli %d. rakami: %d \n",i+1,a);
}
}