Sudoku Oyunu [ C Programlama ]

# Başlarken 

C ile yaptığım oyun serisine geri döndüm :) Bu sefer ki çoğumuzun gazete eklerinden bir aralar bu ne acaba diye kendine sorup çözdüğü, çözmeye çalıştığı sudoku oyunu.Fikrin nerden geldiğini anlatayim hemen : IYTE'den elektronik(umarım yanlış değildir:)) okuyan bir arkadaşa C  konusunda yardımcı oluyordum.Geçmiş yılların soruları var mı diyince, sudokudan bahsetti.Ben de oo kolay diye atıldım hemen.O gün çözmekten vazgeçtik ama bir hafta sonu projesi olarak onu not almıştım.Bu gün uğraştım ve gördüm ki, o sudoku için sayilarin aynı satır veya aynı sütuna gelmemesi olayı sandığım kadar basit değilmiş.Detaylara ve sonuçlara bakalım :

# Sudoku karesi hakkında

Duymamış, görmemiş olanlar için ufak bahsetmek istiyorum. 9x9 luk bir büyük bir karemiz var.Büyük kare içesine aynı satırda ve aynı sutunda 1 ve 9 arasındaki sayılardan aynı sayı tekrar etmeyecek şekilde yerleştirilmesi gerekiyor.Ayrıca büyük kare içerisinde 3x3 luk 9 tane daha kare oluşuyor.Bu karelerin de içerisindeki sayilar 1 ve 9 arasında olacak ve hepsi bir kez kullanılacak.[ Çözülmüş Örnek ]

# Programlama

// Elimizde 9x9luk bir matris var. Bu matrise 1-9 arasindaki sayilari yerleştireceğiz.Ben bu sayıları ilk sütundan başlayıp yerleştirmeyi seçtim.

// Sayı yerleştirirken 3 durumu kontrol etmemiz gerekiyor.O sütunda sayi daha önce kullanılmış mı? Sayinin konulacağı satırda o sayi kullanılmış mı? Bir de o an ki satır ve sütun durumuna göre içerisinde bulunduğumuz karede o sayi kullanılmış mı?

// İlk sütun kontrolunu şu şekilde yaptım : Sayılarımız 1-9 arasında bunları 2x9luk bir matrisin ilk satirina yerleştirdim.İkinci satırda ise seçilen sayının o sütunda kullanılıp kullanılmadığını kontrol edebileceğim 0(kullanılmamis), 1(kullanilmiş) değerleri yer alacak.

// O sayinin yerleştirileceği satırı kontrol etme işini ise bir fonksiyon ile yaptım.Sudoku matrisinin o satirini ve yerleştirilecek sayinin değerini fonksiyona göndererek, gerekli kontroller sonucunda yerleştirip yerleştirilmediğini tespit ettim.

// Zor kısımlardan biri o 9 küçük karecikten hangisinin içinde  sayi yerleştirmeyi yaptığımızı tespit etmek.9 kareciğin satir ve sütun olarak sınırları belli.Bunları 9x4 bir matriste sakladım.Kareciğin tespit işini de iç içe bir sürü if yardımı ile bulmaya çalıştım.

// Kareyi tespit ettikten sonra başka bir fonksiyon ile, sudoku matrisini karenin sınırları dahilinde, rastgele seçilmiş değerin var olup olmadığına kontrol ettim.

// Bu kontrollerin yapilmasi sonucu her sey güzel gidecek gibi görünüyor, ama öyle değil.Bir kaç sütun ilerledikten sonra o an değerlerini yerleştirdiğim sütunda son iki elemanın yerleştirilme kısmı sonsuz döngüye sebep olabilir.Bu konuya örnek veremiyorum ekran görüntüsü almadım çünkü.Ama üstteki kontrollerin tamamını uygulamadığım sırada 3x3luk bir sudoku oluşturmaya çalışıyordum, sorun tespiti için :)

1   2 2   1 3   x

// x olan kısımda program takılır.Bu durumun 9x9 luk matriste daha karmaşık şekilde sonsuz döngüye girdiğine şahit oldum.Bu durumda mesela bir adim geriye gidip 1 seçilen yeri geri alıp oraya rastgele değer olarak 3 gelmesini sağlamaya çalışabiliriz.Ama 9x9luk matriste bu geri gitme işlemi tek geri adımla çözülmeyeceği durumlar oluşabiliyor.Bu yüzden 1,2,3 gibi bir değerdense o an sayi yerleştirmeye çalıştığım sütunda yerleştirilen sayilarin tümünü geri çekip, o sütuna baştan sayi yerleştirmeyi denedim.

// O sonsuz döngüye girme kısmının tespiti için ise şöyle bir yöntem denedim : O an ki döngüde eğer sayiyi 100 kereden fazla yerleştiremediyse döngüden çıkıp o sütuna baştan sayi yerleştirmeye başlıyorum.

// Oyun şeklinde yaptım, ama önemli olan o sudoku matrisini oluşturmak o yüzden diğer kısımları kod üzerinde inceleyebilirsiniz.

# Kodlama

Kaynak kod içerisinde de ingilizce, türkçe açıklamalar var.

Kullanılan C dili yapıları - Pointer - Çok  boyutlu diziler(array) - Fonksiyonlar(functions) - Dinamik bellek alikasyonu(dinamic memory allocation) - if-else - Switch-case - For-while

# Kaynak Kod

Dropbox : http://dl.dropbox.com/u/44525056/sudoku.c

GitHub : https://gist.github.com/4190976

# Ekran Görüntüleri 

sudoku-1sudoku-2

# Yapılabilecekler

// Küçük karelerin tespiti ve kontrolu için daha farklı,etkili bir çözüm bulunabilir.

// Oyuncu "Sayi Sil" seçeneğini seçip, kullanıcıya başta verilen değerleri silmesi engellenebilir.

// Başta verilen değerler, kullanıcının sudokuyu çözmesi için yeterli değildir.Çok fazla rastgele seçiliyorlar.O kısım biraz daha düzenlenebilir.Bulmaca eklerindeki sudokular benzetilebilir.

// Sudoku oluşturulduktan sonra kullanıcı kolay,orta,zor seçenekleri sunulup, seçtiği zorluk derecesine göre önceden kullanıcıya sunulan sudoku içerisindeki değerlerin durumu düzenlenebilir.

Her türlü eleştiri ve kullanıma açıktır.

İyi kodlamalar.

Comments

comments powered by Disqus