Bir Console Uygulamasında Timer: Karlar düşer düşer…

Bu yazımda Google’dan bulduğumuz bir timer kodu ile console ekranında aşağıya doğru düşen * karakteri uygulaması yazılacaktır.

Google’da arama: Google uygun kelimelerle arama yaptığımızda genelde ilk sonuçta cevapla karşılaşabiliriz. Hatta yazılımcıların cevaplarını paylaştığı forum sitesi stackoverflow.com karşımıza çıkabilir. Bu durumda biraz İngilizce biraz kod okuma yeteneği ile uygun cevabı bulmamız kaçınılmazdır. Google “Console C# Timer” yazdığımızda ilk sonuç (stackoverflow’dan) ve biraz forumu okuyunca sonlara doğru bir kod tam işime yarar diye düşünüyorum. (Hatta bazen sondan başlarım okuma, bazen de okumam sadece kodlara bakıp hangisi uygun diye bulmaya çalışırım. Bende hayatımda aşağıdaki kodtaki TimerCallBack ile ilk defa karşılaşıyorum.) Aşağıdaki kodu seçtim ve kendi uygulamamı bu kod üzerine inşa etmeye karar verdim.

Yukarıdaki kod içine açıklamaları yazdım. Sadece koda bakarak kodun çalışma mantığını çözmeye çalıştım.
 
Yazılım tarafını düşünme:
Birden fazla düşme olacağına göre bu düşmelerin koordinatlarını tutacağımız bir dizi kullanabiliriz. Derslerimde anlattığım List kullanılabilir. (Nesneye Yönelik hiç bir yaklaşım kullanmayacağım, olsa çok güzel bir sınıf tasarlanabilirdi.) X ve Y koordinatları olduğuna göre iki list kullanılabilir.
 

Tekrar fonksiyonu bir saniyede bir kez çalışıyor. 3 fonksiyon çağrılıyor. “kartanesiYarat” fonksiyonu x ve y koordinatlarında oluşur ve l_x / l_y eklenir. Bir saniye içinde sadece 1 kar tanesi oluşuyor. Bir for döngüsü ile birden fazla oluşturulabilir. Hatta random bir fonksiyonla ve for döngüsü ile rastgele sayıda kar tanesi oluşturulabilir. Hatta belli bir zaman belirlenir ve kar sayısı zamanla arttırılabilir. Tasarım size kalmış.
“kartaneleriBirAsagiIndir_Goster” kar tanesini bir aşağı indirir. Bu fonksiyon sadece y koordinatında 1 aşağıya indirir, kısacası rüzgar yok, rüzgar olsa rüzgar şiddetine göre kar taneleri sağa sola gidebilir.
“gereksizkartanelerinitemizle()” gereksiz kar tanelerini temizliyor. RemoveAt işlemi index sildiği için for döngüsü yerine while döngüsü kulandım. 
Kodu çalıştırıp test ettim bir sorun yok gibi ufak buglar olabilir. Örneğin şimdi aklıma geldi: Bu kodda ekranın tüm koordinatları her seferinde yazdırıldı. İşin kolayına kaçıldı. Ama bir fonksiyon yazılacak mevcut  koordinatlara sadece boş bir write işlemi yazılabilir ve Console.Clear’e hiç gerek kalmazdı. Çok daha performanslı olabilirdi. Bende bu ortama yeni alışıyorum:)
 
Tavsiye: Kod dünyasında dünyayı yeniden keşfetmeye çalışmayın. Birçok çözüm internette var. Önemli olan doğru kodu bulmak, anlamak ve kendi yapımızı tasarlamak. 
 
Bol kodlu günler. İyi çalışmalar…

Proje linki: Oyun.zip (63,82 kb)(Oyun ve kar projesi birlikte, Set as Startup Project diyerek değiştirebilirsiniz.)