KABAFORCEGeliştirici KabaOS'u edinin

Algoritmalar · 144 satır

Yol bulma

Genişlik öncelikli arama: labirentte dalga yayılır, en kısa yol geri izlenir.

Önizleme · 0.6.0 — dil 1.0 öncesidir; sözdizimi ve kütüphane değişebilir. Buradaki her örnek derlenerek sınanır.

Çalıştırın

Uçbirim
kabalang calistir 05_yol_bulma.kbl

Kaynak kod

05_yol_bulma.kbl
# ╔═══════════════════════════════════════════════════════════════════╗
# ║  YOL BULMA — Genişlik Öncelikli Arama (BFS)                       ║
# ║  Dalga başlangıçtan yayılır, hedefe varınca yol geri izlenir.     ║
# ║  Dalga mavi, bulunan yol sarı, duvarlar koyu.                     ║
# ╚═══════════════════════════════════════════════════════════════════╝
kullan kaba.sistem

EN = 21
BOY = 11

fonksiyon renkli(yazi: metin, renk: sayi):
    don "\033[38;5;" + metin(renk) + "m" + yazi + "\033[0m"

fonksiyon ekrani_temizle():
    yazdir("\033[H\033[2J")

# Izgara tek boyutlu listede tutulur: (satir * EN + sutun)
fonksiyon haritayi_ciz(duvar, uzaklik, yol, baslik_yazi: metin, ziyaret: sayi):
    ekrani_temizle()
    yazdir("")
    yazdir(renkli("   " + baslik_yazi, 81))
    yazdir(renkli("   " + "─".tekrarla(EN * 2 + 2), 238))
    y = 0
    iken y < BOY:
        satir = "   "
        x = 0
        iken x < EN:
            k = y * EN + x
            eger duvar[k] == 1:
                satir = satir + renkli("██", 236)
            degilse:
                eger yol[k] == 1:
                    satir = satir + renkli("▓▓", 220)
                degilse:
                    eger uzaklik[k] >= 0:
                        satir = satir + renkli("░░", 74)
                    degilse:
                        satir = satir + "  "
            x = x + 1
        yazdir(satir)
        y = y + 1
    yazdir(renkli("   " + "─".tekrarla(EN * 2 + 2), 238))
    yazdir(renkli("   ziyaret edilen hücre: " + metin(ziyaret), 245))
    uyu(90)

# ── Harita ────────────────────────────────────────────────────────────
duvar = []
uzaklik = []
yol = []
i = 0
iken i < EN * BOY:
    duvar.ekle(0)
    uzaklik.ekle(0 - 1)
    yol.ekle(0)
    i = i + 1

# Kenarlar ve rastgele engeller
i = 0
iken i < EN * BOY:
    y = i // EN
    x = i - y * EN
    eger y == 0:
        duvar[i] = 1
    eger y == BOY - 1:
        duvar[i] = 1
    eger x == 0:
        duvar[i] = 1
    eger x == EN - 1:
        duvar[i] = 1
    eger duvar[i] == 0:
        eger rastgele.sayi(1, 100) <= 26:
            duvar[i] = 1
    i = i + 1

baslangic = 1 * EN + 1
hedef =(BOY - 2) * EN +(EN - 2)
duvar[baslangic] = 0
duvar[hedef] = 0

# ── BFS: dalga yayılımı ───────────────────────────────────────────────
# Sıra (kuyruk) ile en yakın hücreler önce işlenir; bu yüzden ilk
# ulaşılan yol EN KISA yoldur.
kuyruk = []
kuyruk.ekle(baslangic)
uzaklik[baslangic] = 0
ziyaret = 1
bas = 0
varildi = yanlis

iken bas < kuyruk.uzunluk():
    su_an = kuyruk[bas]
    bas = bas + 1
    eger su_an == hedef:
        varildi = dogru
        bas = kuyruk.uzunluk()
    degilse:
        y = su_an // EN
        x = su_an - y * EN
        komsular = []
        komsular.ekle((y - 1) * EN + x)
        komsular.ekle((y + 1) * EN + x)
        komsular.ekle(y * EN + x - 1)
        komsular.ekle(y * EN + x + 1)
        dongu k icinde komsular:
            eger k >= 0:
                eger k < EN * BOY:
                    eger duvar[k] == 0:
                        eger uzaklik[k] < 0:
                            uzaklik[k] = uzaklik[su_an] + 1
                            kuyruk.ekle(k)
                            ziyaret = ziyaret + 1
        eger ziyaret > 0:
            haritayi_ciz(duvar, uzaklik, yol, "DALGA YAYILIYOR (BFS)", ziyaret)

# ── Yolu geri izle ────────────────────────────────────────────────────
eger varildi == dogru:
    su_an = hedef
    iken su_an != baslangic:
        yol[su_an] = 1
        y = su_an // EN
        x = su_an - y * EN
        en_iyi = su_an
        adaylar = []
        adaylar.ekle((y - 1) * EN + x)
        adaylar.ekle((y + 1) * EN + x)
        adaylar.ekle(y * EN + x - 1)
        adaylar.ekle(y * EN + x + 1)
        dongu k icinde adaylar:
            eger k >= 0:
                eger k < EN * BOY:
                    eger uzaklik[k] >= 0:
                        eger uzaklik[k] == uzaklik[su_an] - 1:
                            en_iyi = k
        su_an = en_iyi
        haritayi_ciz(duvar, uzaklik, yol, "YOL GERİ İZLENİYOR", ziyaret)
    yol[baslangic] = 1
    haritayi_ciz(duvar, uzaklik, yol, "EN KISA YOL BULUNDU", ziyaret)
    yazdir("")
    yazdir(renkli("   ✓ Hedefe " + metin(uzaklik[hedef]) + " adımda ulaşıldı; " + metin(ziyaret) + " hücre tarandı.", 78))
degilse:
    haritayi_ciz(duvar, uzaklik, yol, "HEDEFE ULAŞILAMADI", ziyaret)
    yazdir("")
    yazdir(renkli("   ✗ Engeller hedefi kapattı — BFS bütün erişilebilir hücreleri taradı.", 203))
yazdir("")