3 Mart 2025 Pazartesi

Kotlin Sudoku Oyunu Örneği

 Kotlin ile basit bir Sudoku oyunu örneği oluşturabiliriz. Bu örnekte, bir Sudoku tahtası oluşturacak, kullanıcının hücrelere sayı girmesini sağlayacak ve temel doğrulama işlemlerini gerçekleştireceğiz. Bu örnek, Android platformunda çalışacak şekilde tasarlanmıştır.


1. Proje Kurulumu

Öncelikle, build.gradle dosyasına herhangi bir ek bağımlılık eklemenize gerek yok. Temel Android bileşenlerini kullanacağız.


2. Sudoku Tahtası Oluşturma

Sudoku tahtası, 9x9 bir grid olacak. Her hücre, bir TextView veya EditText olarak temsil edilebilir. Bu örnekte, GridLayout kullanarak tahtayı oluşturacağız.

activity_main.xml

xml
Copy
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center">

    <GridLayout
        android:id="@+id/sudokuGrid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:rowCount="9"
        android:columnCount="9"
        android:layout_marginBottom="16dp" />

    <Button
        android:id="@+id/checkButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Check Solution" />

</LinearLayout>

3. Sudoku Tahtasını Programatik Olarak Oluşturma

MainActivity.kt dosyasında, GridLayout'a 9x9 hücre ekleyeceğiz. Her hücre bir EditText olacak ve kullanıcı bu hücrelere sayı girebilecek.

MainActivity.kt

kotlin
Copy
package com.example.sudokugame

import android.os.Bundle
import android.text.InputType
import android.view.Gravity
import android.widget.EditText
import android.widget.GridLayout
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var sudokuGrid: GridLayout
    private val boardSize = 9

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sudokuGrid = findViewById(R.id.sudokuGrid)
        createSudokuBoard()

        findViewById<Button>(R.id.checkButton).setOnClickListener {
            if (checkSolution()) {
                Toast.makeText(this, "Congratulations! You solved the puzzle!", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Incorrect solution. Keep trying!", Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun createSudokuBoard() {
        val cellSize = resources.displayMetrics.widthPixels / boardSize

        for (row in 0 until boardSize) {
            for (col in 0 until boardSize) {
                val editText = EditText(this).apply {
                    layoutParams = GridLayout.LayoutParams().apply {
                        width = cellSize
                        height = cellSize
                        rowSpec = GridLayout.spec(row)
                        columnSpec = GridLayout.spec(col)
                    }
                    inputType = InputType.TYPE_CLASS_NUMBER
                    gravity = Gravity.CENTER
                    setBackgroundResource(R.drawable.cell_border) // Hücre kenarlıkları için
                }
                sudokuGrid.addView(editText)
            }
        }
    }

    private fun checkSolution(): Boolean {
        val board = Array(boardSize) { IntArray(boardSize) }

        for (row in 0 until boardSize) {
            for (col in 0 until boardSize) {
                val cell = sudokuGrid.getChildAt(row * boardSize + col) as EditText
                val number = cell.text.toString().toIntOrNull() ?: 0
                board[row][col] = number
            }
        }

        return isValidSudoku(board)
    }

    private fun isValidSudoku(board: Array<IntArray>): Boolean {
        // Satır kontrolü
        for (row in board) {
            if (row.distinct().size != row.count { it != 0 }) return false
        }

        // Sütun kontrolü
        for (col in 0 until boardSize) {
            val column = mutableListOf<Int>()
            for (row in 0 until boardSize) {
                column.add(board[row][col])
            }
            if (column.distinct().size != column.count { it != 0 }) return false
        }

        // 3x3 blok kontrolü
        for (blockRow in 0 until 3) {
            for (blockCol in 0 until 3) {
                val block = mutableListOf<Int>()
                for (row in 0 until 3) {
                    for (col in 0 until 3) {
                        block.add(board[blockRow * 3 + row][blockCol * 3 + col])
                    }
                }
                if (block.distinct().size != block.count { it != 0 }) return false
            }
        }

        return true
    }
}

4. Hücre Kenarlıkları İçin Drawable Dosyası

Hücrelerin kenarlıklarını belirgin hale getirmek için res/drawable/cell_border.xml dosyasını oluşturun.

xml
Copy
<!-- res/drawable/cell_border.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="1dp"
        android:color="#000000" />
</shape>

5. Uygulamayı Çalıştırma

Uygulamayı çalıştırdığınızda, 9x9 bir Sudoku tahtası göreceksiniz. Kullanıcı hücrelere sayı girebilir ve "Check Solution" butonuna tıklayarak çözümün doğru olup olmadığını kontrol edebilir.


6. Geliştirmeler

Bu örnek, temel bir Sudoku oyunu sağlar. Daha gelişmiş özellikler eklemek için aşağıdaki adımları düşünebilirsiniz:

  1. Sudoku Çözücü: Otomatik olarak Sudoku çözen bir algoritma ekleyebilirsiniz.

  2. Zorluk Seviyeleri: Farklı zorluk seviyelerinde Sudoku bulmacaları oluşturabilirsiniz.

  3. UI İyileştirmeleri: Hücrelere renkler ekleyerek kullanıcı deneyimini artırabilirsiniz.

  4. Yeni Bulmaca: Her oyunda yeni bir Sudoku bulmacası oluşturabilirsiniz.

Bu örnek, Kotlin ve Android kullanarak Sudoku oyunu oluşturmanın temel adımlarını göstermektedir. İhtiyaçlarınıza göre genişletebilir ve özelleştirebilirsiniz.

Hiç yorum yok:

Yorum Gönder