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.
numericalbunun 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,inputveprompt. - 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.
| Pozisyon | Derinlik | Düğüm | Karşılaştırma |
|---|---|---|---|
| Başlangıç | d6 | 119.060.324 | CPW yayımlanmış değerleri |
| Kiwipete | d5 | 193.690.690 | CPW yayımlanmış değerleri |
| Pozisyon 3 | d7 | 178.633.661 | CPW yayımlanmış değerleri |
| Pozisyon 4 | d5 | 15.833.292 | CPW yayımlanmış değerleri |
| Pozisyon 4 aynası | d5 | 15.833.292 | CPW yayımlanmış değerleri |
| Pozisyon 5 | d5 | 89.941.194 | CPW yayımlanmış değerleri |
| Pozisyon 6 | d5 | 164.075.551 | CPW 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ı.
| Pozisyon | Yayımlanmış | Ulaşılan | Doğrulama |
|---|---|---|---|
| Geçersiz geçerken alma #1 | d6 · 1.134.888 | d6 | Yayımlanmış değer, Stockfish teyitli |
| Geçersiz geçerken alma #2 | d6 · 1.015.133 | d6 | Yayımlanmış değer, Stockfish teyitli |
| Geçerken alma rakibe şah çekiyor | d6 · 1.440.467 | d6 | Yayımlanmış değer, Stockfish teyitli |
| Kısa rok şah çekiyor | d6 · 661.072 | d7 | Stockfish |
| Uzun rok şah çekiyor | d6 · 803.711 | d7 | Stockfish |
| Rok hakları | d4 · 1.274.206 | d5 | Stockfish |
| Rok engellenmiş | d4 · 1.720.476 | d5 | Stockfish |
| Şahtan terfiyle çıkış | d6 · 3.821.001 | d6 | Yayımlanmış değer, Stockfish teyitli |
| Keşif şahı | d5 · 1.004.658 | d6 | Stockfish |
| Şah çeken terfi | d6 · 217.342 | d8 | Stockfish |
| Şah çeken alt terfi | d6 · 92.683 | d8 | Stockfish |
| Kendi kendine pat | d6 · 2.217 | d8 | Stockfish |
| Pat ve mat ayrımı I | d7 · 567.584 | d8 | Stockfish |
| Pat ve mat ayrımı II | d4 · 23.527 | d4 | Yayımlanmış değer, Stockfish teyitli |
| Fil bağından kaçınma | d5 · 1.063.513 | d6 | Stockfish |
Toplu koşular
Tek tek seçilmiş pozisyonlar kenar durumları yakalar; toplu koşular sıradan oyunda ortaya çıkanı yakalar.
| Koşu | Kapsam | Yö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 hamle | Her 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üm | Giriş | Tahta | Saat | Süre | Plain | Packed |
|---|---|---|---|---|---|---|
domdom.html | Tıklama | Tam tahta, taş glifleri | Anlık, saniyede bir | 600 sn + 5 sn | 2.324 | 2.039 |
inputinput.html | UCI, metin alanı | Tam tahta, ASCII | Anlık, saniyede bir | 600 sn + 5 sn | 1.888 | 1.665 |
input_blindfoldinput_blindfold.html | UCI, metin alanı | Yok, yalnızca son hamle | Anlık, saniyede bir | 600 sn + 5 sn | 1.748 | 1.539 |
promptprompt.html | UCI, prompt penceresi | Tam tahta, tam genişlik glifler | Hamle girişinde | 600 sn + 5 sn | 1.805 | 1.595 |
prompt_blindfoldprompt_blindfold.html | UCI, prompt penceresi | Yok, yalnızca son hamle | Hamle girişinde | 600 sn + 5 sn | 1.678 | 1.477 |
numericalnumerical.html | Sayısal, prompt penceresi | Yok, yalnızca son hamle | Hamle girişinde | 900.000 ms, artış yok | 1.435 | 1.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üm | Terfi | Terk | Beraberlik |
|---|---|---|---|
dom | Panel açılır, taş seçilene kadar hamle tamamlanmaz | Resign düğmesi | Beraberlik radiosu |
| UCI dörtlüsü | Hamlenin 5. karakteri: r b n, diğer her şey vezir | r, prompt sürümlerinde ayrıca Cancel | Hamlenin sonuna =; tek başına = iddia veya kabul |
numerical | Hamlenin 5. karakteri: 0 fil, 1 kale, 2 at, diğer her şey vezir | Cancel, 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.
Seçili sürüm dom. Oyunu başlat ya da kodunu göster.
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.
| Kare | UCI | Sayısal | Motor içi |
|---|---|---|---|
| a1 | a1 | 01 | 0 |
| h1 | h1 | 08 | 7 |
| a2 | a2 | 09 | 8 |
| e4 | e4 | 29 | 28 |
| a8 | a8 | 57 | 56 |
| h8 | h8 | 64 | 63 |
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ı.
| Materyal | D*2+a | Karar |
|---|---|---|
| Çıplak şah | 0 | Yetersiz |
| Tek renk karelerde filler | 1 veya 2 | Yetersiz |
| Tek at | 2 | Yetersiz |
| İki renkte filler | 3 | Yeterli |
| Fil + at | 3 ve üzeri | Yeterli |
| İki at | 4 | Yeterli |
| Herhangi bir kale, vezir veya piyon | 18 ve üzeri | Yeterli |
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 eden | Savunan | Mat | Kurulabilen pozisyon |
|---|---|---|---|
| Ş + At | Ş | Yok | kurulamaz |
| Ş + At | Ş + Vezir | Yok | kurulamaz |
| Ş + At | Ş + Kale | Var | ![]() |
| Ş + At | Ş + Fil | Var | ![]() |
| Ş + At | Ş + At | Var | ![]() |
| Ş + At | Ş + Piyon | Var | ![]() |
| Ş + Fil | Ş + At | Var | ![]() |
| Ş + Fil | Ş + Fil zıt renk | Var | ![]() |
| Ş + Fil | Ş + Piyon | Var | ![]() |
| Ş + At + At | Ş | Var | ![]() |
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.
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.
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.
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+W — k 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.
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.
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.







