…bir tohumdan her seferinde aynı dünyayı üretebilecek, gürültüyle arazi, otomatla mağara, Spelunky yöntemiyle oynanabilir seviye, WFC ile kurallara uyan harita ve L-sistemiyle bitki yapabilecek; üretilen içeriğin oynanabilir ve ilginç olduğunu ölçmeyi bileceksiniz.
Bir Minecraft dünyası pratikte sonsuz büyüklükte. Ama yeni bir dünyaya girdiğinizde oyun gigabaytlarca harita indirmiyor. Nasıl?
Yeşil = gerekli · kesikli = faydalı ama şart değil. Tıklayınca ilgili sunuma gider.
| PCG (procedural content generation) | prosedürel içerik üretimi | Oyun içeriğinin algoritmayla, sınırlı ya da dolaylı insan girdisiyle üretilmesi |
| seed · PRNG | tohum · sözde rastgele sayı üreteci | Üretecin başlangıç sayısı · aynı tohumdan hep aynı diziyi veren algoritma |
| noise · octave · fBm | gürültü · oktav · kesirli Brown hareketi | Yumuşak rastgele fonksiyon · farklı ölçekteki katman · oktavların toplamı |
| cellular automaton | hücresel otomat | Her hücrenin komşularına bakarak güncellendiği ızgara kuralı |
| BSP · drunkard’s walk | ikili alan bölme · sarhoş yürüyüşü | Alanı yinelemeli bölme · rastgele yürüyerek tünel kazma |
| WFC · entropy · propagation | dalga fonksiyonu çöküşü · entropi · yayılım | Kısıt çözen üretim · bir hücrenin kalan seçenek sayısı · kısıtın komşulara aktarılması |
| L-system · grammar · axiom | L-sistemi · dilbilgisi · aksiyom | Yeniden yazma kurallarıyla büyüyen dize · kurallar kümesi · başlangıç dizesi |
| expressive range · playability | ifade aralığı · oynanabilirlik | Üretecin ne tür içerik ürettiğinin dağılımı · içeriğin bitirilebilir olması |
Shaker, Togelius ve Nelson’ın tanımı: oyun içeriğinin algoritmayla, sınırlı ya da dolaylı kullanıcı girdisiyle üretilmesi. İçerik = seviyeler, haritalar, zindanlar, bitkiler, silahlar, görevler, isimler, dokular, müzik… (yapay zekâlı NPC’ler genelde “içerik” sayılmaz).
| neden? | örnek |
|---|---|
| bellek / boyut | Elite (1984), River Raid (1982) |
| tekrar oynanabilirlik | Rogue, Diablo, Spelunky, Hades’in oda sırası |
| ölçek | Minecraft, No Man’s Sky |
| üretim maliyeti | SpeedTree ağaçları, Unreal PCG ile orman serpme |
| oyuncuya uyum | oyuncunun becerisine göre seviye (Y17) |
Ortak fikir: “rastgele” ama tekrarlanabilir. Bir sonraki slayttaki tohum kavramı bunun anahtarı.
x ← (a·x + c) mod m. Laboratuvarda yazacaksınız.Bilgisayar araziyi nasıl “uyduruyor”? Dört adımda kuralım. Soldan sağa düğmelere basın: her adım bir öncekinin kusurunu gideriyor. Sonra tohumu değiştirin; aynı tohuma dönünce aynı dağların geri geldiğini görün.
Aynı konuyu başka bir anlatımla, kendi elinizle oynayarak görmek çok işe yarar. Kartlar yeni sekmede açılır; çoğu İngilizce ama görsel ve etkileşimli.
Üçü de birkaç satırlık kod; fark, ürettikleri karakterde: organik mağara, mimari zindan, dolambaçlı tünel. Gerçek oyunlar çoğu zaman bunları karıştırır (BSP ile odalar + otomatla mağara bölümleri).

How (and Why) Spelunky Makes its Own Levels
Game Maker’s Toolkit (Mark Brown) · 7 dk 13 sn · YouTube’da aç
Demodaki 4 × 4 oda ızgarası, garantili ana yol ve odaların içindeki şablonlar, oyunun kendi tasarımcısının anlattığı mantıkla. Rastgelelik ile tasarımın nasıl bir arada tutulduğunun en iyi örneği.
A → AB, B → A. A, AB, ABA, ABAAB, ABAABABA… Uzunluklar Fibonacci dizisi!F ileri, + − dön, [ ] konumu kaydet/geri yükle (dallanma).{ "baslangic": ["#kahraman#, #yer#da #canavar# ile karşılaştı."],
"kahraman": ["Yaşlı demirci", "Genç büyücü", "Hancının kızı"],
"yer": ["mağara", "orman", "kale"],
"canavar": ["bir kurt sürüsü", "uyuyan bir ejderha"] }
Görev açıklamaları, eşya adları, NPC söylentileri… 3 × 3 × 2 = 18 cümle; her yeni kelime çarpımı büyütür. (Türkçede ek uyumu için daha akıllı kurallar gerekir: “mağarada” ama “kalede”.)[ ve ] hangi veri yapısını kullanıyor? (Yığın: “konumu it, dalı çiz, konumu geri çek”.)[ ve ] hangi veri yapısını kullanıyor? (Yığın: “konumu it, dalı çiz, konumu geri çek”.)
| System.Random(seed) · random.Random(seed) | tohumlu üreteç | Kendine ait, tohumlanmış bir üreteç nesnesi (paylaşılan global üreteç yerine) |
| noiseSeed · noiseDetail (p5.js) | gürültü ayarı | Gürültünün tohumu · oktav sayısı ve kalıcılık |
| Mathf.PerlinNoise(x, y) | Unity gürültüsü | 0–1 arası 2B Perlin değeri; tohum yok, koordinatı kaydırarak çeşitlenir |
| np.mgrid · astype(int) | NumPy ızgarası · tam sayıya çevirme | Bütün piksellerin koordinatları · ondalığı atma |
| deque · popleft | çift uçlu kuyruk | BFS için hızlı kuyruk (Kuyruklar sunumu) |
| bool[,] · GetLength(0) | 2B dizi | C# ızgarası; 0 = satır, 1 = sütun |
| Tilemap.SetTile | karo yerleştirme | Unity 2D’de ızgaraya karo koymak |
if’tir. Eşikleri değiştirmek = dünyayı değiştirmek. İpucu: if’leri küçükten büyüğe sıralarsanız her birinde tek karşılaştırma yeter.walls parametresi buradan geliyor. Başlangıç kodu hücrenin kendisini de sayıyor ve kenarda çöküyor (grid[-1] yok). Harita genişliği grid[0].length, yüksekliği grid.length.| ad | platform | ne yapar / sınırları | nasıl eklenir |
|---|---|---|---|
| FastNoiseLite | C#, C++, JS, GLSL, Rust… | Perlin, OpenSimplex2, hücresel (Worley), değer gürültüsü; fBm, “domain warp”. Tek dosya. Godot 4’te yerleşik. | Tek dosyayı projeye kopyala |
| Unity Mathematics | Unity | noise.cnoise, noise.snoise: Burst/Jobs ile hızlı gürültü; Mathf.PerlinNoise’dan esnek. | Package Manager → Mathematics |
| Unreal PCG Framework | Unreal 5.2+ (5.7’de üretime hazır) | Düğüm tabanlı prosedürel serpme ve dünya inşası: yüzey örnekleme, filtreler, spline’lar, biyomlar. | Plugins → Procedural Content Generation Framework |
| WaveFunctionCollapse · DeBroglie | C# (Unity) | Gumin’in özgün WFC’si ve daha esnek DeBroglie (kısıtlar, geri alma, yol kısıtı). | GitHub / NuGet |
| Houdini Engine | Unity / Unreal | Houdini’de kurulan prosedürel araçları (yol, bina, arazi) motor içinde parametreyle çalıştırma. | SideFX eklentisi |
| Tracery | JS (bağlantı noktaları: Python, C#) | Metin dilbilgisi: isimler, söylentiler, görev açıklamaları. | npm install tracery-grammar |
| Python: numpy · opensimplex · noise | Python | Arazi ve doku prototipleri, ifade aralığı analizleri. | pip install opensimplex |
Random’ı her yerde kullanmak (tohum tekrarlanamaz hâle gelir).“Unity 6, C#, 2D Tilemap. Bir zindan üreteci yaz: (1) DungeonSettings ScriptableObject: genişlik, yükseklik, tohum, ilk duvar oranı, otomat adımı. (2) System.Random(seed) ile hücresel otomat mağarası (kural: ≥5 duvar komşu ya da duvarsa ≥4). (3) Flood fill ile en büyük bölgeyi bul, diğer bölgeleri en yakın noktadan tünelle bağla. (4) Başlangıç ve çıkışı en büyük bölgede birbirinden en uzak iki noktaya koy (BFS ile). (5) Tilemap’e yaz; editörde “Yeniden üret” düğmesi ve OnValidate ile canlı önizleme. (6) Aynı tohumun her zaman aynı haritayı verdiğini test eden bir EditMode testi.”
Hepsi ücretsiz ve kurulumsuz. Her birinde kendinize sorun: tasarımcı neyi elle yaptı, neyi algoritmaya bıraktı?
Adı geçen oyunu tanımıyorsanız: oyuncuların kullandığı wiki sayfası ve oyunu kısaca gösteren bir video. ▶ video slaydın üstünde açılır (Esc ile kapanır); 🎯 işaretli bağlantılar doğrudan bu sunumdaki konuya gider.
Adı geçen oyunu tanımıyorsanız: oyuncuların kullandığı wiki sayfası ve oyunu kısaca gösteren bir video. ▶ video slaydın üstünde açılır (Esc ile kapanır); 🎯 işaretli bağlantılar doğrudan bu sunumdaki konuya gider.
Adı geçen oyunu tanımıyorsanız: oyuncuların kullandığı wiki sayfası ve oyunu kısaca gösteren bir video. ▶ video slaydın üstünde açılır (Esc ile kapanır); 🎯 işaretli bağlantılar doğrudan bu sunumdaki konuya gider.
How (and Why) Spelunky Makes its Own Levels
Procedural Landmass Generation (E01)
Wave Function Collapse in Bad North
How Townscaper Works
Continuous World Generation in No Man’s Sky
Coding Challenge #16: L-System Fractal Trees
How hackers reverse Math.random()
Digital clock in Conway’s Game of Life