Satranç At Pozisyon Kontrol Algoritması - Programlama Dilinden Bağımsız Resimli Anlatım

Algoritmanın mantığını programlama dilinden bağımsız olarak anlatacağım ancak benim Java ile nasıl çözdüğümü görmek isterseniz bu sayfanın en altında paylaşacağım.

Algoritmanın Açıklaması

Algoritmamız 8x8 'lik klasik ve tamamen boş bir satranç tahtası üzerinde gelişecek. Algoritmaya atı koyduğumuz konumun noktalarını vereceğiz ve algoritma bu konumda atın kaç farklı noktaya hareket edebileceğini bulmaya çalışacak. Örnek olarak ben atımı "1, 1" konumuna koyarsam algoritma bana 2 farklı noktaya ilerleyebileceğimi söylemeli, bunlar "2, 3" ve "3, 2" noktaları olur.

Algoritmanın Resimli Açıklaması

Gelin şimdi algoritmaya neden klasik satranç tahtasındaki gibi a, b, c gibi harfler değil de sağ taraftaki gibi her tarafına 1 den 8 'e kadar rakamlar verdiğimizi anlamaya çalışalım.

Bunun için bize bir koordinat düzlemi gerekiyor.


Şimdi satranç tahtamız üzerinde atımızı ilerletebileceğimiz maksimum noktanın olduğu bir pozisyona yerleştirelim ve bu koordinat düzleminin sıfır noktasını da atımızın üzerine yerleştirelim.


Burada gördüğümüz şeyleri iki maddede inceleyelim;
  1. Atımız "4, 5" noktasındayken en fazla 8 farklı noktaya hareket edebiliyor, bu da bir atın satranç tahtası üzerinde hareket edebileceği maksimum hareket alanıdır.
  2. Koordinat düzleminin X ve Y eksenlerine bakacak olursak; atımızın hareket edeceği tüm alanlar, hem X ekseninde hem de Y ekseninde -2 ile +2 arasında kalıyor.
Örnek olarak; atımız yukarıdaki "4, 5" konumundayken algoritmamız 1 numaralı "2, 6" noktasına nasıl gidebilir diye düşünelim.
  • atımızın durduğu ilk X noktası nedir: "4"
  • 4-2 = 2 noktası satranç tahtası üzerinde mi? Evet (1 ile 8 arasında)
  • atımızın durduğu ilk Y noktası nedir: "5"
  • 5+1 = 6 noktası satranç tahrası üzerinde mi? Evet (1 ile 8 arasında)
  • son oluşan pozisyon "2, 6" olur o da 1 numaralı pozisyondur.
Lütfen bu örneği dikkatlice inceleyin ve diğer pozisyonlar için de kendiniz düşünün.

Gelin bir de atımızın tahtanın kenarda olduğu bir pozisyonda resimli inceleme yapalım.


Bir şey hemen dikkatinizi çekmiş olması lazım. Koordinat düzlemimiz satranç tahtasının dışına taştı. Bu da demek oluyor ki atımızın hareket edemeyeceği noktaları bu sayede bulabileceğiz.

Bu sefer atımız "1, 1" pozisyonunda. Örnek olarak tekrar 1 numaralı noktaya ilerlemeye çalışalım. Bakalım ne olacak.
  • atımızın durduğu ilk X noktası: "1"
  • 1-2 = -1 noktası satranç tahtası üzerinde mi? Hayır (1 ile 8 arasında değil)
  • atımızın durduğu ilk Y noktası: "1"
  • 1+1 = 2 noktası satranç tahtası üzerinde mi? Evet (1 ile 8 arasında)
  • son oluşan pozisyon "-1, 2" olur o da 1 numaralı pozisyondur. Ama...
Burası çok önemli;
Artık şöyle bir çıkarımı rahatlıkla yapabiliriz. Eğerki X veya Y noktalarından herhangi biri 1 ile 8 arasına denk gelmiyorsa o noktanın bulunduğu pozisyon satranç tahtası üzerinde değildir.

Sonuç

  • Klavyeden bir konum noktası alırız.
  • Kurduğumuz algoritma dışarıdan aldığı ilk konumları her zaman saklar.
  • Algoritmamız aldığı konumun X ve Y eksenlerini yukarıda anlatılan 8 pozisyon için teker teker inceler ve çıkarttığı noktaları kontrol eder,
  • Eğer ki hem X hem de Y için çıkan noktalar 1 ile 8 arasındaysa atın ilerleyebileceği bir pozisyon bulunmuştur,
  • Eğer ki X veya Y için çıkan nokta 1 ile 8 arasında değilse o pozisyon yok sayılabilir.

Algoritmanın Java ile Kodlanması

Ben bu algoritma sorusuyla ilk karşılaştığımda çözememiştim. Çözüm yolunu ve farklı bakış açılarını patika.dev bootcamp hızlandırma programının code review etkinliğinde öğrenmiştim. Ardından kendimce en iyi çözüm yolunu bulmaya çalıştım, ancak sizler de yukarıda değindiğimiz şeyler sonucunda farklı çözüm yolları üretebilirsiniz. Benim çözüm yolum bu oldu;

public class KnightJumpsApp {
    public static int knightJumps(String str) {
        int count = 0;
        int x = str.charAt(1) - '0';
        int y = str.charAt(3) - '0';
        int newX, newY;

		
        /*
          Yukarıda da değindiğimiz gibi toplam 8 pozisyon var ve bir atın ilerleyebileceği tüm pozisyonlar, 
          -2 ile +2 arasındadır. Koordinat düzlemindeki ilerlenebilecek noktaları bir diziye atarsak şöyle bir dizi
          elde ederiz. 
        */
        
        int[][] allPositionsOfKnight = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1}};

		
        // yeni pozisyonların yukarıdaki dizinin elemanları ile oluşturulup kontrol edilmesini şu şekilde sağlayabiliriz;
        for (int i = 0; i < allPositionsOfKnight.length; i++) {
            newX = x + allPositionsOfKnight[i][0]; // ilk X noktasına göre yeni X noktasının diznin i. indisiyle oluşturulması
            newY = y + allPositionsOfKnight[i][1]; // ilk Y noktasına göre yeni Y noktasının diznin i. indisiyle oluşturulması
            if (newX > 0 && newX < 9 && newY > 0 && newY < 9) { // yeni oluşan değerlerin 1-8 arasında olup olmama kontrolü
                System.out.println("(" + newX + " " + newY + ")"); // gidilebilecek pozisyonun X ve Y noktaları
                count++; // gidilebilecek toplam pozisyonun sayılması
            }
        }

        return count;
    }

    public static void main(String[] args) {
    	
    	// Test işlemleri
    	
        System.out.println("1) 2 = " + knightJumps("(1 1)"));
        System.out.println("2) 8 = " + knightJumps("(5 5)"));
        System.out.println("3) 3 = " + knightJumps("(2 8)"));
    }
}

Konun ile ilgili görüşlerinizi aşağıdaki yorum kutusundan iletebilirsiniz. Sevgiler.

Yorumlar