FideLite.Art Golfstack · satranç · bayt

FIDE kurallarına tam uyumlu satranç, 1.208 baytta.

Rok, geçerken alma, terfi, üç ve beş kat tekrar, 50 ve 75 hamle, ölü pozisyon, bayrak düşmesi ve 6.9 istisnası. Bağımlılık yok, derleme adımı yok, DOM gereksinimi yok. Paketlenmiş hâli 1.082 bayt; tıklanabilir tahta, önyüzü dahil 2 KiB'ın dokuz bayt altında.

5d37b3d59999999900000000000000000000000000000000888888884c26a2c4

Başlangıç pozisyonunun tamamı: 64 onaltılık basamak, taş kodu tür*2+renk. Renkli kısımlar kaynakta harfi harfine yazılı; noktalı kısmın 40 karakterini — sekiz dokuz ve otuz iki sıfır — 10n**40n-10n**32n ifadesi çalışma anında üretiyor, o yüzden paketlenmiş dosyanın içinde hiç yer kaplamıyor.

Her karede: adı, taş kodu, glifi ve motorun indeksi. a1 = 0, sol altta; i&7 dosya, i>>3 yatay. numerical sürümünün iki basamaklı notasyonu bu indeksin bir fazlası.

Golfstack

Kodun kendisi, değeri ve Golfstack sanatı

2 KiB'ın altında tek bir HTML dosyasına, turnuva standartlarında eksiksiz bir satranç hakemi sığdırıldı. Golfstack konseptiyle geliştirilen bu proje, kod optimizasyonunun sınırlarını zorlayarak en küçük boyutta en çok işlevi sunmayı hedefleyen bir mühendislik çalışması.

İki oyuncunun aynı cihaz üzerinden karşılıklı oynadığı bu motor, harici hiçbir kütüphaneye ihtiyaç duymadan tam donanımlı bir satranç deneyimi sağlar.

Teknik özellikler

  • Kural kapsamı. Tüm taş hareketleri, şah, mat ve pat kontrolleri eksiksiz. FIDE'nin tek bir maddesi dışında her kural uygulanıyor — aşağıda anlatılan 5.2.2.
  • Gelişmiş hamle mekanizmaları. Piyonun ilk hamlede iki adım ilerlemesi, geçerken alma, rok ve seçimli terfi eksiksiz çalışır.
  • Fischer zaman kontrolü. Altı sürümün beşinde tempo 10 dakika + 5 saniye; her hamlede oyuncunun süresine 5 saniye eklenir. numerical bunun dışında: 15 dakika, artış yok.
  • Beraberlik muhasebesi. Hamle sayacı, pozisyon tekrarı, yetersiz materyal ve karşılıklı anlaşma eksiksiz hesaplanır; iddiaya bağlı olanlarla otomatik olanlar ayrı ayrı.

Ayırt edici özellikler

  • Hakemlik. Terk ve süre bitiminin yetersiz materyalle karşılaştığı senaryolarda karar mekanizması FIDE 5.1.2 ve 6.9'a birebir uyar — Lichess'in de uyguladığı ayrım.
  • Otomatik tahta döndürme. Hamleden sonra tahta sıradaki oyuncunun perspektifine döner. Tahta gösteren üç sürümde geçerli: dom, input ve prompt.
  • Kapsamlı sonuç bildirimi. Mat, süre bitimi ve tüm beraberlik türlerini kapsayan on beş ayrı sonuç kodu; hangisinin neden geldiği belirsiz kalmaz.
  • Hata toleransı. Yanlış girdi motoru çökertmez, oyunu kilitlemez; sistem geçerli bir girdi alana kadar sormaya devam eder. Notasyonu doğru ama terfi harfi geçersiz bir girişte taş otomatik vezire terfi eder.

Motor geliştirme aşamasında uç durumlar dahil binlerce kez sınandı ve bilinen hataların tamamı ayıklandı. Yine de oyun sırasında gözünüze çarpan bir şey olursa bildirin; geri bildirim motoru doğrudan iyileştirir.

Doğrulama

Geçtiği testler

Motorun kural iddiaları perft ile sınandı: bir pozisyondan belirli bir derinliğe kadar üretilen geçerli hamle dizilerinin sayısı, yayımlanmış referans değerlerle karşılaştırıldı. Tek bir düğümlük sapma bile kural setinde bir hata demektir, o yüzden perft bir hakem motorunun en sert testidir — hamle üretiminin tamamını, şah güvenliğini, rok haklarını ve geçerken alma imkânını aynı anda yoklar.

Karşılaştırma dört kaynaktan yapılıyor: Chess Programming Wiki'nin yayımlanmış düğüm sayıları, van Kervinck'in zor pozisyon listesi, 6.838 pozisyonluk Vajolet külliyatı ve Stockfish. Yayımlanmış değerin bulunmadığı sığ derinliklerde ise motorla hiç kod paylaşmayan, kurallardan doğrudan yazılmış naif bir 0x88 uygulaması karşılaştırma sağlıyor.

Aşağıdaki derinlikler birleştirilmiştir: bir pozisyon birden fazla koşuya bölünmüşse — önce d5'e, sonra ayrı bir koşuda d6 ve d7'ye — tabloda ulaşılan en derin katmanla tek satırda duruyor. Her pozisyon d1'den o katmana kadar bütün ara derinliklerde de doğrulandı.

CPW standart pozisyonları

Yedi pozisyon, dördüncünün renk aynası dahil. Ayna tesadüfi değil: renk simetrisini bozan bir hata yalnızca orada görünür.

PozisyonDerinlikDüğümKarşılaştırma
Başlangıçd6119.060.324CPW yayımlanmış değerleri
Kiwipeted5193.690.690CPW yayımlanmış değerleri
Pozisyon 3d7178.633.661CPW yayımlanmış değerleri
Pozisyon 4d515.833.292CPW yayımlanmış değerleri
Pozisyon 4 aynasıd515.833.292CPW yayımlanmış değerleri
Pozisyon 5d589.941.194CPW yayımlanmış değerleri
Pozisyon 6d5164.075.551CPW yayımlanmış değerleri

van Kervinck zor pozisyonları

Geçersiz geçerken alma, şah altında rok, geçerken almanın açtığı keşif şahı, şah çeken terfi ve alt terfi, pat–mat ayrımı, fil bağından kaçınma. On beş pozisyonun onunda yayımlanmış derinliğin ötesine geçildi; o katmanlarda karşılaştırılacak yayımlanmış değer olmadığı için doğrulama Stockfish'e karşı yapıldı.

PozisyonYayımlanmışUlaşılanDoğrulama
Geçersiz geçerken alma #1d6 · 1.134.888d6Yayımlanmış değer, Stockfish teyitli
Geçersiz geçerken alma #2d6 · 1.015.133d6Yayımlanmış değer, Stockfish teyitli
Geçerken alma rakibe şah çekiyord6 · 1.440.467d6Yayımlanmış değer, Stockfish teyitli
Kısa rok şah çekiyord6 · 661.072d7Stockfish
Uzun rok şah çekiyord6 · 803.711d7Stockfish
Rok haklarıd4 · 1.274.206d5Stockfish
Rok engellenmişd4 · 1.720.476d5Stockfish
Şahtan terfiyle çıkışd6 · 3.821.001d6Yayımlanmış değer, Stockfish teyitli
Keşif şahıd5 · 1.004.658d6Stockfish
Şah çeken terfid6 · 217.342d8Stockfish
Şah çeken alt terfid6 · 92.683d8Stockfish
Kendi kendine patd6 · 2.217d8Stockfish
Pat ve mat ayrımı Id7 · 567.584d8Stockfish
Pat ve mat ayrımı IId4 · 23.527d4Yayımlanmış değer, Stockfish teyitli
Fil bağından kaçınmad5 · 1.063.513d6Stockfish

Toplu koşular

Tek tek seçilmiş pozisyonlar kenar durumları yakalar; toplu koşular sıradan oyunda ortaya çıkanı yakalar.

KoşuKapsamYöntem
Vajolet külliyatı
gerçek oyun pozisyonları
100 pozisyon × d4 kapsama için, ilk 10 pozisyon × d5 derinlik için — 450 perft kontrolüKülliyatın kendi referans değerleri
Rastgele oyun
perft değil
Kiwipete'ten 20 deterministik-rastgele oyun, oyun başına en çok 80 yarım hamleHer pozisyonda geçerli hamle listesinin tamamı, sıralı hâlde Stockfish ile birebir

Rastgele oyun koşusu düğüm toplamına bakmaz, listeyi karşılaştırır. Toplamın tutması iki hatanın birbirini götürmesiyle de mümkündür; liste karşılaştırması bunu elemez diye değil, elediği için var.

Testler öntanımlı olarak engine_2x.js üzerinde koşuyor. İki motor mantıksal olarak aynı — her derinlikte aynı hamleler, aynı düğüm sayıları — ama hızlı sürüm derin koşuları yarı sürede bitiriyor. Önyüzlerin gömdüğü engine.js dosyasını bayt birebir sınamak için ENGINE=./engine.js yeterli.

Sürümler

Altı önyüz, tek motor

Altısı da aynı çekirdeği kullanıyor. Fark giriş biçiminde, tahtanın gösterilip gösterilmemesinde ve saatin nasıl işlediğinde. Boyutlar bayt olarak, gönderilen dosyanın tamamı: <script> sarmalayıcısı, input ailesinin 36 baytlık işaretleme öneki ve glif taşıyan dosyalardaki BOM dahil.

SürümGirişTahtaSaatSürePlainPacked
dom
dom.html
TıklamaTam tahta, taş glifleriAnlık, saniyede bir600 sn + 5 sn2.3242.039
input
input.html
UCI, metin alanıTam tahta, ASCIIAnlık, saniyede bir600 sn + 5 sn1.8881.665
input_blindfold
input_blindfold.html
UCI, metin alanıYok, yalnızca son hamleAnlık, saniyede bir600 sn + 5 sn1.7481.539
prompt
prompt.html
UCI, prompt penceresiTam tahta, tam genişlik gliflerHamle girişinde600 sn + 5 sn1.8051.595
prompt_blindfold
prompt_blindfold.html
UCI, prompt penceresiYok, yalnızca son hamleHamle girişinde600 sn + 5 sn1.6781.477
numerical
numerical.html
Sayısal, prompt penceresiYok, yalnızca son hamleHamle girişinde900.000 ms, artış yok1.4351.255

Terfi, terk ve beraberlik

Bir hamle dışındaki her şeyin nasıl yapıldığı sürüme göre değişiyor. DOM'da hepsi ayrı bir denetim; kalanlarda hepsi aynı metin alanından geçiyor.

SürümTerfiTerkBeraberlik
domPanel açılır, taş seçilene kadar hamle tamamlanmazResign düğmesiBeraberlik radiosu
UCI dörtlüsüHamlenin 5. karakteri: r b n, diğer her şey vezirr, prompt sürümlerinde ayrıca CancelHamlenin sonuna =; tek başına = iddia veya kabul
numericalHamlenin 5. karakteri: 0 fil, 1 kale, 2 at, diğer her şey vezirCancel, Esc, boş enter, sekmeyle çıkışSayısal olmayan karakter içeren her giriş

Oyna

Sürümü seç, başlat

Her sürüm kendi penceresinde çalışır, saatler ancak başlattığında işlemeye başlar. Sürüm değiştirmek çalışan oyunu kapatır.

dom ve input sürümlerinde tahta küçük geliyorsa tarayıcının yakınlaştırmasını kullan — Ctrl +, macOS'ta +. Oyun pencerenin içinde birlikte ölçeklenir; Ctrl 0 eski hâline döndürür.

Altı sürümden beşi hamleleri prompt() penceresiyle veya oyun sonucunu alert() ile bildiriyor. Tarayıcın bu pencereleri engelliyorsa — çoğu tarayıcı ikinciden sonra “bu sayfanın iletişim kutularını engelle” seçeneği sunar — oyun sessizce durur. Engellediysen sayfayı yenile ve kutuları geri aç. dom sürümü hiç iletişim kutusu kullanmaz.

Sürüm

Seçili sürüm dom. Oyunu başlat ya da kodunu göster.

Hazır

Notasyon

Hamle nasıl girilir

Tıklama — dom

Her şey tıklanarak yapılır. Taşa, sonra varış karesine basılır. Terfi karesine ulaşıldığında panel açılır ve taş seçilene kadar hamle tamamlanmış olmaz; saat bu sırada işlemeye devam eder. Taşı seçmezsen terfiyi iptal edip başka bir hamle oynayabilirsin.

Beraberlik radiosu hamleden bağımsız çalışır. Tahtada eşik zaten dolmuşsa işaretlemek beraberliği doğrudan tetikler; rakip teklif göndermişse işaretlemek teklifi kabul eder; ikisi de yoksa işaret kalır ve hamleyi oynadığında değerlendirilir — hamle eşiği sağlıyorsa iddia, sağlamıyorsa rakibe teklif olur.

UCI — input, input_blindfold, prompt, prompt_blindfold

Biçim <başlangıç><varış><terfi><beraberlik>. Büyük küçük harf duyarsız: E2E4, e2e4 ve e2E4 aynı hamledir.

Terfi harfi r, b veya n. Bu üçü dışındaki her harf — q dahil — ve harf yokluğu vezire terfi eder, yani e7e8 yeter. Renk motorun kendi meselesi, sen yalnızca türü seçiyorsun.

Rok, şahın gideceği kareyle yazılır: beyaz için e1g1 ve e1c1, siyah için e8g8 ve e8c8. Şahın kaleyi aldığı biçim yok. Geçerken alma ise piyonun gerçekten varacağı kareyle yazılır, o yüzden ayrı bir kural gerektirmez.

Beraberlik hamlenin sonuna gelen = ile. b2b3= demek: bu hamleyi oynadığımda eşik dolacaksa iddia ediyorum, dolmayacaksa rakibe teklif ediyorum. Motor kararı hamle oynandıktan sonraki duruma bakarak verir; hamle sayacı sıfırlıyorsa ya da pozisyonu benzersizleştiriyorsa beraberlik kurulmaz. Tek başına = ise mevcut durumu iddia eder veya bekleyen teklifi kabul eder.

Terk r. prompt ve prompt_blindfold'da pencereyi iptal etmek de terk sayılır; boş enter sayılmaz, geçersiz hamledir ve saat işlemeye devam eder.

e7e8=N girişindeki = SAN'ın terfi işareti değil, beraberlik ekidir — ve N ek olarak değil terfi harfi olarak okunmadığı için sonuç vezir olur. Ata terfi etmek için e7e8n, ata terfi edip beraberlik istemek için e7e8n=.

Bir hamle mat ediyorsa sonundaki = yok sayılır. Mat, otomatik beraberlik koşullarının hepsini geçtiği gibi iddiayı da geçer.

Sayısal — numerical

Aynı dizilim, kareler iki basamaklı sayı. Numaralandırma bilerek 0–63 yerine 1–64: a1 = 01, h8 = 64.

KareUCISayısalMotor içi
a1a1010
h1h1087
a2a2098
e4e42928
a8a85756
h8h86463

Terfi girdisi rakam: 0 fil, 1 kale, 2 at, 3 ve diğer her şey vezir. Harf yok — bu sürümde hiçbir yerde harf yok. Rok yine şahın kareleriyle: beyaz 0507 ve 0503, siyah 6163 ve 6159.

Beraberlik girdisi, girişin sayısal olmamasıdır. 5664ddsd hamleyi oynar ve beraberlik ister; hfjkj bekleyen teklifi kabul eder veya mevcut durumu iddia eder. Sayısal olan ama geçersiz bir giriş — 6500 gibi — hiçbir şey yapmaz, yalnızca saatin son hâlini gösterir. Saati canlı olmayan bir sürümde süreyi öğrenmenin tek yolu bu.

İptal, Esc, boş enter ve sekmeyle çıkış terk eder. 0, 00 ve boşluk terk etmez; üçü de sayısal olarak sıfırdır, yani geçersiz hamledir. r yazmak da terk değil — harf içerdiği için beraberlik kanalına düşer.

Bu arayüzün rahatsız ediciliği kasıtlıdır. Sürüm bayt için yazıldı, konfor için değil.

Kurallar

Motorun uyguladığı kurallar

1. Taş hareketleri, geçerlilik ve şah güvenliği

  • Geometrik hatlar. Kale, fil ve vezir kendi doğrultularında ilerler; şah her yöne bir kare; piyon dikey ileri gider, çapraz alır; at “L” geometrisiyle atlar.
  • Yolun açıklığı. At dışındaki tüm taşlar için hat üzerinde başka taş bulunmamalıdır.
  • Geçerlilik. Hedef kare boş olmalı ya da rakip taş barındırmalıdır; kendi taşının bulunduğu kareye hamle yapılamaz.
  • Şah güvenliği. Hiçbir hamle kendi şahını tehdit altında bırakamaz.

2. Özel hamleler

  • Rok. Şah ve kale hiç hareket etmemiş, aralarındaki kareler boş, şah şahta değil ve geçtiği kare tehdit altında değilse yapılan çift taş hamlesidir. Hareket eden kalenin rok hakkı gider; şah hareket etmişse iki kalenin de hakkı gider.
  • Geçerken alma. İki kare çıkan rakip piyonun hemen ardından, tek kare çıkmış gibi çaprazlama alınmasıdır. Yalnızca o hamlelik geçerlidir.
  • Terfi. Son yataya ulaşan piyon, şah ve piyon dışındaki kendi taşlarından birine — vezir, kale, fil veya at — dönüştürülür.

3. Mat ve pat

  • Mat. Şah tehdit altındadır ve tehdidi kaldıracak hiçbir geçerli hamle yoktur. Mat eden taraf kazanır.
  • Pat. Sırası gelen tarafın şahı tehdit altında değildir, ama hiçbir geçerli hamlesi kalmamıştır. Oyun berabere biter.

4. Terk, süre bitimi ve yetersiz materyal

  • Terk ve süre bitimi. Oyundan çekilen veya süresi biten taraf kural olarak kaybeder.
  • Ölü pozisyon. Geçerli hamle dizilimleriyle matın geometrik olarak imkânsız olduğu durumda oyun anında berabere biter: şah–şah, şah–şah+at, ve tüm filleri aynı renk karelerde olan şah+fil–şah+fil.
  • Mat imkânsızken terk veya süre bitimi. Çekilen ya da süresi biten taraf normalde kaybeder; ancak rakibinin geçerli hamlelerle mat etmesi geometrik olarak tümüyle imkânsızsa oyun berabere biter. Süre bitimi için 6.9, çekilme için 5.1.2 — ikincisi 2023'te eklendi.

Bu istisna “rakip mat etmeye zorlayabilir mi” diye sormaz; “bu materyalle mat pozisyonu kurulabilir mi” diye sorar. Kaybeden taraf kendi taşlarıyla şahının kaçış karelerini kapatarak yardım edebileceği için, savunan tarafın taşları da hesaba girer — mekanizma boğma mattakinin aynısı.

MateryalD*2+aKarar
Çıplak şah0Yetersiz
Tek renk karelerde filler1 veya 2Yetersiz
Tek at2Yetersiz
İki renkte filler3Yeterli
Fil + at3 ve üzeriYeterli
İki at4Yeterli
Herhangi bir kale, vezir veya piyon18 ve üzeriYeterli

Tek atla mat ancak savunan taraf kendini duvara kapatacak bir kaleye sahipse kurulabilir. Savunan vezir bu işi göremez, çünkü köşedeki kaçışı kapatabileceği her kareden aynı zamanda mat eden atı tehdit eder.

Mat edenSavunanMatKurulabilen pozisyon
Ş + AtŞYokkurulamaz
Ş + AtŞ + VezirYokkurulamaz
Ş + AtŞ + KaleVarşah ve at tarafına karşı şah ve kale: yardımlı mat pozisyonu
Ş + AtŞ + FilVarşah ve at tarafına karşı şah ve fil: yardımlı mat pozisyonu
Ş + AtŞ + AtVarşah ve at tarafına karşı şah ve at: yardımlı mat pozisyonu
Ş + AtŞ + PiyonVarşah ve at tarafına karşı şah ve piyon: yardımlı mat pozisyonu
Ş + FilŞ + AtVarşah ve fil tarafına karşı şah ve at: yardımlı mat pozisyonu
Ş + FilŞ + Fil zıt renkVarşah ve fil tarafına karşı zıt renk kareli şah ve fil: yardımlı mat pozisyonu
Ş + FilŞ + PiyonVarşah ve fil tarafına karşı şah ve piyon: yardımlı mat pozisyonu
Ş + At + AtŞVarşah ve iki at tarafına karşı çıplak şah: yardımlı mat pozisyonu

Bunlar kurulabilen pozisyonlar, zorlanabilen sonuçlar değil. Hiçbiri kazanma yöntemi değil; yalnızca “bu materyalle mat diye bir şey var mı” sorusunun cevabı, ve 6.9 ile 5.1.2 tam olarak bunu sorar. Materyale dayanmayan ölü pozisyonlar — kilitlenmiş bir piyon zinciri gibi — uygulanmıyor; onları görmek tarama değil arama gerektirir.

Uygulanmayan tek kural: 5.2.2

FIDE'nin 5.2.2 maddesi şöyle: hiçbir oyuncunun herhangi bir geçerli hamle dizisiyle rakibin şahını mat edemeyeceği bir pozisyon ortaya çıktığında oyun berabere biter. Buna ölü pozisyon denir.

Bu koşulun yetersiz materyalden doğan hâli tamamen uygulanıyor — yukarıdaki iki tablo tam olarak onu anlatıyor. Uygulanmayan kısım, materyalin yeterli olduğu ama matın yine de imkânsız olduğu kilitli pozisyonlar. Motor onlarda doğrudan beraberlik vermez.

Kilitli pozisyon: a4, c4, e4, g4 beyaz piyonları ve a5, c5, e5, g5 siyah piyonları karşılıklı bloke; iki fil ve iki şah kendi yarısında hapis
Materyal fazlasıyla yeterli, mat imkânsız. Beyazın piyonları 4. yatayın bütün açık karelerinde, siyahınkiler 5. yatayın bütün koyu karelerinde: açık kareli beyaz fil 4. yatayı, koyu kareli siyah fil 5. yatayı hiçbir zaman geçemez. Geriye kalan kareleri de karşı piyonlar tutuyor, o yüzden şahlar da kendi yarısında kalır. Hiçbir piyon oynayamaz, hiçbir taş alınamaz.

Bu pozisyonda tahtada iki fil ve sekiz piyon var; hiçbir materyal testi buna yetersiz demez. Yine de taraflar iş birliği yapsa bile mat eden bir hamle dizisi kurulamaz, yani 5.2.2 anlamında ölü bir pozisyondur. Motor bunu göremez ve oyun sayaçlar dolana kadar sürer.

Sebep şu: kilitli pozisyon tahta görüntüsünden ya da durum değişkenlerinden herhangi bir çıkarımla belli olmuyor. Dinamik ve yüksek derinlikli bir arama gerektiriyor. Motorun geri kalanı böyle değil — diğer her şey geometri ve aritmetikle, hem her teşhisin doğru olduğu hem de hiçbir vakanın kaçmadığı biçimde çözülebiliyor. Burada ise net bir sonuç, üzerinde uzlaşılmış bir yorum yok; arama algoritmaları bile yanılabiliyor ve doğruluğu ispatlanmış bir algoritma mevcut değil. Bu, satranç programlamanın hâlâ açık duran bir problemi. En doğru kural setini uygulayan Lichess de bu tespiti yapamıyor.

Golfed hâlde bile eklemek motoru şu anki boyutunun üç dört katına çıkarır ve arama gerektirdiği için yavaşlatır. Eklendiğinde de her teşhisin doğru olması sağlanabilir, ama hiçbir vakayı kaçırmamaya yaklaşmak oldukça zor. İleride problemi yeterince formüle edebilirsem hafif ve golfed bir biçimde eklemeyi düşünüyorum; üzerinde perfect-arbiter reposunda çalışıyorum.

Sapma bundan ibaret. Mat imkânsızlığının çekilme ve süre bitimindeki iki istisnası — 5.1.2 ve 6.9 — eksiksiz uygulanıyor; sonuçları RM ve TM kodları taşıyor.

5. Hamle ve tekrar sayaçları

Bir oyuncunun hamlesi bir yarım hamle, iki tarafın karşılıklı hamlesi bir tam hamledir.

  • Pozisyon tekrarı. İki pozisyonun aynı sayılması için tahta görüntüsü, hamle sırası, rok hakları ve geçerli geçerken alma imkânının tamamı birebir aynı olmalıdır. Biri bile farklıysa pozisyon benzersizdir.
  • 50 ve 75 hamle sayacı. Piyon hareketi yapılmadığı ve taş alınmadığı sürece ilerler; ikisinden biri olduğunda sıfırlanır.
  • İddia edilenler. 3 tekrar ve 50 tam hamle (100 yarım hamle) iddia edilirse beraberlik verilir.
  • Otomatik olanlar. 5 tekrar ve 75 tam hamle (150 yarım hamle) iddia beklemeden ilan edilir.
Siyah f7–f5 oynadı, geçerken alma karesi f6 işaretli; ancak e5 piyonu e8 kalesine karşı şahına bağlı olduğu için alma geçerli değil
Siyah az önce f7–f5 oynadı ve geçerken alma karesi f6. Ama e5'teki beyaz piyon, e8'deki kaleye karşı şahına bağlı: exf6 oynanırsa e dosyası açılır ve beyaz şah tehdit altında kalır. Alma geçerli olmadığı için imkân da kurulmaz.

Tekrar anahtarındaki “geçerli geçerken alma imkânı” şartı, o imkânın gerçekten geçerli olmasını istiyor. Motor kareyi ancak alma oynanabilir durumdaysa kurar; iki kare sürülen her piyonda otomatik olarak değil.

Ayrım kritik, çünkü hamleyi en sonda şah kontrolünde reddetmek yeterli değil. Geçerken almanın kendisi açısından ikisi aynı sonucu verir — hamle her hâlükârda oynanamaz. Fark tekrar sayacında ortaya çıkar: imkân, pozisyon anahtarının bir parçasıdır. Geçersizken kurulursa FIDE'nin aynı saydığı iki pozisyon farklı anahtar üretir, üçüncü tekrar geç tetiklenir ya da hiç tetiklenmez.

Sonuç, berabere bitmesi gereken bir maçın mağlubiyetle bitmesi olabilir. Motor hamleye izin vermese bile bu bir kural ihlalidir; istenmeyen kenar durum bu yüzden yok. Kontrol geçerli hamle üretecinin kendisiyle yapıldığından, almanın kendi şahını açığa çıkardığı durumlar da aynı testte kapanır.

6. Beraberlik iddiası ve anlaşma

  • Mevcut durumu iddia. Eşik tahtada zaten dolmuşsa hamle yapmadan talep edilir.
  • Hamleyle iddia. Oyuncu hamlesini bildirir ve o hamle oynandığında kuralın sağlanacağını beyan eder.
  • Anlaşmalı beraberlik. Sırası gelen oyuncu hamlesini yaptıktan sonra rakibine teklif sunar; teklif kabul edilirse oyun berabere biter.
  • Teklifin düşmesi. Teklif, rakip onu kabul etmeyen bir hamle oynadığında geçerliliğini yitirir.

Matın üstünlüğü. Bir hamle mat ile sonuçlanıyorsa, aynı hamlede 75 hamle kuralı veya beşinci pozisyon tekrarı gibi otomatik beraberlik koşulları oluşsa dahi mat geçerlidir. Aynısı iddia için de geçerli: hamlenin sonuna konan beraberlik eki, hamle mat ediyorsa yok sayılır. Mat hamlesi yapıldığı an oyun galibiyetle biter.

Sonuç kodları

On beş sonuç

Oyunun bitebileceği on beş yol var; altısı sonuçlu, dokuzu berabere. Motorun iki kodlaması var ve ikisi aynı on beş sonucu adlandırıyor: dom ve UCI dörtlüsü iki harfli kısaltmayı döndürür, numerical ve engine.js tam sayıyı. Her hücrede ikisi birlikte.

W#1
Beyaz mat etti
B#2
Siyah mat etti
SM3
Pat
5R5
5 pozisyon tekrarı
758
75 hamle kuralı
IM4
Yetersiz materyal
WT9
Beyaz süreden kazandı
BT10
Siyah süreden kazandı
TM13
Süre, mat imkânsızken
WR11
Siyah çekildi
BR12
Beyaz çekildi
RM14
Çekilme, mat imkânsızken
3R7
3 tekrar iddiası
506
50 hamle iddiası
DA15
Anlaşmalı beraberlik

Beyaz kazanır Siyah kazanır Berabere

Üçüncü sütun her satırda beraberedir. İkinci ve beşinci satırlar tamamen berabere: biri otomatik olanlar, diğeri iddia ve anlaşmayla gelenler. Kalan üç satır pozisyonun, saatin ve terkin sonuçlu hâlleri.

Numaralar keyfî değil, aritmetik. İki mat T+1, mat imkânsızken gelen iki beraberlik 13+k, süre ve terkin dört sonucu tek ifadede 9+2*k+Wk süreyi terkten, W tarafı seçiyor. Geriye kalan literal kodlar tek basamağa sığsın diye düşük yuvalar onlara bırakıldı; iki basamağa taşan tek kod, en seyrek görülen anlaşmalı beraberlik oldu.

Bu on beş kod FIDE'ye göre. Başka bir federasyonun kuralları başka bir liste üretir — aşağıya bakın.

Federasyon farkı: FIDE ve USCF

Oyunun sonlanma türleri federasyona göre kayda değer biçimde değişir. USCF'de çekilmek her zaman kayıptır, materyale bakılmaz. Otomatik beraberlik diye bir şey yoktur: 75 hamle ve 5 pozisyon tekrarı sonuç doğurmaz, yalnızca 50 hamle veya 3 tekrar iddia edilirse beraberlik verilir.

Asıl fark bayrak düşmesiyle materyalin karşılaştığı yerde ortaya çıkar, ve iki federasyon farklı soru sorar. FIDE'nin sorusu şu: rakip en kötü hamleleri oynasa bile mat mümkün mü? Yani yardımlı mat, geometrik imkân. Bu sorunun cevabında kesinlik ve tamlık vardır; tek boyutlu bir tahta dizisinden bile çıkarılabilir — bu kodda yapılan tam olarak budur. USCF'nin sorusu ise başka: bayrağı düşen tarafın rakibinin zorlama matı var mı?

Belirli bir çizgiye kadar ikisi hemen hemen aynı sonucu verir. Ama USCF tek ata, tek file, hatta bazen iki ata doğrudan yetersiz materyal diyerek istenmeyen kenar durumlar üretebilir. Masa başında zorlama mat tespiti kolaydır; dijital bir algoritmada aynı doğruluğu sağlamak için arama gerekir. Aksi hâlde tek atla yapılan boğma mat gibi durumlar tespit edilemez.

Boğma mat: şahın kaçış kareleri kendi taşlarıyla kapalı
Kaçış karelerini kapatan taşlar şahın kendi taşları. Zorlama mat aramayan bir uygulama bunu göremez.

Bunun pratik sonucu suistimale açıktır. Oyuncu süresinin bitmesini bekleyerek kayıptan beraberlik çıkarabilir — chess.com'da nadiren de olsa şikâyet edilen bir durum. Kendi köşe piyonuna sıkışmış bir şah, karşı tarafın tek atıyla mat edilecekken kendi sırasında bu açığı kullanabilir.

Özetle USCF'de 75, 5R ve RM oyun sonları yoktur, TM ise oldukça farklı çalışır. Motoru USCF'ye uyarlamak mümkündür; eski sürümleri sergilediğim 2kbfullfidejs.com sitesinde bunu yaptım.

Yakında

2kbfullfidejs.com, daha hantal bir motorun kullanıldığı ama çok sayıda seçenek, ayar ve binlerce varyant üreten dinamik bir jeneratör barındıran sitem. Aynı seçenekler yakında buraya da gelecek: FEN girme, süre ayarı, 960 freestyle, kural eksiltme, federasyon seçimi, periyot seçenekleri — ve bunlara ek olarak gücü ayarlanabilen bir bot.

Ölü pozisyonda çekilmenin beraberlik sayılması — RM, kod 14 — bir proje kuralı değil, FIDE 5.1.2'nin 1 Ocak 2023'te yürürlüğe giren hâli: çekilen taraf normalde kaybeder, ancak rakibi hiçbir geçerli hamle dizisiyle mat edemiyorsa sonuç beraberliktir. Aynı istisna süre bitimi için 6.9'da duruyor; TM ile RM bu yüzden ikizdir. 2023 öncesi metin çekilmeyi koşulsuz kayıp sayıyordu, o yüzden eski kaynaklarda bunu bir sapma olarak göreceksiniz.

Motor

engine.js — arayüzsüz çekirdek

Önyüzü olmayan hâli. Saf durum ve fonksiyonlar; DOM yok, bağımlılık yok, derleme adımı yok. Tek satır. Aşağıdaki kaynak builds/ dizinindeki dosyanın kendisi, sayfa açılırken okunuyor.

engine_2x.js aynı kuralları uygular, birkaç bayt daha uzundur ve gözle görülür biçimde hızlıdır: boş kareleri erken eler, & yerine kısa devre yapan && kullanır ve hamle üretiminde ucuz testi öne alır. Aşağıdaki 2x anahtarı iki kaynağı aynı pencerede değiştirir.

engine.js

    

Sürücü yazmak için altı çağrı

Bir sürücünün satranç bilmesi gerekmiyor. Tıklamayı veya girişi h ile doğrula, O ile işle, ekrana bas.

h(kare)
O karedeki taşın geçerli varış karelerinin dizisi.
O(başlangıç, varış, tür)
Hamleyi gerçekten oynar, sonuç kodunu döndürür. Tür: 1 fil, 2 kale, 3 vezir, 6 at.
Z()
Pozisyonun kendisinden doğan sonuç. Oyun sürerken 0.
X(taraf)
Taraf beraberlik teklif eder veya kabul eder; argümansız X() yalnızca iddia eder.
F(taraf, tür)
Tür 0: o tarafın süresi bitti. Tür 1: o taraf çekildi.
K(taraf)
O taraf şahta mı — gösterge için.

Gösterim için b, T, n, G ve o okunur. Saat sürücünün işi: her vuruşta azalt, sıfıra ulaşınca F(T,0) çağır.