Mayın Tarlası [C Programlama]

# Başlarken

IYTE'de genetik okuyan bir arkadaşım dedi ki : "Bizim burdaki arkadaşlara mayın tarlası ödevi vermişler" . Ben de dedim ben niye yapmayayım.Fikir o şekilde ortaya çıktı.Ancak durum şu ki sonradan ödevin pdf'ini alıyorum. Ödevde istenen şey: bir matrix[mayın tarlası] oluşturup rastgele 0 ve 1[mayın] ler  yerleştirip birbirine komşu olmayan 1'lerin [mayınların] sayısını bulmak.Verilen ödevin gerçek mayın tarlası oyunuyla o kadar da ilgisi yok.Ama ben bunu öğrendiğimde oyunun çoğu kısmı tamamlanmıştı.İyiki de öyle oldu :)

# Oyunun Kuralları

Çoğunuz oyunun nasıl oynandığını biliyorsunuzdur; ancak ben oyunun kurallarını oyunu C ile yazmadan önce öğrendim.Bilmeyenler için : Çok sayıda kareden oluşan bir şekil var, bir kare seçiyorsunuz.Eğer mayınlı olanı seçmemişseniz, o karenin komşularından(çevresindeki 8 kare) kaç tanesinde mayın var bilgisini görüyorsunuz.Bazende bir kare açmanıza rağmen birden fazla kare açılıyor.Bu durumda ise açtığınız karenin komşularından hiç birinde mayın yoktur.Bu sebeple o karenin 8 komşusu açılır.Eğer o sekizlinin içerisinde de mayına komşuluğu olmayan kare varsa o da açılır.Bu şekilde tek kare seçmiş olsanız da birden fazla karenin durumunu görmüş olacaksınız.

[Üste anlattıklarımı bunlardan birini inceleyerek daha iyi kavrayabilirsiniz.]

Online Oyun | Android App

# Programlama

* Mayın tarlası dediğimiz şeyin matris olacağı açık.Şimdilik 10x10 düşünelim.

* İçerisine rastgele kareler seçerek 15 tane mayın yerleştireceğiz.(Aynı yere gelmemesine dikkat!)

* Mayın komşuluğunu hesaplamak için her karenin 8 komşusunu incelememiz gerekiyor.Ortaki karelerin 8 komşusu var.Ama kenardaki kareler için 8 tane komşu yok.Bu yüzden matrisimizin etrafına bir set kuralım.Onlarında 8 komşusu olsun diye.Birer satır alta ve üste, birer sütun sağa ve sola.Bu durumda tarlamız 12x12 bir matris oldu.

* Her karenin 8 tane komşusuna ulaşmak için aritmetik işlemler gerekiyor.

matris[i-1][j-1] dediğimiz şey matris[i][j] nin sol üst çaprazdaki komşusudur. matris[i-0][j-1] dediğimiz şey matris[i][j] nin soldaki 3 komşusundan ortadakidir gibi.

{-1,-0,+1,-1,-0,+1,-1,+1}

{-1,-1,-1,+1,+1,+1,-0,-0}

* Üsteki matris bizim arkada sorgulamalar yaparken kullanacağımız kısım, kullanıcıya gosterilecek kısım için ise yeni bir matris oluşturuyoruz.

* Kullanıcının yapabileceği bir kaç işlem/hareket olduğu için bir menüye ihtiyacımız var.

* Matrislerimiz integer saklayacağı için bazı şeyleri belli sayilarla ifade etmemiz gerekecek.(10 sayisinin bayrak(flag) temsil etmesi gibi.)

* Mayın komşuluğu olmayan kareleri açarken, onların içerisinde de mayın komşuluğu olmayan kareler çıkıyordu.Bu durum zaten bu programın en can sıkıcı noktası, (şimdilik) çözümüm şu şekilde : Her sıfır karesiyle karşılaştığımız zaman o karenin satır ve sutun sayısını ard arda olacak şekilde bir diziye ekliyorum.Dizinin neresinde kaldığımı saklayan bir de degisken var.Dizi boyutunun sonuna geldiğinde islem tamamlanmış oluyor.Yeni kareler diziye eklendikçe dizi boyutu artıyor.

* Oyunun tüm kareleri açılmışsa, kullanıcı mayın olan kareyi açtırmışsa, yeni oyuna başlamak istiyorsa oyun biter.

# Kodlama

* Açıklama yapmaya kalkarsam yazı baya uzun olacak.O yüzden gerekli açıklamları kod içerisinde yorum olarak ekledim.

Kullanılan C dili özellikleri : 

* Tek ve çok boyutlu diziler

* Fonksiyonlar

* Pointer

* While, do-while, for, if,  elseif, switch-case

Kaynak Kod : İndirmek için        : http://dl.dropbox.com/u/44525056/mineField.c Online görüntüle : https://gist.github.com/4074767

# Ekran Görüntüleri

# Yapılabilecekler

* Görsel olarak ne kadar uğraşsam da , bu şekilde bu oyunu oynamak çok can sıkıcı ve zor oluyor.

* Sayıları takip etmek, ne olduğunu anlamak zor olabiliyor.Ekrana tarlayı yansıttığım zaman işaretlenmiş mayınlara F(flag) yazdırabiliriz.Sayı yazmaktan daha iyi olacaktır.

* 8 komşuyu açıp onların içinden tekrar açtırma işi üsteki çözümden daha iyi bir çözüm olabilir.

* O çözüm kullanılacaksa bile dinamik bellek yapısı kullanılabilir.Her döngüden sonra sıfırlanabilir.Gerekmeyecek verileri dizide tutmuş oluyoruz.

* Her seçimden sonra tarlayı ekrana alt alta yazdırmamız pek güzel olmuyor.Ekranı sildirip her zaman en üstte tarlanın son halini ve altına menuyu yazdırmamız daha güzel olacaktır.Biraz araştırdım ama etkili, kolay uygulanabilecek bir yöntem bulamadım.

* Mayın tarlasını[matrisi] oluşturduğunda biraz bekleme yapıyor.Bunu çözmek veya kullanıcıyı bilgilendirmek için bir şeyler yazılabilir ekrana.

UPDATE : randNumber() fonksiyonundaki srand(time(NULL)) ifadesini alıp, main fonksiyonunda tanımlamalardan sonraki kısma yazarsak bekleme sorunu çözülecektir.

* Mayınları tutan ve kullanıcıya gösterdiğimiz matrisler aynı boyutta olmak zorunda mı? Kullanıcıya gösterdiğimiz 10x10 boyutunda olabilir.Ama ikisi içinde kullandığım ortak fonksiyonlar var.Oyle yaparak biraz kolaya kaçmış oldum.Düzeltilebilir.

Varsa fikir,eleştiri ve yorumlarınız lütfen paylaşın.

İyi kodlamalar.

Comments

comments powered by Disqus