Oyun hiçbir bulmacayı elle yazmaz. Bulmacayı tek bir sayıdan üretir ve siz onu görmeden önce, ne basit ne de imkânsız olduğundan emin olmak için o bulmacayı kendisine karşı oynar.
İngilizce yazılmış ve düzenlenmiştir. Bu Türkçe sürüm makine çevirisiyle oluşturulmuştur; kesinliğin önemli olduğu yerlerde İngilizce özgün metin esas alınmalıdır. İngilizce orijinalini okuyun →
Bir Contraption seviyesi hiçbir yerde saklanmaz. Kalenin nerede durduğunu veya çıkıntıların nasıl düzenlendiğini listeleyen bir dosya yoktur. Bunun yerine tüm seviye, yani topun başlangıç noktası, kalenin konumu, sabit duvarların sayısı ve yerleşimi, size verilen parça envanteri, seed adı verilen tek bir başlangıç sayısından hesaplanır. Üreticiye aynı seed'i verin, bayt bayt aynı bulmacayı elde edersiniz. 1
Bu, üreticinin tek "rastgelelik" kaynağının küçük, deterministik bir sözde rastgele sayı üreticisi olması sayesinde mümkündür. Contraption'ın kullandığı, Tommy Ettinger tarafından yazılmış, kompakt bir 32 bitlik üretici olan mulberry32'dir; onu her çekimde duruma eklenen imza sabiti 0x6d2b79f5'ten tanıyabilirsiniz. 2 Hızlıdır, birkaç satıra sığar ve, en önemlisi, hiç de rastgele değildir: yalnızca karıştırılmış gibi görünen sabit bir matematiksel dizidir. Ona bir başlangıç verin, sonsuza dek aynı sayı akışını üretir. Üretici de her şeyi nereye koyacağına karar vermek için bu akışı okur.
Günlük modu, sosyal bir şey yapmak için bu determinizme yaslanır. Seed'i rastgele değildir; takvimden imal edilir. Oyun, evrensel zamana göre bugünün tarihini alır, onu "contraption:2026-7-28" gibi kısa bir dizeye yazar ve bu metni bir hash işlevinden geçirerek tek bir 32 bitlik sayıya indirger. 1
Hash, iyi bilinen, kriptografik olmayan bir karıştırıcı olan FNV-1a'dır: sabit bir ofsetten, yani onluk 2166136261'den, diğer adıyla 0x811c9dc5'ten başlar ve her karakter için harfi bir özel veya (XOR) işlemiyle içine katar, ardından FNV asalı 16777619 ile çarpar. 3 Geriye, belirli bir gün için sabit kalan ama bir günden diğerine alabildiğine farklı olan bir sayı kalır; böylece tarihteki tek karakterlik bir değişiklik seed'i tamamen dağıtır. Takvim herkes için aynı olduğundan seed de aynıdır, bulmaca da aynıdır. Dünyanın iki ucundaki iki yabancı Günlük modunu açar ve birebir aynı sahayla karşılaşır; skorları karşılaştırmayı anlamlı kılan da tam olarak budur.
Günlük meydan okuma, bir sunucu herkese aynı seviyeyi gönderdiği için değil, herkesin kopyası aynı tarihten aynı seviyeyi bağımsız olarak yeniden hesapladığı için adildir.
Rastgele geometri kolaydır; iyi rastgele geometri ise değildir. Yalnızca bir kale ile birkaç çıkıntıyı gelişigüzel serpiştiren bir üretici, zaman zaman topun yukarıdan bırakıldığında kendiliğinden dosdoğru kaleye düştüğü bir seviye üretir. Bu bir bulmaca değil, bir ara sahnedir. Bu yüzden Contraption bir aday dünyayı kabul etmeden önce kodun preSolved adını verdiği sessiz bir test çalıştırır: seviyeyi hiç parça yerleştirilmeden simüle eder ve çıplak topun yalnızca yerçekimiyle kaleye ulaşıp ulaşmadığını denetler. Ulaşıyorsa seviye çöpe atılır ve üretici yeniden dener. 1
Bu, bir fizik motoru hakkındaki alışılmış düşünme biçiminin ince bir tersine çevrilmesidir. Makinenizi çalıştıran aynı simulate() işlevi, üretim aşamasında, seviyenin kendi zorluğunu denetlemek için içe doğru çevrilir. Motor hem çözümünüzün hakemi hem de bulmacanın kalite müfettişidir.
Fazla kolay seviyeyi reddetmek işin yalnızca yarısıdır. Öteki tehlike imkânsız seviyedir: hiçbir parça diziliminin ulaşamayacağı bir yere sıkıştırılmış bir kale. Contraption buna karşı plausiblySolvable adlı küçük bir kaba kuvvet çözücüyle önlem alır. Akıllıca düşünmez. Yalnızca dener. 1
Somut olarak, tek bir rampayı sahanın üzerindeki bir konum ızgarası boyunca gezdirir ve her noktada onu dört farklı eğimle dener. Bu deneme yerleşimlerinin her biri için tam simülasyonu çalıştırır ve sorar: o tek rampa topu eve ulaştırdı mı? Herhangi bir yerleşim başarılı olduğu anda seviye çözülebilir ilan edilir ve size sunulur. Bütün tarama bittiğinde hiçbiri işe yaramamışsa üretici seviyeyi atıp yeni bir seed denemeyi yeğler.
| Tarama parametresi | Aralık | Anlamı |
|---|---|---|
| Rampa X | 15 → 85, adım 14 | saha boyunca sütunlar |
| Rampa Y | 30 → 120, adım 18 | saha boyunca aşağı doğru satırlar |
| Denenen açılar | 4 | ±0,45 ve ±0,8 radyan |
| Yerleşim başına test | 1 tam simülasyon | top kaleye ulaşıyor mu? |
Bunun neyi kanıtladığı konusunda dürüst olmakta yarar var, çünkü kod da bu konuda dürüsttür: yorum onu "ucuz bir makullük kontrolü … kapsamlı değil" diye adlandırır. Geçen bir seviyenin kesinlikle en az bir kaba tek rampalı çözümü vardır. Geçemeyen bir seviye ise yine de bir fan, bir dişli ya da ızgaranın hiç denemediği daha akıllıca yerleştirilmiş bir rampayla çözülebilir; bu yüzden üretici başarısızlığı imkânsızlığın kanıtı olarak görmez. Bulduğu ilk önemsiz olmayan dünyayı bir yedek olarak saklar ve kırk deneme temiz bir tek parçalı çözüm bulunmadan geçerse, sonsuza dek döngüde kalmak yerine o yedeği sunar. Sonuç pragmatik bir güvencedir: asla bedava bir zafer yok, neredeyse her zaman gerçek bir giriş yolu var ve "mükemmel" seviye için asla sonsuz bir bekleyiş yok. 1
Bir adım geri çekilince Contraption'ın seviye üreticisi, çok eski ve çok genel bir problem çözme kalıbının temiz bir örneği olarak görünür: üret ve test et. Rastgele bir aday önerin; onu gereksinimlerinize göre denetleyin; geçerse tutun, geçemezse atın ve yeniden önerin. Sayısız oyundaki prosedürel içeriğin, evrimsel hesaplamanın büyük bölümünün ve, biraz gözünüzü kısarsanız, doğal seçilimin kendisinin arkasındaki döngü budur: mutasyon önerir, çevre sınar, hayatta kalanlar kalıcı olur. 4
Contraption'ın sürümünü zarif kılan şey, testin oynanabilirliğin ucuz bir vekili olmayıp oynanabilirliğin ta kendisi olmasıdır. Üretici bir seviyenin adil olup olmadığını çıkıntıları sayarak ya da mesafeleri ölçerek tahmin etmez. Seviyeyi kelimenin tam anlamıyla oynar, hem de iki kez: bir kez boş hâlde, bedavaya çözülmediğinden emin olmak için; bir kez de yoklayıcı bir rampayla, bir yolun var olduğundan emin olmak için. Çözümünüzü yargılayacak olan deterministik fizik, bulmacayı elekten geçiren fiziğin ta kendisidir. Gerçek kurallarla uyumunu yitirebilecek ayrı bir "seviye doğrulayıcı" yoktur, çünkü her şey için kullanılan tek bir kural kümesi vardır.
Ve hepsi deterministik olduğu için denetim her iki yönde de şanstan arınmıştır. Günlük seed bir oyuncuya bir diğerinden daha kolay bir saha vermek için komplo kuramaz; kimseye haksız bir saha da veremez, çünkü seviye bir meydan okuma hâline gelmeden önce oyun tarafından, oyunun kendisine karşı oynanmış ve bundan sağ çıkmıştır.