Yıldız Teknik Üniversitesi İletişim Tasarımı Bölümü mezunuyum ve beş yıldır full stack web yazılımcısı olarak çalışıyorum. Mobil oyunlarda mekanikleri anlaşılır biçimde öğreten bölümler tasarlıyor ve zorluk akışını dengeliyorum. Tasarım kararlarını kullanıcı geri bildirimleri, bot testleri, A/B karşılaştırmaları ve ürün ölçüm planlarıyla değerlendiriyorum. Aplomb, Mozaik Blast ve Crumble Crew projelerinde bölüm tasarımından Unity editör araçlarına kadar oyunların hem tasarım hem ürün tarafını geliştiriyorum.
Aplomb’da tavandan sarkan bir yapıyı dengeliyorsun. Parçaları kollara asarken nereye koyacağını ve hangi sırayla ilerleyeceğini düşünmen gerekiyor. Kol fazla eğilirse parçalar kayıp tepsiye dönüyor. Sonra başka bir sıra deneyebiliyorsun.
Kısa bölümlerde deneyerek öğrenilen, sakin bir bulmaca yapmak istedim. Yanlış bir hamlenin ardından oyuna devam edip dengeyi yeniden kurabiliyorsun. İlerledikçe yeni kurallar geliyor. Hepsi aynı ağırlık ve mesafe ilişkisi üzerine kuruluyor.
Bu projede yaptıklarım
Bölüm tasarımı: 84 bölümü tasarladım. Her bölümde oyuncunun ne öğrenmesini istediğimi, mekanikleri hangi sırayla tanıtacağımı ve zorluğun nasıl ilerleyeceğini belirledim.
Test ve iyileştirme: Çözücü, bölüm editörü ve bot testleri geliştirdim. Testlerde gördüğüm sorunlara göre 15 bölümü değiştirdim. Ardından bölümleri hem tek başına hem de oyunun başından itibaren ilerleyerek yeniden test ettim.
Ürün kararları: Booster’ları, ödülleri ve mağazayı tasarladım. Analitik olaylarını kurdum. Önizleme için bir A/B testi planlayıp botlarla karşılaştırdım. Bu testin verisini SQL ve Excel’le inceledim.
Geliştirme: Oyun kurallarını ve araçları Unity’de C# ile yazdım. Arayüzü ve görselleri de hazırladım.
Veriyi nasıl topladım?
Geniş ölçekli oyuncu testine erişimim olmadığı için bölümleri, farklı oynama davranışlarını modelleyen botlarla test ettim. Botların hangi varsayımlarla çalıştığını sonuçlarla birlikte paylaştım. Tasarım değişikliklerini aynı koşullarda karşılaştırdım. Bu sonuçlar bot testlerinden geliyor. Gerçek oyuncuların aynı değişikliklere nasıl tepki vereceğini henüz bilmiyorum.
Fransızcadaki “à plomb”, şakul ipi gibi dik ve dengede durmayı anlatıyor. İngilizcede de zor bir anda soğukkanlı kalabilmek anlamında kullanılıyor. Bu iki anlamı sevdim. Oyunda denge kurarken acele etmeden düşünmek gerekiyor.
Oynanış
Bir parçanın kolu ne kadar çektiğini ağırlığı ve merkeze uzaklığı belirliyor. Örneğin merkezden iki kanca uzaktaki 3’lük parça, karşı tarafta üç kanca uzaktaki 2’lik parçayı dengeliyor. Ağırlığı görünen bir parçayı kancanın üzerinde tutunca kolun nasıl eğileceğini görebiliyorsun. Ağırlığı “?” ile gizlenen parçalarda bu önizleme yok.
Önce sırayı öğrenmek
Videoda 6. ve 11. bölümleri gösteriyorum. 6. bölümde ağır parçayı en uca asınca kol kayıyor. Aynı parçaları merkeze yakın kancalardan başlayarak asınca dengeyi kaymadan kurabiliyorsun. 11. bölümde ise önce alt kolu, ardından ana kolu dengelemek gerekiyor.
Tepsideki parçaları asmanın yanında, asılı bir parçayı başka bir kancaya taşıyabilir veya geri alabilirsin.
İlk beş bölümde kayma yok. Oyuncuya ağırlık ve mesafeyi rahatça deneyebileceği bir başlangıç bıraktım. Yerleştirme sırası 6. bölümde önem kazanmaya başlıyor.
Bütün kollar yatay olduğunda bölüm tamamlanıyor. Kural kartı varsa onun koşulunu da sağlamak gerekiyor.
Oyun ekranındaki öğeler
Bu ekran 44. bölümden. Numaralar, aşağıda anlattığım parçaları ve booster’ları gösteriyor.
12345678910
1Asılı yapı. Tavandan sarkan, birbirine asılı kollardan oluşan yapı. Bölümü bitirmek için bütün kolları aynı anda yatay tutmak gerekiyor.
2Tepsi. Asılmayı bekleyen parçalar burada duruyor. Bir parçayı sürükleyip kancaya bırakıyorsun. Kayan parçalar da buraya dönüyor.
3Parça. Üzerindeki sayı ağırlığını gösteriyor. Merkezden uzağa astıkça kolu daha güçlü çekiyor.
4Kol. Merkezinden asılı çubuk. İki tarafı eşit çekildiğinde yatay duruyor. 6. bölümden itibaren fazla eğilirse üzerindeki parçalar kayıyor.
5Kanca. Parçaları ve alt kolları astığın halkalar. Merkeze uzaklığı, asılan ağırlığın kol üzerindeki etkisini belirliyor.
6Alt kol. Başka bir kola asılan kol. Ana kolu, üzerindeki parçaların toplam ağırlığı kadar çekiyor. Önce kendi içinde dengelenmesi gerekiyor.
7Gizli parça. Ağırlığı “?” ile gösteriliyor ve asılınca ortaya çıkıyor. Cam sergisinde, 37. bölümde tanıtılıyor.
8Booster’lar. Terazi, gizli bir parçanın ağırlığını gösteriyor. Kilit, bir kolu üç yerleştirme boyunca sabit tutuyor. Geri Al ise az önce kayan parçaları geri getiriyor. Kilit ve Geri Al 8. bölümde, Terazi 37. bölümde açılıyor.
9Pirinç sayacı. Bölüm bitirerek kazandığın oyun içi para. Sayaca dokununca mağaza açılıyor.
10Galeri düğmesi. Sergileri, salonları, bölüm seçimini ve ayarları açıyor.
Oyun döngüsü
BakHangi kol hangi yöne eğik?
TartParçayı kancanın üstünde tut, kolun tepkisini gör.
AsParçayı bırak. Kol dengeye yaklaşabilir veya parçalar kayabilir.
DüzeltKayan parçalar tepsiye döner, sıra yeniden kurulur.
Kayma olduğunda o koldaki parçalar tepsiye dönüyor. O denemeyi artık kaymasız bitiremiyorsun, ama bölüme devam edebiliyorsun. Oyuncunun hatanın ardından sırayı yeniden düşünüp başka bir yol denemesini istedim.
Tamamladığın bölüm, galeride küçük bir asılı yapı olarak kalıyor. Bir serginin 12 bölümünü bitirince yeni salona geçiyor ve 150 pirinç kazanıyorsun. Her bölümü en az bir kez kaymadan tamamlarsan salonun ışığı yanıyor. Booster kullanmış olman buna engel değil.
Bölüm tasarımı
84 bölümü, her biri 12 bölümden oluşan yedi sergiye ayırdım. Her sergi için ayrı bir malzeme ve tasarım odağı seçtim. Bazılarında yeni mekanikler tanıttım. Son sergide ise daha önce öğrenilen mekanikleri, daha dar bir kayma toleransıyla bir araya getirdim.
Ağırlık × mesafe, alt kol, 6. bölümden itibaren kayma ve kola sabitlenmiş parçalar
Bu parça nereye ve hangi sırayla?
13–24
Ahşap
Kilitli kancalar, iki yanı farklı uzunlukta (asimetrik) kollar, üç kollu
asılı yapılar
Kullanamadığım kanca planımı nasıl değiştiriyor?
25–36
Bakır
Oyuncunun kendisinin astığı boştaki kol ve tepside olup çözümde kullanılmayan yem parçalar
Hangi parça bu yapıya ait değil?
37–48
Cam
Asılınca ağırlığı ortaya çıkan “?” parçalar
Bilmediğim bir ağırlığı nerede tartarım?
49–60
Keçe
Kural kartları: “Yan yana”, “Kırmızı ayrı”, “Kol A solu ağır”, “En altta”, “Kol
A boş değil”
Dengede, ama kurala da uyuyor mu?
61–72
Taş
Rüzgâr: kolun bir ucunu iten, yerinden oynatılamayan bir yük. Kayma eşiği 6’dan
5’e iniyor
Kaldıramadığım bir yükü nasıl dengelerim?
73–84
Neon
Kayma eşiği 4, iki duvar bölümünde 6. Önceki bütün kurallar yeniden kullanılıyor
Hangi sırayla asarsam kol hiç kaymaz?
Serginin ritmini planlamak
Her bölüme başlamadan önce oyuncunun orada ne öğrenmesini istediğimi yazdım. Yeni kuralı kısa bir bölümde tanıtıp sonraki bölümlerde eski kurallarla birleştirdim. “Duvar” dediğim zor bölümlerde bu öğrenmeyi sınadım. Arkasından daha rahat bir bölüm koyarak oyuncuya öğrendiğini kullanabileceği bir nefes alma alanı bıraktım. Cam sergisinden beş örnek:
Bölüm
Görevi
Oyuncudan beklediğim karar
37 · Tutorial
Tek gizli ağırlığı tanıtmak
“?” parçasını asıp ağırlığını görmek
38 · Rahat
Önce merkeze yakın tartmayı denemek
Bilinmeyen parçayı en uca koymadan önce güvenli bir kancada denemek
42 · Orta
İki gizli parçayı asimetrik kolla birleştirmek
Ağırlığı öğrenirken yerleşim sırasını da düşünmek
44 · Duvar
Gizli parça, alt kol, kilit ve sabit yükü birlikte kullanmak
Birden fazla kolun dengesini birlikte planlamak
45 · Nefes alma bölümü
Duvarın ardından baskıyı azaltmak ve gizli yem parçayı ayırt etmek
Tarttığı parçanın yapıya ait olup olmadığına karar vermek
Öğretici bölümlerin daha kolay tamamlanmasını, duvar bölümlerinin ise daha çok uğraştırmasını hedefledim. Aşağıdaki oran ve süreleri başlangıç hedefi olarak belirledim. Bunlar gerçek oyuncularla doğrulanmış değerler değil. Orta zorluktaki bölümlerle nefes alma bölümleri arasındaki farkı planlamak için kullandım.
Bant
Zorluk puanı
Hedef: geçen oyuncu
Hedef: oyuncuların yarısının bitirme süresi
Tutorial
3’ün altı
%95
45 sn
Rahat
3–6
%88
60 sn
Orta
6–9
%80
90 sn
Duvar
9–12
%60
150 sn
Yasak
12’nin üstü
oyuna girmiyor
–
İlk sergide bölümün ne öğrettiğine öncelik verdim. Örneğin 6. bölümün puanı 5,2, ama kaymayı ilk kez tanıttığı için onu öğretici bölüm olarak değerlendiriyorum. Süre hedeflerini de gerçek oyuncularla test edebildiğimde yeniden gözden geçireceğim.
Bölümleri tasarlamak ve düzenlemek
Her bölüm için öğretmek istediğim şeyi, bir araya getireceğim mekanikleri ve sergideki yerini belirledim. Sonra çözücü ve bot testleriyle kontrol ettim. Bot sonuçları hedefimden uzaksa düzeni yeniden ele aldım.
Yazdığım bölüm editöründe kancaları, ağırlıkları, alt kolları ve kural kartlarını düzenleyebiliyorum. Bir değişiklikten sonra dengeli yerleşimlerin ve güvenli sıraların nasıl değiştiğine bakıyorum. Bölümü oyunda da açıp anlatmak istediğim kuralın hâlâ anlaşılır olup olmadığını kontrol ediyorum.
Unity’deki bölüm editöründe son bölüm açık. Solda kilitli kanca, rüzgâr, sağdaki alt kol, biri gizli dört parça ve “En altta” kartı var. Sağda önizleme ve çözücünün sonucu görünüyor. Dört dengeli yerleşimin her birinde, 24 asılış sırasının 20’si kaymadan tamamlanıyor.
Kur: Kancaları, ağırlıkları ve alt kolları, bölümde öğretmek istediğim kurala göre yerleştiriyorum.
Kontrol et: Çözücünün bulduğu dengeli yerleşimlere ve kaymasız sıralara bakıyorum. Yaptığım değişikliğin hangi seçenekleri açıp hangilerini kapattığını karşılaştırıyorum.
Oyna ve düzelt: Kaydetmeden önce bölümü oyunda açıyorum. Öğelerin okunabilirliğini ve hamlelerin ekranda nasıl karşılık bulduğunu kontrol ediyorum. Bot sonucunu da hedefimle karşılaştırdıktan sonra bölüm dosyasını kaydediyorum.
Editörde bir bölümü nasıl hazırlıyorum?
Önce bölümün amacını belirliyorum. Oyuncudan hangi kararı beklediğimi ve önceki bölümlerde öğrendiği hangi kuralları kullanacağını düşünüyorum. Yeni bir mekanik tanıtacaksam ona yer açıyorum. Duvar bölümünde ise birlikte sınamak istediğim kuralları seçiyorum.
Yapıyı ve tepsiyi kuruyorum. Kancaları virgülle yazıyorum ya da ±1…±4
tuşlarıyla iki yanı eşit bir kol açıyorum. Bir kancayı silince kol asimetrik oluyor.
Kilitli kancalar, kolu bir yöne iten rüzgâr, kola sabitlenmiş parçalar ve alt kollar da
burada. Tepside her parçanın ağırlığı, şekli, rengi ve gizli olup olmadığı var. Kaç
parçanın asılacağını da ben belirliyorum. Tepside bundan fazla parça varsa artanlar yem.
Kural kartları beş türden: yan yana, bir renk ayrı, kolun solu ağır, en altta ve kol boş
değil. Geçersiz bir yapı kurarsam (olmayan bir kancayı kilitlemek ya da dolu bir kancaya
alt kol asmak gibi) önizlemenin altında hata çıkıyor.
42. bölümün kolu ve tepsisi. +2 kancası olmadığı için kol asimetrik. Tepsideki dört parçanın ikisi gizli.
Çözücüyü çalıştırıyorum. Bu örnekte “Solve” işlemi 3 milisaniye
sürüyor. En üstte karar var: bölüm oyuna girebilir mi, hangi bantta, P, S, R ve zorluk puanı (D). Altında örnek bir kaymasız sıra ve bütün çözümler. Her çözümün yanında,
parçaların bütün asılış sıralarından kaçının kaymadan bittiği yazıyor. Örnek sıra
önizlemeye de çiziliyor: “2:3”, ikinci adımda 3’lük parçanın o kancaya asılacağı demek.
42. bölümün güncel hâli orta bantta, puanı 8,3. Altı çözümde de ağırlıkların dağılımı aynı. Üç ayrı 2’lik parça yer değiştirdiği için çözücü bunları ayrı sayıyor. Her çözümde 24 sıranın 16’sı kaymadan bitiyor.
Bir değişikliğin etkisine bakıyorum. Bir ayarı değiştirince
önizlemedeki sıra kayboluyor. “Solve”a yeniden basıp yeni sayılara bakıyorum. Aşağıdaki,
aynı bölümün bot testinden önceki hâli. İki fark var: kolda +1 kancası yok ve gizli
baklava 3 değil 4. Bu hâliyle 4’lük parçanın gidebileceği tek yer +3 kancası. Her
çözümde 24 sıradan yalnızca 4’ü kaymadan bitiyor. Çözücü sıraların çoğunun kaydığını
görüyordu (R = 0,17), ama gizli ağırlığı keşfetmenin oyuncunun kararlarını nasıl
etkilediğini ölçmüyordu. Puanı 7,5 olan bölüm orta banttaydı. Ne kadar zor olduğunu
botlar gösterdi (42. bölüm örneğinde).
42. bölümün bot testinden önceki hâli: P = 24, R = 0,17, puan 7,5. Örnek sırada 2’lik parça −3’e, ardından 4’lük parça +3’e asılıyor. Solda 6’lık yük henüz kurulmadığı için 4’lük parça kolu kaydırıyor.
Oyunda deniyorum. “▶ Play” editördeki hâli, kaydetmeye gerek kalmadan
oyunun sahnesinde açıyor. Çözücü bölümün çözülebildiğini ve kâğıt üzerinde ne kadar zor
olduğunu söylüyor, ekranda nasıl göründüğünü söylemiyor: yapı rahat okunuyor mu, kol
ne kadar eğiliyor, gizli parçalar ilk bakışta fark ediliyor mu, bunlara oyunda
bakıyorum.
Solda editördeki önizleme, sağda aynı bölümün oyun ekranı.
Kaydediyorum. “Save”, yapıyı tekrar kontrol edip çözücüyü çalıştırıyor. Bant, P, S, R ve puan bölüm dosyasına yazılıyor. Böylece bölümü yeniden açtığımda bu ölçüleri de görebiliyorum. “Revert” ile son kaydettiğim hâle dönebiliyorum.
Zorluk puanını nasıl kullanıyorum?
Çözücü, kaç yerleşimin dengede kaldığını ve bunların hangi asılış sıralarında kaymadığını hesaplıyor. Gizli ağırlık, yem parça, kart ve alt kol gibi öğeleri de hesaba katarak bir zorluk puanı veriyor. Bu puanla bölümleri karşılaştırıp uygun olmayan adayları eliyorum. Oyuncunun bir kuralı anlayıp anlamadığını görmek içinse başka kontrollere ihtiyacım var.
Formülün katsayılarını başlangıçta ben seçtim. Bunları gerçek oyuncu verisinden çıkarmadım. Puanı bu yüzden bot sonuçları ve bölümün öğretim amacıyla birlikte değerlendiriyorum. 42. bölümde bu üçüne birlikte bakmak kararımı değiştirdi.
P olası yerleşimleri, S dengeli yerleşimleri, R kaymasız sıraların payını gösteriyor. Aynı ağırlıktaki farklı parçalar ayrı sayılıyor. Bu yüzden S, oyuncunun gözünden farklı görünen çözümlerin sayısıyla her zaman aynı değil.
Çözümü olmayan, R = 0 olan, puanı 12’yi geçen veya arama bütçesini aşan adayları eliyorum. Sıra sayısı çok büyükse arama örneklemeyle yapılıyor. Bunun sınırlarını teknik ayrıntılarda anlattım.
LevelChecks.cs · “önce merkeze yakın tart” kontrolü
publicstaticbool TeachesWeighNearPivot(LevelDef def)
{
foreach (var hidden in def.Tray.Where(p => p.Hidden))
{
bool nearSafe = false, farSlips = false;
foreach (int hook in def.Root.Hooks)
{
var st = MobileState.FromDef(def);
st.Pieces[hidden.Id].Revealed = true;
var r = st.Preview(hidden.Id, st.Root.Id, hook);
if (!r.Available) continue;
if (Math.Abs(hook) == 1 && !r.WouldSlip) nearSafe = true;
if (Math.Abs(hook) >= 2 && r.WouldSlip) farSlips = true;
}
if (nearSafe && farSlips) returntrue;
}
returnfalse;
}
Bu kontrol, en az bir gizli parça için güvenli bir yakın kanca ve kaydıran bir uzak kanca arıyor. Böylece “önce merkeze yakın tart” fikrinin bölümde karşılığı olduğunu kontrol ediyorum. Oyuncunun bunu öğrenip öğrenmediğini anlamak için oynayışını gözlemlemem gerekiyor.
Öğretimi korumak
İlk bölümdeki el işareti, çözücünün bulduğu güvenli hamleyi gösteriyor. Kayma, gizli ağırlık, kart ve rüzgâr ilk kez geldiğinde kısa bir ipucu çıkıyor. Oyuncu bütün parçaları asıp dengeyi bulamazsa 4,5 saniye sonra asılı parçaları taşıyabileceğini hatırlatan bir mesaj gösteriyorum.
Kâğıt sergisindeki beklenen çözüm sıralarını otomatik testlere çevirdim. Örneğin 6. bölümde ağır parçayı en uca asınca kayma olmalı. Bir düzenleme bunu ortadan kaldırırsa test başarısız oluyor. Bakır’ın giriş bölümü de boştaki kol olmadan çözülememeli. Keçe’de kartları kaldırınca çözüm sayısının artmasını kontrol ediyorum. Bu son test kartların birlikte etkili olduğunu gösteriyor. Her kartı ayrı ayrı ölçmüyor.
Zorluk eğrisi
Grafikte, 15 bölümde yaptığım değişikliklerden sonraki zorluk puanları var. Renkler zorluk bantlarını, noktalar ise duvarın hemen ardından gelen nefes alma bölümlerini gösteriyor. Zorluğu sürekli artırmak istemedim. Yeni serginin kuralını tanıtırken ve zor bir bölümün ardından öğrenileni pekiştirirken baskıyı azalttım.
Tutorial
Rahat
Orta
Duvar
Nefes alma bölümü (duvarın hemen ardından)
Zorluk puanı
03rahat6orta9duvar12üst sınır
Kâğıt1–12
Ahşap13–24
Bakır25–36
Cam37–48
Keçe49–60
Taş61–72
Neon73–84
Grafikteki değerler
Bölüm
Sergi
Bant
Puan
1
Kâğıt
tutorial
2,6
2
Kâğıt
tutorial
0,0
3
Kâğıt
rahat
4,9
4
Kâğıt
rahat
5,9
5
Kâğıt
tutorial
2,6
6
Kâğıt
tutorial
5,2
7
Kâğıt
orta
7,2
8
Kâğıt
rahat
2,6
9
Kâğıt
rahat
4,4
10
Kâğıt
orta
6,4
11
Kâğıt
orta
7,2
12
Kâğıt
duvar
10,8
13
Ahşap
tutorial
1,6
14
Ahşap
rahat
5,3
15
Ahşap
rahat
4,0
16
Ahşap
orta
7,0
17
Ahşap
rahat
5,9
18
Ahşap
orta
7,5
19
Ahşap
orta
7,6
20
Ahşap
duvar
10,6
21
Ahşap
rahat · breather
4,4
22
Ahşap
orta
7,3
23
Ahşap
orta
7,5
24
Ahşap
duvar
10,6
25
Bakır
tutorial
1,0
26
Bakır
rahat
5,1
27
Bakır
rahat
5,0
28
Bakır
orta
8,7
29
Bakır
rahat
4,5
30
Bakır
orta
7,7
31
Bakır
orta
7,4
32
Bakır
duvar
10,5
33
Bakır
rahat · breather
4,5
34
Bakır
orta
7,6
35
Bakır
orta
7,6
36
Bakır
duvar
10,6
37
Cam
tutorial
1,5
38
Cam
rahat
5,4
39
Cam
orta
7,6
40
Cam
orta
7,6
41
Cam
rahat
4,8
42
Cam
orta
8,3
43
Cam
orta
7,5
44
Cam
duvar
10,5
45
Cam
rahat · breather
5,3
46
Cam
orta
7,6
47
Cam
orta
7,9
48
Cam
orta
7,5
49
Keçe
rahat
6,0
50
Keçe
orta
8,2
51
Keçe
rahat
5,8
52
Keçe
orta
8,0
53
Keçe
orta
8,5
54
Keçe
duvar
10,8
55
Keçe
rahat · breather
6,0
56
Keçe
orta
8,9
57
Keçe
orta
8,9
58
Keçe
orta
7,9
59
Keçe
orta
7,9
60
Keçe
duvar
10,5
61
Taş
rahat
4,4
62
Taş
rahat
4,6
63
Taş
orta
7,5
64
Taş
rahat
4,9
65
Taş
orta
7,6
66
Taş
orta
7,4
67
Taş
orta
7,5
68
Taş
duvar
9,3
69
Taş
rahat · breather
4,7
70
Taş
orta
7,1
71
Taş
orta
8,4
72
Taş
orta
8,7
73
Neon
rahat
4,6
74
Neon
orta
7,5
75
Neon
orta
7,5
76
Neon
orta
7,4
77
Neon
orta
8,0
78
Neon
duvar
11,9
79
Neon
rahat · breather
5,5
80
Neon
orta
7,4
81
Neon
orta
7,4
82
Neon
orta
8,4
83
Neon
orta
7,6
84
Neon
duvar
11,0
42. bölüm: sorun, karar, sonuç
42. bölümde iki gizli parçayı asimetrik bir kolla birleştirmek istedim. Bölüm orta banttaydı ve tamamlama hedefim %80’di. Bot testinde ise yalnızca %7’si bitiriyordu. Deneyimli profil bile %3’te kalıyordu. Puan bu sorunu göstermediği için yerleşime daha yakından baktım.
Eski düzen
Sağdaki tek kanca +3’te. İki parçanın ağırlığı gizli.“?” +3’e asılınca 4 çıkıyor: 4 × 3 = 12, eşik 6. Kol kayıyor.
Eski çözümden bir ara durum: 4’lük parça +3’te, dengeyi soldaki
yükler sağlıyor.
Botların %7’si geçiyordu
Yeni düzen (oyunda)
Sağa +1 kancası ekledim. Gizli 4’lük parçayı 3 yaptım.Son parçadan önce sol taraf 8, sağ taraf 2 çekiyor. Fark 6 olduğu için kol kaymıyor.
Botların %82’si geçiyor
42. bölümün iki hâli. Ekran görüntülerini oyundan aldım. Eski düzeni, yedekteki bölüm dosyasıyla açtım.
Sorun: ağırlığı öğrenmek ve doğru sırayı bulmak
Gizli 4’lük parçanın son yerleşimde gidebildiği tek kanca +3’tü. Orada 12 birim çekiyor, kayma eşiği ise 6. Erken asınca kol kayıyor. Üstelik iki “?” parçasından hangisinin ağır olduğunu asana kadar bilmiyorsun. Her dengeli yerleşimde 24 sıranın yalnızca 4’ü kaymadan bitiyordu.
Eski düzende parçayı merkeze yakın bir kancada tartıp sonra taşımak veya geri almak mümkündü. Botlar, ağırlığı öğrenmeyle yerleştirme sırasının birlikte zorlaştığı bu düzende takılıyordu. Ben de bu iki kararı yeniden ele aldım. İnsanların aynı yerde zorlanıp zorlanmadığını bu testle öğrenmiş olmadım.
Değişiklik: daha fazla güvenli seçenek
Sağa +1 kancası ekledim ve gizli 4’lük parçayı 3 yaptım. İki gizli parçayı ve asimetrik kolu korudum. Bölümün Terazi’ye gerek kalmadan çözülebilmesini ve orta banttaki yerine yaklaşmasını istedim. Kaymasız sıraların payı 4/24’ten 16/24’e çıktı.
Son yerleşim 3 → −2, 2 → −1, 2 → +1, 2 → +3. Bu gösterim parçaların hangi kancalara gittiğini anlatıyor. Ağırlıkları öğrendikten sonra kullanabileceğin kaymasız sıralardan biri şöyle:
Adım
Hamle
Kolun toplam torku
1
3 → −2
−6
2
2 → +1
−4
3
2 → −1
−6
4
2 → +3
0
Bu sıranın hiçbir adımında mutlak tork 6’yı aşmıyor. Çözücünün bulduğu yerleşimi güvenle kurabildiğimizi buradan görebiliyoruz. Gizli ağırlıkları nasıl keşfedeceğimizi ise bu sıra tek başına anlatmıyor.
Sonuç ve öğrendiğim şey
Eski düzen
Yeni düzen
Kancalar
−3, −2, −1, +3
−3, −2, −1, +1, +3
Parçalar
2, 2, gizli 2, gizli 4
2, 2, gizli 2, gizli 3
Olası yerleşim / dengede kalan
24 / 6
120 / 6
Kaymadan biten sıra
24’te 4
24’te 16
Zorluk puanı
7,5
8,3
Karma tamamlama
%7
%82
Acemi / sıradan / deneyimli
%10 / %6 / %3
%72 / %82 / %98
İlk karşılaştırmada eski ve yeni düzeni aynı bölüm testiyle ölçtüm. Her düzen için üç bot profili ve üç ayrı rastgele seed kullandım. Her profil her seed’de 300 kez çalıştı. Bu, profil başına 900, düzen başına 2.700 koşu demek. İki düzen birlikte 5.400 koşudan oluşuyor. Tablodaki yuvarlanmış yüzdeler bu ölçüme ait. Çözücünün bulduğu 6 dengeli yerleşimde ağırlıkların dağılımı aynı. Üç ayrı 2’lik parça yer değiştirdiği için çözücü bunları ayrı sayıyor.
Puan 7,5’ten 8,3’e yükseldi, ama botların tamamlaması da %7’den %82’ye çıktı. Yeni kanca olası yerleşim sayısını artırdığı için formül daha yüksek puan veriyordu. Botlar ise artan güvenli sıralar sayesinde daha kolay bitiriyordu. Bu bölümde yalnızca seçenek sayısına bakmanın yetmediğini gördüm. Oyuncunun hangi bilgiyi ne zaman edindiği de zorluğu etkiliyor.
Sonra hata olasılığını, sabrı ve önizlemeye dikkati ayrı ayrı değiştirip tekrar test ettim. Yedi ayarda eski düzenin karma tamamlaması %6,8–7,5, güncel düzeninki %82,0–82,9 arasındaydı. Artış üç profilin her birinde görüldü. Değişiklik, denediğim bot ayarlarında da işe yaradı. Gerçek oyuncular üzerindeki etkisini henüz ölçmedim.
Test ve iyileştirmeler
Bölümlerdeki tasarım varsayımlarımı botlarla sınadım. Önce her bölümü ayrı ayrı, sonra 84 bölümlük ilerlemeyi test ettim. Böylece beklemediğim sıkışmaları bulup değişikliklerin sonucunu aynı koşullarda karşılaştırabildim.
Bot profilleri ve test yöntemi
Acemi, sıradan ve deneyimli olmak üzere üç profil kullanıyorum. Karma sonuçta paylarını %30, %50 ve %20 olarak belirledim. Bu dağılımı, hata olasılıklarını ve sabır sürelerini ben seçtim. Gerçek oyunculardan ölçülmüş değerler değiller. Acemi profil önizlemeye daha az dikkat ediyor. Deneyimli profil iki hamle ileriyi değerlendiriyor.
Üç profil de hamleleri dengeye katkısına göre seçiyor. Gizli ağırlığı asana kadar bilmiyorlar. Yalnızca Geri Al kullanabiliyorlar, Kilit ve Terazi bu modelde yok. Parçaları taşımayı ve sökmeyi baştan biliyorlar. Acemi profil de ilerledikçe öğrenmiyor. Bu nedenle bu verilerle öğretimin anlaşılırlığı, eğlence veya D1 oyuna geri dönüş hakkında sonuç çıkarmıyorum.
Acemi (%30). Seçimleri daha dağınık. Parçaların %8’ini yanlış kancaya bırakıyor ve önizlemeye yarı yarıya bakıyor. Kartları sık unutuyor. Gizli parçayı merkeze yakın tartmayı nadiren seçiyor. Sabrı 3 dakika.
Sıradan (%50). Parçaların %5’ini yanlış kancaya bırakıyor. Önizlemeye çoğunlukla bakıyor. Kayma olduğunda yarı yarıya Geri Al kullanıyor. Sabrı 4 dakika.
Deneyimli (%20). İki hamle ileriyi hesaplıyor. Önizlemeye neredeyse her zaman bakıyor ve kart koşullarına tam ağırlık veriyor. Gizli parçayı çoğunlukla önce merkeze yakın tartıyor. Sabrı 6 dakika.
Bu kısımdaki testler ve ölçüler
Bölüm testi
Her profil her bölümü, üç ayrı rastgele seed’de 300’er kez oynuyor. Profil başına 900, bölümün her düzeni için toplam 2.700 koşu var. Grafikler ve değişiklik tablosu bu testten geliyor. Burada bölümlerin tek başına nasıl sonuç verdiğine bakıyorum.
Karma tamamlama
Bölümü bitiren koşuların ağırlıklı oranı. Aceminin payı %30, sıradanın %50, deneyimlinin %20.
Bant dışı
Karma tamamlama, bandın hedefinden 10 yüzde puanından fazla uzaksa bölümü bant dışı sayıyorum.
Sırayla oynama testi
4.000 bot koşusu, dört grup × 1.000 olacak şekilde oyuna baştan başlıyor. Bir bölümü iki oturumda bitiremeyen koşu sona eriyor. Böylece bu modelde ilerlemenin nerede durduğunu ve pirinç ekonomisinin nasıl işlediğini görebiliyorum.
Bot A/B testi
10.000 botu, kimliklerinden hesaplanan sabit bir değerle iki gruba ayırıyorum. Her grup kendi Remote Config ayarlarıyla oynuyor. İlerleme ve bırakma kuralları, sırayla oynama testiyle aynı.
Sıra korelasyonu
Zorluk puanı sıralamasıyla tamamlama sıralamasını Spearman katsayısıyla karşılaştırıyorum. −1, puan yükseldikçe tamamlamanın her zaman düştüğü anlamına geliyor.
İlk testte gördüğüm sorunlar
İlk testte 12 bölüm, tamamlama hedefinin 10 yüzde puanından fazla altında kaldı. 46 bölüm ise hedefin bu kadar üstündeydi. Rahat veya orta olmasını istediğim bazı bölümler, botları duvar bölümlerinden daha çok zorluyordu.
42 ve 70: İkisi de orta banttaydı. Hedefim %80 iken bot sonuçları %7 ve %8 oldu.
14, 15 ve 17: Rahat bölüm hedefim %88’di. Sonuçlar %36–45 arasında kaldı.
12: İlk serginin finali. Sırayla oynama testinde buraya ulaşan bot koşularının %51,7’si bu bölümde sona eriyordu. Başlangıç grubunun %47,6’sı 13. bölüme ulaşıyordu.
68, 78 ve 84: Duvar olarak tasarladığım bu bölümler, hedefimin çok üzerinde tamamlanıyordu.
İlk testte 84 bölümün tamamlanma oranı
Hedefin 10 puandan fazla altında
Hedefe yakın
Hedefin 10 puandan fazla üstünde
Nefes alma bölümü (duvarın hemen ardından)
Karma tamamlama
%0%25%50%75%100
Kâğıt1–12
Ahşap13–24
Bakır25–36
Cam37–48
Keçe49–60
Taş61–72
Neon73–84
Grafikteki değerler
Bölüm
Bant
Tamamlama
Hedef
1
tutorial
%100
%95
2
tutorial
%100
%95
3
rahat
%100
%90
4
rahat
%96
%88
5
tutorial
%98
%95
6
tutorial
%100
%92
7
orta
%97
%80
8
rahat
%99
%88
9
rahat
%100
%88
10
orta
%97
%80
11
orta
%94
%80
12
duvar
%28
%60
13
tutorial
%100
%95
14
rahat
%43
%88
15
rahat
%36
%88
16
orta
%77
%80
17
rahat
%45
%88
18
orta
%54
%80
19
orta
%98
%80
20
duvar
%36
%60
21
rahat · breather
%100
%88
22
orta
%96
%80
23
orta
%100
%80
24
duvar
%62
%60
25
tutorial
%98
%95
26
rahat
%100
%88
27
rahat
%99
%88
28
orta
%95
%80
29
rahat
%100
%88
30
orta
%100
%80
31
orta
%87
%80
32
duvar
%63
%60
33
rahat · breather
%100
%88
34
orta
%100
%80
35
orta
%99
%80
36
duvar
%32
%60
37
tutorial
%100
%95
38
rahat
%100
%88
39
orta
%100
%80
40
orta
%100
%80
41
rahat
%100
%88
42
orta
%7
%80
43
orta
%99
%80
44
duvar
%74
%60
45
rahat · breather
%100
%88
46
orta
%100
%80
47
orta
%44
%80
48
orta
%100
%80
49
rahat
%97
%88
50
orta
%93
%80
51
rahat
%93
%88
52
orta
%100
%80
53
orta
%89
%80
54
duvar
%60
%60
55
rahat · breather
%94
%88
56
orta
%84
%80
57
orta
%82
%80
58
orta
%65
%80
59
orta
%97
%80
60
duvar
%69
%60
61
rahat
%100
%88
62
rahat
%100
%88
63
orta
%99
%80
64
rahat
%95
%88
65
orta
%98
%80
66
orta
%89
%80
67
orta
%98
%80
68
duvar
%92
%60
69
rahat · breather
%100
%88
70
orta
%8
%80
71
orta
%92
%80
72
orta
%100
%80
73
rahat
%100
%88
74
orta
%100
%80
75
orta
%98
%80
76
orta
%84
%80
77
orta
%60
%80
78
duvar
%80
%60
79
rahat · breather
%100
%88
80
orta
%97
%80
81
orta
%83
%80
82
orta
%98
%80
83
orta
%75
%80
84
duvar
%85
%60
15 bölümde yaptığım değişiklikler
Arama aracım ağırlık, kanca, alt kol, sabit yük ve rüzgâr değişikliklerini tek tek ve ikişerli deniyor. Çözücü geçersiz adayları eliyor, botlar kalanları oynuyor. Hedefime yaklaşan seçenekler arasında bölümün öğretmek istediği kuralı koruyanı seçtim. 12 bölümü kolaylaştırdım. Fazla kolay kalan üç duvarı da zorlaştırdım.
Hangi bölümde neyi değiştirdim?
Bölüm
Değişiklik
Bant
Karma tamamlama
Hedef
12 · Kâğıt
Alt kola +2 kancası eklendi.
duvar
%28 → %59
%60
14 · Ahşap
+3 kancasının kilidi açıldı, 4’lük parça 3 oldu.
rahat
%43 → %98
%88
15 · Ahşap
Alt kol −1’den +2’ye taşındı.
rahat
%36 → %99
%88
17 · Ahşap
Kola +3 kancası eklendi.
rahat
%45 → %85
%88
18 · Ahşap
Alt kol +1’den −1’e taşındı.
orta
%54 → %75
%80
20 · Ahşap
Sol alt kol −2’den −1’e taşındı, ona +2 kancası eklendi.
duvar
%36 → %58
%60
36 · Bakır
Kola −3 kancası eklendi, boştaki kolun −1 kancası kilitlendi.
duvar
%32 → %56
%60
42 · Cam
Kola +1 kancası eklendi, gizli 4’lük parça 3 oldu.
orta
%7 → %82
%80
47 · Cam
Kola −2 kancası eklendi, iki gizli parçadan biri açık oldu.
orta
%44 → %68
%80
58 · Keçe
Kilitli kanca +1’den +2’ye taşındı.
orta
%65 → %72
%80
70 · Taş
−1’deki sabit parça 5’ten 4’e indi.
orta
%8 → %87
%80
77 · Neon
Bir 1’lik parça 2 oldu.
orta
%60 → %85
%80
68 · Taş
Ana koldaki rüzgâr 2’den 1’e indi, bir 3’lük parça 2 oldu.
duvar
%92 → %56
%60
78 · Neon
2’lik parça 3 oldu.
duvar
%80 → %63
%60
84 · Neon
Alt kol −1’den +3’e taşındı.
duvar
%85 → %64
%60
Her satırda değiştirdiğim bir bölüm ve onun tamamlama hedefine uzaklığı var. Ortadaki çizgi hedefi gösteriyor. Yeşil alan, hedeften en fazla 10 puan uzak olan sonuçları kapsıyor. Oklar eski düzenin sonucundan güncel düzene gidiyor.
Grafik ve tablolardaki yüzdeleri yuvarladım. 14. bölüm üst sınırda kaldı. 15. bölüm hâlâ fazla kolay, 47. bölüm ise fazla zor. Bot sonucunun hedefe yaklaşması, bölümün gerçek oyuncular için iyi olduğu sonucunu vermiyor.
Yeniden testten sonra
Hedefinin çok altında kalan bölüm sayısı 12’den 1’e indi. Kalan bölüm 47. Hedefi %80, sonucu %68.
Zorluk puanıyla bot tamamlama sıralaması arasındaki ilişki −0,50’den −0,65’e çıktı. Sıralama bu bot modelinde daha tutarlı hâle geldi. Gerçek oyuncuların zorluk deneyimini bununla doğrulamış olmadım.
Sırayla oynama testinde 13. bölüme ulaşma %47,6’dan %81,8’e çıktı. Oyunu bitirme oranı da %0’dan %14,2’ye yükseldi.
Bırakmanın en yüksek olduğu bölümler artık çoğunlukla planladığım duvarlar: 20, 36, 12, 68 ve 24. Cam sergisinde 47. bölüm, serginin duvarından hâlâ biraz daha zor.
Değişiklikten önce
Değişiklikten sonra
13. bölüm · Ahşap%47,6 →
%81,825. bölüm · Bakır%5,1 → %4937. bölüm · Cam%2,3 →
%34,449. bölüm · Keçe%0,08 →
%28,761. bölüm · Taş%0,05 →
%21,373. bölüm · Neon%0 → %18Oyunu bitiren%0 → %14,2%0%25%50%75botların
Grafikteki değerler
Ulaşılan nokta
Önce
Sonra
13. bölüm · Ahşap
%47,6
%81,8
25. bölüm · Bakır
%5,1
%49
37. bölüm · Cam
%2,3
%34,4
49. bölüm · Keçe
%0,08
%28,7
61. bölüm · Taş
%0,05
%21,3
73. bölüm · Neon
%0
%18
Oyunu bitiren
%0
%14,2
Bu ilk değişiklikleri oyunun bölüm dosyalarına işledim. Grafikler, aynı bot modeliyle yaptığım ilk karşılaştırmayı gösteriyor. Ardından seçtiğim bölümleri farklı davranış ayarları ve yeni rastgele seed’lerle tekrar kontrol ettim. O çalışmayı aşağıda ayrı anlattım.
Davranış ayarları değişince sonuç korunuyor mu?
9 Ekim 2026’da mevcut üç profili farklı ayarlarla yeniden çalıştırdım. Yanlış bırakma olasılığını önce yarıya indirdim, sonra 1,5 katına çıkardım. Sabır süresini %75 ve %125 olarak denedim. Önizlemeye dikkati de 20 puan azaltıp 15 puan artırdım. Her seferinde tek ayarı değiştirdim ve dikkat değerlerini %0–100 arasında tuttum.
Yedi ayar senaryosu ve üç yeni rastgele seed kullandım. Her seed’de profil başına 200 koşu var. Bu, her düzen ve senaryo için profil başına 600 koşu, bütün çalışma için 63.000 bölüm denemesi demek. Eski ve yeni düzende profil ayarları, Geri Al stoku ve başlangıç seed’leri aynıydı.
Bölüm
Eski düzen
Bugünkü düzen
Sonuç
42
%6,8–7,5
%82,0–82,9
Artış bütün ayarlarda ve üç profilde korundu.
70
%7,4–7,9
%84,9–88,5
Sabit ağırlığı azaltmanın etkisi bütün ayarlarda korundu.
47
Karşılaştırılmadı
%64,7–66,4
Bütün ayarlarda %80 hedefinin altında kaldı.
Tablodaki aralıklar, %30 acemi / %50 sıradan / %20 deneyimli karışımının yedi ayardaki en düşük ve en yüksek tamamlamasını gösteriyor. Bunlar güven aralığı veya gerçek oyuncu tahmini değil. Acemi ağırlıklı (%60/%30/%10) ve deneyimli ağırlıklı (%10/%40/%50) karışımlarla da yeniden hesapladım. 42 ve 70’te artış devam etti. 47’yi yeniden düzenlemem gerekiyor.
42 ve 70’in eski düzenlerini kayıtlı değişiklik notlarından yeniden kurdum. Oyunun güncel bölüm dosyalarını ve bot kodunu değiştirmedim. 47’nin eski hâlinde ikinci gizli parçanın hangisi olduğu notlarda belli olmadığı için eski düzenini varsayarak karşılaştırmaya eklemedim. Bu çalışma, sonuçların denediğim bot ayarlarında tutarlı kalıp kalmadığını kontrol ediyor.
Profil sonuçları ve tekrar ayarları
Her ayarda üç seed’in sonucunu birleştirdim: 202610091, 202610092 ve 202610093. Her seed’de profil başına 200 koşu, her ayarda profil başına 600 koşu var. Aşağıda yedi ayarın en düşük ve en yüksek tamamlama oranlarını paylaşıyorum. Bu aralıklar güven aralığı değil.
Bölüm / düzen
Acemi
Sıradan
Deneyimli
42 · eski
%8,5–%10,0
%7,3–%8,8
%2,0–%2,7
42 · güncel
%70,3–%74,8
%81,0–%83,5
%99,3–%99,5
70 · eski
%12,2–%13,3
%7,0–%7,7
%1,0–%1,3
70 · güncel
%69,0–%75,7
%89,3–%93,2
%97,2–%98,5
47 · güncel
%48,5–%52,3
%65,2–%68,0
%83,2–%84,2
Önizlemeyi açık, kayma eşiği payını sıfır ve başlangıç Geri Al stokunu 3 tuttum. Diğer profil ayarları da sabitti. Her koşu seed + level × 10007 + profile_index × 1009 + trial × 17 ile başlıyor. Botlar farklı hamleler seçtiğinde rastgele sayı akışı sonradan ayrışabiliyor. Kaydedilen süreler modelin bot süresi, ölçülmüş oyuncu süresi değil. Bu test, ayarların bütün birleşimlerini veya başka karar modellerini kapsamıyor.
Önizleme: botlarla A/B testi
Önizleme, parçayı bırakmadan önce kolun nasıl eğileceğini gösteriyor. Bu yardımı kapatınca botların sonuçlarının nasıl değiştiğine baktım. Deneyin grup atamasını, ölçümlerini ve analiz akışını da bu karşılaştırmayla kontrol ettim.
Hipotez ve deney planı
Önizleme kapanınca daha fazla kayma olmasını, Geri Al ihtiyacının artmasını ve ilk sergiyi bitirmenin zorlaşmasını bekledim. Ana ölçüm olarak 13. bölüme ulaşmayı seçtim. Ekonomiyi kontrol etmek için de pirinçle satın alınan Geri Al sayısını izledim.
Grup ataması: 10.000 botu, kimliklerinden hesaplanan sabit bir değerle iki gruba ayırdım. Kontrol grubunda önizleme açık, deney grubunda kapalıydı.
Analiz: Planı testi çalıştırmadan önce yazdım. İki taraflı test ve α = 0,05 kullandım. %95 güven aralıklarını bot kimliği düzeyinde hesapladım. Tamamlama oranlarında normal yaklaşım, deneme başına oranlarda 2.000 tekrarlı bootstrap, ortalamalarda Welch testi kullandım. Bootstrap örneklemesini de bot kimliği düzeyinde yaptım.
Veri kontrolü: Önce iki grubun da önizlemeyi kullandığı bir A/A testi yaptım. 50/50 dağılımından küçük sapmalar beklenebilir. SRM kontrolünde ki-kare p < 0,001 çıkarsa grup atamasını incelemeden sonucu kullanmıyorum.
A/A testinde gruplarda 5.021 ve 4.979 bot vardı. SRM sorunu veya metriklerde anlamlı fark görülmedi. O koşuda grup ataması ve analiz akışında belirgin bir sorun sinyali bulmadım. Bu kontrol, botların insanlara benzediğini göstermiyor. Ana A/B testinde gruplar 4.984 ve 5.016 bottan oluştu.
Metrik
Önizleme açık
Önizleme kapalı
Fark (%95 güven aralığı)
13. bölüme ulaşan bot oranı (birincil)
%82,6
%81,2
−1,4 puan (−2,9 ile +0,1)
Bot başına geçilen bölüm
36,7
36,4
−0,3 (−1,3 ile +0,7)
Deneme başına kayma
0,103
0,261
+0,159 (+0,154 ile +0,164)
İlk oturumda geçilen bölüm
%92,34
%92,37
+0,02 puan (−0,16 ile +0,20)
Oyunu bitiren bot
%13,8
%14,4
+0,6 puan (−0,8 ile +1,9)
Bot başına pirinçle alınan Geri Al
0,30
2,44
+2,14 (+2,04 ile +2,24)
Farkı, önizleme kapalı grubun sonucundan açık grubun sonucunu çıkararak hesapladım. Oran farkları yüzde puanı cinsinden. Tablodaki yüzdeler ve ortalamalar yuvarlanmış, farklar ise yuvarlanmamış değerlerden geliyor. Bütün sonuçlar bot simülasyonuna ait.
Bunu nasıl yorumladım?
Önizlemeyi kapatınca deneme başına kayma yaklaşık 2,5 katına çıktı. Pirinçle alınan Geri Al da bot başına 0,30’dan 2,44’e yükseldi. İlk sergiyi bitirme oranı 1,4 yüzde puanı düştü. Bu farkın güven aralığı −2,9 ile +0,1, p = 0,07. Sonuç, küçük bir düşüşle de sıfıra yakın bir farkla da uyumlu. İki ayarın aynı olduğunu buradan söyleyemiyorum.
Bot modelinde önizlemeyi kapatmak, hamle seçiminde kayma riskine verilen ağırlığı azaltıyor. Bot, önizleme kapalı olsa da hamlenin dengeye etkisini koddan hesaplayabiliyor. Dolayısıyla burada ölçtüğüm şey, bu karar modelinde kayma riskini dikkate almanın etkisi. Gerçek oyuncuların önizleme olmadan nasıl düşündüğünü aynı şekilde temsil edemiyorum.
Önizlemeyi varsayılan olarak açık bırakmaya karar verdim. Botlarda kayma ve Geri Al ihtiyacı arttı, ama ilk sergiyi bitirme üzerindeki sonuç belirsiz kaldı. Daha fazla booster tüketilmesini tek başına olumlu bir ürün sonucu olarak görmedim. Bu kararı bot sonuçları ve öğretim hedefimle verdim. Gerçek oyuncularda bir iyileşme ölçmüş olmadım.
Ek kontroller ve örneklem hesabı
Sonradan eklediğim eşleştirilmiş kontrolde aynı 10.000 bot senaryosunu iki ayarla da çalıştırdım. 13. bölüme ulaşma farkı −1,6 yüzde puanıydı. %95 güven aralığı −2,7 ile −0,6 arasındaydı. Bu, model içinde küçük bir etkiye işaret ediyor. Ana testin belirsizliğini veya insan davranışını temsil etme sınırını ortadan kaldırmıyor.
Örneklem hesabını da yöntemi denemek için yaptım. Bu etki ve yaklaşık %82 başlangıç oranıyla, iki taraflı α = 0,05 ve %80 güç varsayımında grup başına yaklaşık 8.800 oyuncu gerekiyor. Etki yarıya düşerse sayı 34.600 oluyor. Bunlar simülasyondan çıkardığım senaryolar. Bu kadar oyuncuya erişimim olmadığı için şu anda canlı deney planlamıyorum. İleride test yapabilirsem hesabı gerçek pilot verisi ve ölçmeye değer bulduğum en küçük farkla yeniden kuracağım.
Acemi profilin sonucuna sonradan ayrıca baktım. 13. bölüme ulaşma %71,9’dan %67,8’e indi, p = 0,01. Bu karşılaştırmayı baştan planlamadığım için keşif amaçlı bir bulgu olarak değerlendiriyorum. Yeni bir deneyde profil kırılımlarını ve karşılaştırmaları önceden belirleyeceğim.
Botlar Remote Config değerlerini oyunun kullandığı Tuning kodundan okuyor. Önizleme kapalıyken kayma riskinin hamle puanındaki ağırlığı değişiyor. Denge hesabı ise devam ediyor. Çalışırken eşik payının ilk beş bölümde kaymayı yanlışlıkla açabileceğini fark ettim. Bunu düzelttim ve tekrar bozulmaması için test ekledim.
PlayerBot.cs ve BotAbTest.cs · önizleme ayarı ve grup ataması
// Remote Config can switch the preview off (preview_enabled); then the bot can't look at it either.bool watching = Tuning.PreviewEnabled && rng.NextDouble() < p.PreviewAttention;
// Firebase A/B Testing splits real players on its own servers. Bots get the same kind of split:// a bucket from a hash of the experiment name and the player id, so a player never changes group.publicstaticint Bucket(string experiment, int playerId)
{
uint h = 2166136261;
foreach (char c in experiment + ":" + playerId) { h ^= c; h *= 16777619; }
return (int)(h % 100);
}
İlk plan ve uyguladığım analiz
İlk planı testi çalıştırmadan önce, 8 Ekim’de yazdım. Grup atamasında h2:<bot kimliği> için FNV-1a değerinin 100’e göre kalanını kullandım. 0–49 önizleme açık, 50–99 kapalı gruba gidiyor. Seed 20261008, güncel 84 bölüm ve %30 acemi / %50 sıradan / %20 deneyimli karışımıyla çalıştım. Bölüm başına en fazla iki oturum var. İlk planda ortalamalar için de bootstrap yazmıştım. Uygulamada ortalamalar için Welch testi, deneme başına oranlar için bot kimliği düzeyinde 2.000 tekrarlı bootstrap kullandım. Bu yöntem değişikliğini burada açıkça belirtiyorum.
SQL ve Excel
Önizleme A/B testinde 10.000 bot toplam 402.495 deneme yaptı. Sonuçları üç tabloya aktarıp SQL’le inceledim. Aşağıdaki sorgular SQLite’ta çalışıyor.
players: Her satır bir botu gösteriyor. Grubu, profili, geçtiği bölüm sayısı, bıraktığı bölüm, kayma sayısı, pirinçle aldığı Geri Al ve kazandığı veya harcadığı pirinç burada.
attempts: Her satır bir bölüm denemesi. Bölüm numarası, kaçıncı deneme olduğu, kazanma durumu, kayma ve Geri Al sayısı burada.
levels: Her bölümün sergisi ve zorluk bandı burada. Bantlar tabloda tutorial, easy, medium ve wall olarak kayıtlı.
1. Önizleme kapatılınca ne değişiyor?
SQL · A/B testi verisi
-- Önizleme açık ve kapalı gruplar nasıl karşılaştırılıyor?SELECT ab_group,
COUNT(*) AS bots,
ROUND(100.0 * SUM(CASEWHEN levels_cleared >= 12THEN1ELSE0END) / COUNT(*), 1) AS reached_13_pct,
ROUND(1.0 * SUM(slips) / SUM(attempts), 3) AS slips_per_attempt,
ROUND(AVG(undo_bought), 2) AS undo_bought_avg
FROM players
GROUPBY ab_group
ORDERBY ab_group DESC;
ab_group
bots
reached_13_pct
slips_per_attempt
undo_bought_avg
h2_preview
4984
82.6
0.103
0.3
h2_no_preview
5016
81.2
0.261
2.44
Sorgu ne yapıyor?players tablosunu önizleme açık (h2_preview) ve kapalı (h2_no_preview) olarak ayırıyor. Her grupta bot sayısını, 13. bölüme ulaşma oranını, deneme başına kaymayı ve pirinçle alınan ortalama Geri Al’ı hesaplıyor. CASE WHEN, en az 12 bölüm geçen botları 1, diğerlerini 0 sayıyor.
Ne gördüm? Önizleme kapanınca kayma 2,5 katına çıktı. Pirinçle alınan Geri Al 0,30’dan 2,44’e yükseldi. 13. bölüme ulaşma ise %82,6’dan %81,2’ye, yani 1,4 puan düştü. Bu küçük farkı A/B testi kısmında istatistiksel olarak da inceledim. Sonuç belirsiz kaldı.
2. Botlar hangi tür bölümde bırakıyor?
SQL · A/B testi verisi
-- Botlar oyunu hangi tür level'da bırakıyor? (önizleme açık grup)SELECT l.band,
COUNT(*) AS bots_quit
FROM players p
JOIN levels l ON l.level = p.stopped_at_level
WHERE p.ab_group = 'h2_preview'AND p.finished = 0GROUPBY l.band
ORDERBY bots_quit DESC;
band
bots_quit
wall
3212
medium
963
easy
114
tutorial
5
Sorgu ne yapıyor? Önizlemesi açık grupta oyunu bitirmeyen botları seçiyor. JOIN ile bıraktıkları bölümü levels tablosunda buluyor. Sonra her bantta kaç botun bıraktığını sayıyor.
Ne gördüm? Bırakan 4.294 botun 3.212’si, yani %75’i bir duvarda bıraktı. Oyundaki 84 bölümün 11’i duvar. Rahat bölümlerde bırakan bot neredeyse yok. Baskının duvarlarda toplanmasını istemiştim. Bu modelde sonuç o plana yaklaştı.
3. Bir bot ne kadar pirinç kazanıyor, ne kadar harcıyor?
SQL · A/B testi verisi
-- Bir bot ortalama ne kadar pirinç kazanıyor, ne kadar harcıyor? (önizleme açık grup)SELECT bot_profile,
COUNT(*) AS bots,
ROUND(AVG(brass_earned)) AS earned_avg,
ROUND(AVG(brass_spent)) AS spent_avg
FROM players
WHERE ab_group = 'h2_preview'GROUPBY bot_profile
ORDERBY earned_avg;
bot_profile
bots
earned_avg
spent_avg
novice
1514
964.0
12.0
casual
2474
1798.0
17.0
expert
996
2237.0
1.0
Sorgu ne yapıyor? Önizlemesi açık gruptaki botları profillerine göre ayırıyor. Her profil için kazanılan ve harcanan pirincin ortalamasını hesaplıyor.
Ne gördüm? Sıradan profil ortalama 1.798 pirinç kazanıp 17’sini harcadı. Deneyimli profil 2.237 kazanıp 1 harcadı. Bu modelde pirinç, harcandığından çok daha hızlı birikiyor. Ekonomi kısmındaki riskin sayısal karşılığı da bu. Botların yalnızca Geri Al satın aldığını, Kilit ve Terazi kullanmadığını burada hesaba katıyorum.
Excel çalışma kitabı
Aynı veriyi Excel’de de inceledim. Players sayfasında her satır bir botu gösteriyor. Diğer sayfaları buradan hesapladım. COUNTIFS ile koşullara uyan satırları saydım, AVERAGEIFS ile ortalamalarını aldım. AB test sayfasında iki grubun genel sonucunu ve profil kırılımlarını karşılaştırdım. Acemi botlarda 13. bölüme ulaşma %71,9’dan %67,8’e indi. Funnel sayfası her bölüme başlayan bot sayısını, Economy sayfası ise sergi başına pirinci gösteriyor.
Excel · iki formül
Funnel!D2 · level’a başlayan bot = bir önceki level’ı geçen bot (önizleme açık)
=COUNTIFS(Players!B:B, "h2_preview", Players!D:D, ">="&(A2-1))
AB test!G3 · A3’teki profilde pirinçle alınan ortalama Geri Al (önizleme açık)
=AVERAGEIFS(Players!I:I, Players!B:B, "h2_preview", Players!C:C, A3)
Excel’deki AB test sayfası. Farkın en çok acemi profilde görüldüğünü buradan okuyabiliyorum. Görseli büyütmek için üzerine tıklayabilirsin.
Bu bölümdeki bütün tablolar bot verisinden geliyor. İnsan katılımcıların sonuçlarını içermiyor.
Analitik ve ürün kararları
Bölüm ve ekonomi kararlarını ileride oyuncu verisiyle inceleyebilmek için Firebase Analytics, Crashlytics ve Remote Config’i kurdum. Bu sayfada paylaştığım sonuçlar yerel bot testlerinden geliyor. Firebase’de toplanmış gerçek oyuncu sonuçları yok.
Veriden karara
Aradığım sinyal
İnceleyeceğim veriler
Deneyebileceğim değişiklik
İlk kaymadan sonra çıkışlar artıyor
arm_slip, level_quit, t_since_last_slip
Kaymanın ekranda nasıl gösterildiğini ve ardından çıkan ipucunu gözden geçirmek
Gizli parçalar sıkça uç kancaya asılıyor
piece_hang, arm_slip
Merkeze yakın tartmayı bölüm düzeninde daha açık göstermek
Bir bölümde booster ihtiyacı artıyor
booster_use, level_complete
Bölümün bandını, öğrenilmesi gereken bilgiyi ve güvenli sıralarını incelemek
Mağaza açılıyor, ama satın alma tamamlanmıyor
shop_open, iap_*
Teknik hataları kontrol edip teklifin zamanını ve sunduğu değeri incelemek
Düşük FPS’te bırakma artıyor
Bölüm olayları, FPS ve Crashlytics
Aynı bölümü farklı cihaz gruplarında karşılaştırmak
Bu tablo, kurduğum ölçümlerle ileride sorabileceğim soruları ve deneyebileceğim değişiklikleri gösteriyor. İki olayın birlikte görülmesi, birinin diğerine neden olduğunu kanıtlamıyor. Yeterli oyuncu verisi toplayabilirsem bu soruları gözlem ve uygun deneylerle inceleyeceğim.
Kaydettiğim olaylar ve ölçüm ayrıntıları
30’dan fazla olay kaydediyorum. Bunlar yerel dosyaya da yazılıyor. Böylece editörde ve testlerde Firebase bağlantısı olmadan kontrol edebiliyorum. Bölüm tasarımı ve ekonomi için kullandığım başlıca olaylar şunlar:
Olay
Ne zaman
Gönderilen bilgiler
Cevapladığı soru
level_start
Bölüm açıldı
bölüm, deneme numarası, tekrar durumu, bant, pirinç
Oyuncular nereye kadar geliyor?
piece_hang
Parça asıldı
ağırlık, gizli mi, kanca, kol, asıştan sonraki tork
süre, kayma, kalan dengesizlik, son kaymadan beri geçen süre, sebep
Oyuncu bir kaymadan hemen sonra mı bırakıyor?
shop_open iap_* ad_rewarded_*
Mağaza ve reklam
bağlam, ürün, fiyat, bölüm
Satın alma ve reklam akışında nerede kayıp oluyor?
config_applied
Remote Config uygulandı
deney grubu, ayarın kaynağı
Hangi oyuncu hangi ayarla oynadı?
level_quit, hiç hamle yapılmadan çıkılan bölümleri kaydetmiyor. Reklam veya satın alma sırasında uygulamanın arka plana geçmesini de dışarıda bırakıyor. Bu yüzden ilk oyuncu akışını yalnızca bu olayla değerlendirmeyeceğim. level_start sonrasında hiç etkileşim olmamasına da ayrıca bakmam gerekiyor.
Son kaymadan beri geçen süre ve FPS ile bırakma anını daha ayrıntılı inceleyebilirim. Performans verisi olası bir soruna işaret edebilir. Oyuncunun neden çıktığını öğrenmek için başka kanıtlara da ihtiyacım var.
AnalyticsService.cs · bölüm yarıda bırakılınca
privatevoid Quit(string reason)
{
var s = Session.State; var d = Session.Current;
if (s == null || d == null) return;
if (s.HangCommands == 0 && s.RemoveCommands == 0 && s.MoveCommands == 0) return;
Analytics.Track("level_quit",
("level_id", d.Id), ("duration", Round(Session.LevelSeconds)), ("slips", s.SlipCount),
("abs_tau_state", Math.Abs(s.Torque(s.Root))), ("hung", s.HungCount),
("t_since_last_slip", _lastSlipAt < 0 ? -1f : Round(Session.LevelSeconds - _lastSlipAt)), ("reason", reason), Fps(), SlowShare(), FpsTarget());
}
Test ayarlarını yönetmek
Remote Config’ten önizlemeyi, gizli parçanın açılma gecikmesini, kayma eşiği payını, değerlendirme isteğini, FPS’i ve deney grubunu yönetiyorum. Fiyatlar ve bölüm düzenleri buradan değişmiyor. Gelen değerler belirlediğim güvenli aralıklarda tutuluyor. Uygulanan ayarı config_applied ile kaydediyorum.
Ayar sınırları, izinler ve test cihazları
Ayar
Sınır
preview_enabled
Açık / kapalı
reveal_delay_s
0,2–1,2 saniye
slip_threshold_bonus
0–4
review_prompt_enabled
Açık / kapalı
frame_rate_mode
Otomatik / 60 / 30
ab_group
Deney grubu etiketi
Tuning.cs · her ayarın sınırı, kısaltılmış
publicstaticbool PreviewEnabled => GetBool(KeyPreviewEnabled);
publicstaticfloat RevealDelaySeconds => Clamp(GetFloat(KeyRevealDelay), 0.2f, 1.2f);
publicstaticint SlipThresholdBonus => (int)Clamp(GetInt(KeySlipThresholdBonus), 0, 4);
publicstaticbool ReviewPromptEnabled => GetBool(KeyReviewPromptEnabled);
// The bonus only raises a threshold that is already on: a level without slipping stays without it.publicstaticint SlipThresholdFor(int levelThreshold) => levelThreshold > 0 ? levelThreshold + SlipThresholdBonus : 0;
Alınan ayarlar cihazda saklanıyor. Önbellekte ayar varsa yeni değerler sonraki açılışta uygulanıyor. Böylece bir oturumun ortasında kurallar değişmiyor.
Veri izinleri başlangıçta kapalı. Gereken bölgelerde izin formu gösteriliyor. Seçimler Firebase’e aktarılıyor ve reklam isteği buna göre açılıyor. iOS izleme izni de izin formundan sonra, reklam yüklenmeden önce ele alınıyor.
Test Lab cihazlarında Analitik toplama kapalı. Crashlytics raporlarına test senaryosu etiketi ekleniyor. Botlar Firebase’e bağlanmıyor. Sonuçlarını yerel dosyalarda saklıyorum ve ileride toplanabilecek oyuncu kayıtlarıyla karıştırmıyorum.
Ekonomi ve para kazanma
Mağazadaki booster’lar, parçayı senin yerine doğru kancaya asmıyor. Geri Al, kaymanın ardından toparlanmayı sağlıyor. Terazi, bilinmeyen ağırlığı gösteriyor. Kilit de kısa süreliğine kaymayı önlüyor. Bunlar bölümün zorluğunu etkilediği için ekonomiyi bölüm tasarımıyla birlikte ele aldım.
Kazanma ve harcama
Booster
Ne yapıyor
Fiyat
Açıldığı bölüm
Geri Al
Az önce kayan parçaları geri getirir.
40 pirinç
8
Kilit
Bir kolu 3 asış boyunca kaymaktan korur.
80 pirinç
8
Terazi
Gizli bir parçanın ağırlığını gösterir.
60 pirinç
37 (gizli parçalar Cam’la geliyor)
Bir bölümü ilk kez tamamlayınca 20 pirinç kazanıyorsun. O bitiriş kaymasızsa +10, booster’sızsa +5 ekleniyor. Sergiyi ilk kez tamamlamanın ödülü +150. Aynı bölümü tekrar oynayarak bu para ödüllerini yeniden alamıyorsun. Yeni oyuncu 3 Geri Al, 3 Kilit ve 2 Terazi ile başlıyor. Her booster, kendi açılma bölümüne kadar bekliyor.
Kaymasız bitirmekle booster kullanmadan bitirmek ayrı koşullar. Kilit kullanıp hiç kaymazsan +10’u alabilirsin, ama +5’i alamazsın. Kaydıktan sonra Geri Al kullanırsan iki ek ödülü de alamazsın. Galerinin ışığı ise kaymasız bitirişi gösteriyor. Booster kullanılıp kullanılmadığını göstermiyor.
Satın alma ve reklam
Paket
İçerik
Referans fiyat
1 $ karşılığı pirinç
Atölye Başlangıç
5 Kilit, 5 Geri Al, 3 Terazi ve 300 pirinç · bir kez
2,99 $
—
Küçük pirinç paketi
400
1,99 $
≈ 201
Orta pirinç paketi
1.100
4,99 $
≈ 220
Büyük pirinç paketi · en iyi birim değer
2.500
9,99 $
≈ 250
Tablodaki fiyatları proje için referans olarak belirledim. Gerçek satın alma davranışıyla doğrulamadım. Başlangıç paketi ilk açılıştan itibaren mağazada görünüyor. Terazi ise 37. bölümde açılıyor. Paketin bu kısmının yeni oyuncuya ne kadar değer sunduğunu ayrıca değerlendirmem gerekiyor.
Ödüllü reklam: Oyuncu isterse reklam izleyerek 1 Terazi kazanabiliyor. Günlük sınır 5. Zorunlu reklam yok.
Değerlendirme isteği: Sergi tamamlanınca gösteriliyor. En fazla üç kez çıkabiliyor ve iki istek arasında en az 30 gün geçmesi gerekiyor.
Satın alma kontrolü: İşlem kimliğini kaydediyorum. Aynı işlem ikinci kez ödül vermiyor. Satın almayı geri yükleme akışı da var.
Sırayla oynayan 4.000 bot ödül kazanıyor ve Geri Al kullanıyor. Gerçek para harcamıyorlar, Kilit ve Terazi de kullanmıyorlar. Aşağıdaki tablo bu davranış modelini gösteriyor. Gerçek harcamanın alt sınırı veya insan oynama süresi olarak yorumlamıyorum.
Sergi sonu
Ortanca pirinç
Birikimli bot süresi
12. bölüm · Kâğıt
570
8 dk
24. bölüm · Ahşap
1.125
21 dk
36. bölüm · Bakır
1.695
31 dk
48. bölüm · Cam
2.260
39 dk
60. bölüm · Keçe
2.835
51 dk
72. bölüm · Taş
3.390
60 dk
84. bölüm · Neon
3.950
71 dk
Ortancaları, ilgili sergiyi tamamlayan botlar üzerinden hesapladım. Bu nedenle bütün başlangıç grubunu temsil etmiyorlar. Botlar 6.451 kez Geri Al kullandı. Bunların 1.170’i pirinçle ödendi. Oyunu bitirenlerin ortanca bakiyesi 3.950, yaklaşık 98 Geri Al’a yetiyor.
Bu senaryoda pirinç hızlı birikiyor. Ödüllerin Geri Al ihtiyacına göre fazla olup olmadığını yeniden incelemem gerekiyor. Başlangıç stokunu ve booster kullanımını değiştirerek başka varsayımları da deneyebilirim. Botlar gerçek para harcamadığı için bu tabloyla paket talebi veya gelir tahmini yapmıyorum.
Teknik ayrıntılar
Bölüm editörü, çözücü ve botlar aynı kural kodunu kullanıyor. Böylece editörde gördüğüm dengeyle oyundaki denge aynı hesaptan geliyor. Araçları, değişiklik yapıp sonucunu hızlıca kontrol edebilmek için bu şekilde kurdum.
Denge hesabı ve çözücünün sınırları
Fizik motoru yerine tam sayılı tork hesabı kullanıyorum. Alt kol, ana kolu toplam ağırlığı kadar çekiyor. Rüzgâr sabit tork ekliyor. Kayma için eşiğin aşılması ve yeni hamlenin önceki durumu daha kötü yapması gerekiyor. İkinci koşulla, eğik başlayan bir bölümü dengeye yaklaştıran hamlelerin cezalandırılmasını önlüyorum.
TorqueEngine.cs · tork ve kayma
publicstaticint Torque(Arm arm)
{
int t = arm.Wind;
foreach (var kv in arm.Slots)
{
var s = kv.Value;
int w = s.IsPiece ? s.Piece.Weight : TotalWeight(s.Arm);
t += w * kv.Key;
}
return t;
}
publicstaticbool WouldSlip(int threshold, int torqueBefore, int torqueAfter)
{
if (threshold <= 0) returnfalse;
int before = System.Math.Abs(torqueBefore);
int after = System.Math.Abs(torqueAfter);
return after > threshold && after > before;
}
Çözücü ağır parçaları önce yerleştiriyor. Kalan ağırlıklarla dengelenemeyecek dalları aramayı bırakıyor. Bir çözümde 5.040’tan fazla sıra veya toplamda 400.000’den fazla sıra varsa çözüm başına 200 sıra örnekliyor. Çözüm sayısı 200’ü geçerse R hesabı için 200 çözüm seçiyor. Örnekleme yapıldığını rapora yazıyor. Yerleşim araması bütçeyi aşarsa aday kabul edilmiyor.
Solver.cs · umutsuz dalları erkenden kesmek
void PieceDfs(List<Arm> arms, Dictionary<Arm, int> lever, int i, int placed)
{
if (result.Solutions.Count >= maxSolutions || ++nodes > DfsNodeBudget) { truncated = true; return; }
if (placed + (n - i) < target) return;
foreach (var a in arms)
{
int t = Math.Abs(TorqueEngine.Torque(a));
if (t > suffixWeight[i] * lever[a]) return;
}
Otomatik kontroller ve FPS
Unity’den bağımsız kural kütüphanesi için 139 otomatik test var. Kuralları, çözücüyü, bölüm dosyalarını, ekonomiyi, mağazayı, Remote Config’i ve çevirileri kontrol ediyorlar. Bot testlerini Unity’yi açmadan çalıştırabiliyorum.
1,5 saniye etkileşim olmayınca oyun saniyede 30 güncellemeye düşüyor. Her üç güncellemede bir çizim yapıyor, yani yaklaşık 10 çizim/saniye. Dokununca tam hıza dönüyor. Düşük bellek veya art arda iki yavaş performans penceresi de 30 kare modunu açabiliyor. Gereksiz işlem yükünü azaltmak için bu sistemi kurdum. Pil üzerindeki etkisini henüz ölçmedim.
FramePacing.cs · başlangıç FPS ve yavaşlık kontrolü
Arayüzde ağırlık ve mesafe ilişkisini kolay okunur tutmaya çalıştım. Ağırlık parçanın üzerinde yazıyor. Gizli parçayı “?” ve kesik çerçeveyle, kilitli kancayı kilit işaretiyle gösteriyorum. Kayma riski belirdiğinde kol kırmızıya dönüyor ve kısa bir görsel tepki veriyor. Bu işaretlerin ne kadar anlaşılır olduğunu oyuncu gözleminde kontrol etmek istiyorum.
Pirinç jetonu Blender’da modelledim. Arayüzü ve simgeleri Figma’da tasarladım.
Kâğıt, mürekkep ve beş renk
Görsellerde düz renkler, dış çizgisiz şekiller ve hafif bir kâğıt dokusu kullandım. Işık sol üstten geliyor ve yumuşak bir gölge bırakıyor. Krem rengi zeminin üzerinde ipler, yazılar ve kancalar mürekkep siyahı. Parçalar kırmızı, kobalt, sarı, siyah ve beyaz olabiliyor. Şekilleri beyaz çizdim, renklerini oyun veriyor. Böylece altı şekli beş renkte göstermek için tek bir görsel set yeterli oluyor.
Daire
Yaprak
Üçgen
Baklava
Damla
Yıldız
Altı şekil, oyundaki renklerle. Parça ve gölge görselleri oyunun dosyaları. Sayıları oyundaki yerleşim ve renk kuralıyla ekledim.
Kâğıt #F3EDE2 Zemin
Mürekkep #1C1B1A İp, yazı, siyah parça
Pirinç #B8944A Kol, jeton
Kırmızı #D7301F Parça, kayma uyarısı
Kobalt #1F4FA3 Parça
Sarı #E9B824 Parça
Beyaz #FAF7F0 Parça
Ağırlık sayısı nereye yazılır?
Ağırlık sayısı her hamlede okunuyor. Ama sayıyı görselin tam ortasına koymak her şekilde işe yaramıyor. Üçgenin geniş kısmı altta, damlanın gövdesi de aşağıdaki yuvarlakta. Her şeklin içine sığan en büyük dairenin merkezini hesaplayıp sayıyı oraya yerleştirdim. Ağırlık arttıkça sayı büyüyor, ama bu dairenin dışına taşmıyor. Renkli parçalarda beyaz, beyaz parçada mürekkep rengi kullanıyorum. Kontrastın en düşük olduğu sarıda ise tam beyaz var.
Kesik çizgi, şeklin içine sığan en büyük daireyi gösteriyor. Sayı onun merkezine yazılıyor. Kırmızı artı ise şeklin kutusunun ortası.
İlk sette bir hilal de vardı. İnce gövdesinde sayı kenardan taşıyordu. Yerine yarım daire, fasulye, baklava ve altıgeni denedim. Baklavayı seçtim. Üst köşesinden asılıyor ve sayı tam ortasına oturuyor.
HilalSayı gövdeye sığmıyor
Yarım daire
Fasulye
BaklavaSeçilen
Altıgen
Hilal ve yerine denediğim dört biçim.
Yedi salon, yedi malzeme
Her sergide kolların malzemesi değişiyor: önce pirinç, ardından ahşap, bakır, cam, keçe, taş ve neon. Ahşapta dalgalı damarlar, taşta benekler, camda üstte parlak bir kırılma çizgisi, neonda beyaz bir çekirdek var. Kol görselini 9-slice olarak kestim. Uzatınca yalnızca ortası esniyor, uçların yuvarlaklığı korunuyor. Salonların kâğıt zemini de malzemeye göre hafifçe renk değiştiriyor.
Kâğıt
Ahşap
Bakır
Cam
Keçe
Taş
Neon
Simgeler, pirinç jeton ve uygulama simgesi
Arayüz simgelerini Figma’da, 24 birimlik bir ızgara ve 2 birim kalınlığında çizgilerle tasarladım. Aynı simge koyu bir düğmede beyaz, açık zeminde mürekkep rengi olabiliyor. Oyunun para birimi olan pirinç jetonu Blender’da modelledim. Uygulama simgesinde ise pirinç bir kol ile kırmızı ve mavi iki parça kullandım.
Terazi
Kilit
Geri al
Galeri
Mağaza
Ayarlar
Kilitli
Reklam
En altta
Yan yana
Ayrı
Kol
İlk üçü booster’ların, son dördü kural kartlarının simgeleri.
Pirinç jetonBlender
Uygulama simgesi
Galeri ve katalog
Tamamlanan bölüm, galeride oyuncunun kurduğu asılı yapı olarak kalıyor. Kaymadan tamamlanan bölümler salonun ışığını yakmaya katkı sağlıyor. Kazanılan pirinç harcanabiliyor, yapı ise yerinde duruyor. Galeride tekrar oynamak için görünür bir hedef bırakmak istedim.
Katalog, asılan şekillerin sayısını ve açılan malzemeleri gösteriyor. Galeride geçirilen süreyi ve ziyaret edilen salonları ölçmek için kayıtlar ekledim. Oyuncu verisi geldiğinde bunlarla galeriye gösterilen ilgiyi inceleyebilirim. Galerinin oyuna geri dönmeyi artırıp artırmadığını anlamak için ayrıca bir hipotez ve test gerekecek.
Menü, ipucu ve kural kartları 10 dilde kullanılabiliyor. Sayılar ve temel bulmaca ilişkileri değişmiyor. Uzun çevirilerin küçük ekranda okunmasını ve renk dışındaki işaretlerin fark edilmesini de kontrol etmek istiyorum.
Sıradaki adımlar
Gerçek oyunculara ulaşıp ağırlık ve mesafe ilişkisini, taşıma ve sökme seçeneklerini nasıl öğrendiklerini ve ilk kaymaya nasıl tepki verdiklerini oynanış testlerinde gözlemlemem gerekiyor.
Mozaik Blast’ta aynı renkteki karoları patlatarak bir çini desenini tamamlıyorsun. Amaç, tahtayı boşaltmak değil. Patlattığın karo, altındaki hedef kareyle aynı renkteyse o kare boyanıyor. Bu yüzden yalnızca en büyük grubu bulmak yetmiyor. Grubun nerede durduğuna ve patlamadan sonra hangi seçeneklerin kalacağına da bakman gerekiyor.
Görsellerde İznik çinilerinden esinlendim. Her bölümde başka bir motif ortaya çıkıyor. Desenin adım adım tamamlanmasını, oyuncunun ilerlemesini görebileceği bir hedef olarak kullandım.
Bu projede yaptıklarım
Bölüm tasarımı: Dört temaya yayılan 100 bölümün tamamını Unity’de geliştirdiğim bölüm editörüyle tasarladım. Desenleri, renk havuzlarını, engelleri ve hamle bütçelerini belirledim. Yeni kuralları tanıtan bölümlerle nefes alma bölümlerinin sırasını planladım.
Ürün kararları: Öğretim akışını, can ve altın varak ekonomisini, devam tekliflerini ve ölçüm olaylarını tasarladım. Remote Config ayarlarının sınırlarını ve ne zaman uygulanacağını belirledim.
Geliştirme ve görseller: Oyun kurallarını Unity’de C# ile yazdım. Karoları Blender’da hazırladım. Renklerin yanında farklı çiçek şekilleri kullanarak ayırt edilmelerini kolaylaştırmaya çalıştım.
Bir bölüme nereden başlıyorum?
Önce bölümde hangi kararı öne çıkarmak istediğimi ve temanın neresinde duracağını belirliyorum. Sonra editörde desen, engel, renk ve hamle ayarlarını yapıyorum. Taslağı oyunda deniyor, botlarla ölçüyor ve gerektiğinde değiştiriyorum. Tamamlama oranının yanında bölümün öğretmek istediği karara da bakıyorum.
Sonuçların kaynağı
Geniş ölçekli oyuncu testine erişimim olmadığı için bölümleri, farklı oynama davranışlarını modelleyen botlarla test ettim. Botların varsayımlarını sonuçlarla birlikte paylaştım ve değişiklikleri aynı koşullarda karşılaştırdım. Bu sonuçlar bot testlerinden geliyor. Gerçek oyuncular üzerindeki etkisini henüz doğrulamadım.
25. bölüm · Kilim. Hedef desen, hamle sayısı ve tahta aynı ekranda.
Bir hamlede ne oluyor?
Grubu seç: Yan yana duran, aynı renkte en az iki karoya dokunuyorsun. Yatay ve dikey komşular bir grup oluşturuyor. Çapraz komşular sayılmıyor. Geçersiz bir dokunuş hamle harcamıyor.
Deseni boya: Patlayan karonun rengi, altındaki hedefle eşleşirse o kare tamamlanıyor. Kalan hedefleri karelerin çevresindeki taramadan ve üstteki küçük desen önizlemesinden takip edebiliyorsun.
Yeni yerleşimi oku: Boşalan yerlere karolar düşüyor ve yenileri geliyor. Büyük bir grup patlattığında, dokunduğun karede bir power-up oluşuyor.
Deseni tamamla: Bütün hedefleri boyarsan kazanıyorsun. Hamlelerin biterse ek hamleyle devam edebilir veya denemeyi bitirebilirsin.
Oyundaki 100 bölümde de boyanan hedefler korunuyor. Daha sonra yanlış renkte bir grup patlatmak, tamamladığın kareleri bozmuyor.
Büyük grupların karşılığı
Grup
Power-up
Oyuncuya açtığı karar
7–9
Fırça: Kendi rengini bir satır veya sütundaki normal karolara uygular. Yön, grubun biçimine bağlıdır.
Şimdi küçük bir hedefi mi boyamalıyım, yoksa daha büyük bir grup hazırlamak için çizgiyi mi değiştirmeliyim?
10–12
Kendi rengindeki en fazla 8 eksik hedefi boyar. Yakındaki hedeflere öncelik verir.
Tek tek tamamlanması zor kalan kareler için bir power-up ayırmak.
13+
Mühür: Merkezinden iki adımlık, elmas biçimli alandaki hedefleri doğru renkle boyar.
Gruba nereden dokunursam power-up’ı daha çok hedefe yakın oluştururum?
Komşu power-up’lar birlikte kullanılabiliyor: iki Fırça satır ve sütunu birlikte değiştiriyor, iki Kova kapasiteyi 24 kareye çıkarıyor, iki Mühürün alanı dört adımlık yarıçapa genişliyor. Büyük grup kurmak kadar, power-up’ları yan yana getirmek de bir planlama seçeneği.
Oyun döngüsü ve ilk adımlar
Haritadan bir bölüm seçiyorsun. Deseni ve hamle sınırını görüp tahtaya geçiyorsun. Kazanınca altın varak alıyor ve sonraki bölümü açıyorsun. Tamamlanan mozaik haritada ilerlemenin bir parçası olarak kalıyor.
Oyun içinde şu döngüyü kurdum: kalan hedeflere bak → doğrudan boyama ile power-up hazırlama arasında seçim yap → patlat → yeni yerleşimi değerlendir. Gelen karolar her denemede değiştiği için aynı desen farklı sorunlar çıkarabiliyor. Başlangıçta bu kararları sade tutuyorum. İlerledikçe engeller ve hamle sınırı, birkaç hamle sonrasını düşünmeyi gerektiriyor.
Kuralları nasıl tanıtıyorum?
İlk harita düğümünü ve ilk geçerli grubu işaretliyorum. İlk hamlede dokunulabilecek alan sınırlı. Ardından hedef kartı açılıyor. Power-up açıklamaları ilk oluştuklarında, engel ipuçları da ilgili engelin ilk bölümünde geliyor. Bütün kuralları başlangıçta tek ekrana yığmak istemedim.
Bu öğretim akışı oyunda var, ama botlar onu okumuyor. Kuralları baştan biliyorlar. Dolayısıyla botların bölümü tamamlaması, açıklamaların bir oyuncu için anlaşılır olduğunu göstermiyor.
İlk hamle: hedefi boyayan grup öne çıkarılıyor.Sonraki adım: tamamlanması gereken desen açıklanıyor.
Bölüm tasarımı
Her bölüme bir amaçla başlıyorum: bir kuralı tanıtmak, öğrenilenleri birleştirmek, power-up planlamasını öne çıkarmak veya nefes aldırmak. Sonra hedeflerin komşuluğuna, engellerin düşüşü nasıl değiştirdiğine ve power-up’ların erişebildiği alanlara bakıyorum. Dağınık hedeflerde Kova, merkezde toplanan hedeflerde Mühür daha değerli olabiliyor. Hamle bütçesini bu yerleşimle birlikte ayarlıyorum.
100 bölümü dört temaya ayırdım. Yeni kuralları önce daha rahat hamle bütçeleriyle tanıtıyor, sonra önceki mekaniklerle birleştiriyorum.
Tema
Bölümler
Tasarım odağı
Çini Atölyesi
1–25
Deseni okuma ve power-up hazırlama. İlk 8 bölümde üç renk, ardından dört renk. İlk engel gelmeden temel kuralları birleştiren Kilim finali.
Kazı
26–50
Tek ve çift katlı kil. Önce erişimi açmak, sonra alttaki hedefi boyamak.
Saray
51–75
Kafesler düşüşü durduruyor. Bir grubu patlatmakla akışı açmak arasındaki ilişki. İleride kil ve kafes birlikte.
Bahçe
76–100
Yosun ihmal edildiğinde yayılıyor. Hedef boyama, alan açma ve yayılmayı durdurma arasında öncelik seçimi.
Hedef boyamakla yosun yayılmasını durdurmak arasında öncelik seçmek.
Düzenlemenin yosun dersini koruması ve iki bot profilinin farkı.
Hedef deseni ve oynarken gelen karolar
Bölüm dosyasında hedef deseni, engeller, renk havuzu ve hamle sınırı var. Normal karolar ise rastgele geliyor ve patladıkça yenileniyor. Tasarladığım tek bir bölüm bu yüzden birçok farklı tahta oluşturabiliyor. Testlerde seed kullanarak koşulları yeniden kurabiliyorum. Yine de tek bir başlangıç, bölümün bütün olasılıklarını temsil etmiyor.
Engeller kararı nasıl değiştiriyor?
Kil: Örttüğü kare boyanamıyor. Yanındaki grup patladığında bir katman kırılıyor. Çift katlı kil için bunu iki kez yapmak gerekiyor. Kili kaldırmak hedefi tamamlamıyor: açılan kareyi sonra doğru renkle boyamalısın.
Kafes: İçindeki karo aynı renkli gruba katılıyor, ama ilk patlamada yalnızca kafes kırılıyor ve karo yerinde kalıyor. Kafes kırılana kadar düşüşü de durduruyor. Bu yüzden bir hamle bazen doğrudan boya kazandırmak yerine sonraki hamlenin yolunu açıyor.
Yosun: Hedefe erişimi kapatıyor. Devam eden bir hamlede hiç yosun temizlenmezse komşu bir normal karoya yayılıyor. Yosun temizlemek o hamlede büyümeyi durduruyor. Hedefe odaklanmakla yayılmayı kontrol etmek arasında seçim gerekiyor.
25 · Kilim Power-up’lar ve desen yerleşimi.33 · Mihrap Merkezde iki katmanlı kil.51 · Kilit İlk kafeslerle tanışma.76 · Yosun İlk yayılan engel.
Zorluğun ritmi
Zorluğu sürekli artırmak istemedim. Dalga’da (7) hata paylı botun tamamlama oranı %41,6, sonraki Güneş’te (8) %84,2. Mahzen’den (31, %43,1) sonra Fener (%85,5), Kuru Havuz’dan (81, %38,1) sonra Lale Tarlası (%85,6) geliyor. Zor bölümlerin ardından baskıyı düşüren nefes alma bölümleri yerleştirdim.
Grafikteki tasarım hedefi, bölüm dosyasına yazdığım bot tamamlama hedefi. Gerçek oyunculardan ölçülmüş bir standart değil. Botun sonucu bu çizgiye yakınsa, hamle bütçesi bu modelde hedeflediğim zorluğa yakın çalışıyor.
Tasarım hedefi
Hata paylı bot
Tamamlama oranı · yüksek değer, botun bölümü daha kolay geçtiğini gösterir
3 Ekim 2026 doğrulaması · bölüm ve profil başına 1.000 koşu · 100 bölüm. Grafik ve tablo o tarihteki sürümü gösteriyor. Servi ve Kelebek’in sonraki değişiklikleri Bot verisiyle iyileştirmeler kısmında.100 bölümün değerler tablosunu göster
Bölüm
Hamle
Hedef
Hata paylı
Hedef odaklı
Rastgele
1 · İlk Çini
9
%92
%94,5
%96,8
%21,5
2 · Çizgi
9
%92
%93,0
%94,9
%24,3
3 · Köşe
10
%90
%92,8
%94,3
%21,9
4 · Elmas
10
%90
%89,1
%93,3
%17,2
5 · Nazar
15
%86
%87,5
%91,4
%5,7
6 · Yaprak
11
%80
%77,4
%84,2
%2,8
7 · Dalga
8
%38
%41,6
%41,7
%1,7
8 · Güneş
13
%86
%84,2
%88,1
%5,7
9 · Lale
21
%78
%74,5
%83,4
%7,7
10 · Yıldız
21
%77
%76,1
%81,1
%2,8
11 · Hilal
15
%76
%74,5
%77,6
%11,2
12 · Çerçeve
21
%74
%77,9
%80,9
%9,6
13 · Kum Saati
11
%40
%40,6
%40,6
%1,0
14 · Nar
27
%86
%85,0
%88,8
%7,1
15 · Çintemani
23
%74
%73,5
%74,8
%5,6
16 · Kapı
16
%73
%75,0
%76,9
%7,5
17 · Rumi
18
%72
%73,1
%75,7
%6,5
18 · Merdiven
17
%72
%71,4
%73,0
%9,0
19 · İki Lale
17
%40
%43,7
%44,3
%0,6
20 · Servi
27
%86
%86,5
%89,1
%10,8
21 · Karanfil
30
%72
%74,0
%78,2
%2,0
22 · Kandil
24
%70
%71,2
%77,7
%1,4
23 · Zencerek
30
%70
%71,0
%74,7
%2,1
24 · Hatai
28
%68
%70,4
%75,1
%1,1
25 · Kilim
33
%60
%60,2
%66,8
%0,2
26 · Kazı
24
%88
%90,7
%92,7
%7,8
27 · Kuyu
32
%82
%80,1
%84,5
%5,5
28 · Sandık
28
%78
%80,5
%82,8
%4,4
29 · Kale
33
%76
%74,6
%81,0
%6,9
30 · Çift Kat
29
%76
%78,3
%82,9
%3,6
31 · Mahzen
26
%40
%43,1
%47,3
%0,5
32 · Fener
29
%86
%85,5
%88,0
%8,3
33 · Mihrap
33
%72
%69,7
%75,6
%2,3
34 · Çeşme
30
%72
%71,5
%78,3
%1,4
35 · Hamam
35
%70
%70,1
%77,4
%1,7
36 · Köprü
28
%70
%71,8
%74,6
%2,2
37 · Labirent
23
%40
%41,5
%44,4
%2,5
38 · Gül Bahçesi
29
%86
%85,0
%87,0
%9,0
39 · Tavus
30
%70
%71,9
%79,0
%1,3
40 · Tespih
22
%68
%69,0
%71,6
%2,4
41 · Sebil
33
%68
%66,7
%72,6
%1,5
42 · Kervansaray
31
%66
%63,6
%70,0
%1,2
43 · Zindan
22
%40
%44,4
%48,2
%0,2
44 · Nilüfer
34
%86
%85,7
%89,3
%10,1
45 · Minare
35
%66
%67,2
%73,0
%0,5
46 · Kubbe
38
%64
%64,9
%72,1
%0,2
47 · Saray
35
%62
%62,2
%67,8
%0,3
48 · Pusula
27
%62
%59,9
%69,3
%1,4
49 · Hazine Odası
31
%60
%61,0
%65,6
%0,4
50 · Ayasofya
40
%56
%55,2
%60,7
%0,4
51 · Kilit
33
%88
%89,7
%90,3
%9,9
52 · Parmaklık
30
%86
%86,6
%90,3
%22,9
53 · Taş Kapı
24
%74
%77,7
%82,4
%8,7
54 · Taht
36
%72
%75,3
%79,4
%2,8
55 · Harem Penceresi
21
%70
%69,4
%71,5
%3,8
56 · Zincir
15
%40
%42,0
%47,8
%0,9
57 · Gül
29
%84
%83,7
%86,3
%8,7
58 · Topkapı Kapısı
33
%70
%68,1
%73,9
%1,6
59 · Sofa
24
%68
%65,0
%71,1
%3,1
60 · Kaftan
31
%68
%69,3
%73,1
%1,3
61 · Tuğra
21
%66
%65,0
%69,3
%2,7
62 · Hazine Dairesi
22
%38
%41,6
%44,7
%0,2
63 · Lale Bahçesi
33
%84
%85,7
%87,8
%8,5
64 · Çini Paneli
29
%66
%65,4
%73,4
%3,1
65 · Fıskiye
25
%64
%61,5
%67,8
%1,3
66 · Divan
34
%62
%66,3
%70,7
%0,6
67 · Kütüphane
29
%62
%64,3
%66,1
%0,7
68 · Zindan Kapısı
18
%38
%40,2
%42,1
%0,6
69 · Havuz
31
%84
%83,8
%84,8
%7,1
70 · Hünkâr Kasrı
37
%60
%62,0
%67,9
%0,5
71 · Kemer
25
%58
%57,9
%62,8
%1,9
72 · Nişan
33
%58
%60,5
%64,9
%1,4
73 · Mozaik Zemin
31
%56
%59,9
%63,4
%1,9
74 · Alem
20
%56
%55,9
%61,9
%1,2
75 · Topkapı Sarayı
40
%52
%51,7
%56,2
%0,2
76 · Yosun
25
%88
%88,2
%90,0
%6,8
77 · Sarmaşık
25
%86
%86,8
%88,5
%15,3
78 · Çiçek Tarhı
27
%74
%75,6
%78,4
%2,0
79 · Fıskiyeli Havuz
29
%72
%72,4
%74,3
%1,2
80 · Taş Yol
19
%70
%68,0
%73,2
%2,5
81 · Kuru Havuz
11
%38
%38,1
%40,4
%1,9
82 · Lale Tarlası
31
%84
%85,6
%87,9
%4,2
83 · Çardak
30
%68
%67,6
%73,0
%1,3
84 · Kameriye
25
%66
%68,2
%71,7
%0,4
85 · Sera
28
%66
%66,0
%69,6
%0,9
86 · Bostan
28
%64
%65,8
%69,6
%0,4
87 · Çit Labirenti
16
%38
%41,0
%40,8
%0,3
88 · Gülistan
26
%84
%82,9
%86,2
%7,3
89 · Çeşme Başı
23
%62
%61,7
%67,9
%0,3
90 · Kuş Evi
31
%60
%60,8
%67,3
%0,0
91 · Asma
28
%60
%61,3
%67,7
%0,1
92 · Nar Ağacı
31
%58
%59,5
%66,4
%0,2
93 · Harabe
15
%38
%38,6
%45,8
%0,3
94 · Çimen
26
%84
%82,6
%87,6
%7,9
95 · Kuyu Başı
24
%56
%56,0
%62,4
%0,7
96 · Ağaç Evi
35
%56
%56,7
%63,4
%0,0
97 · Kelebek
30
%54
%50,0
%62,4
%0,1
98 · Bahçıvan Kulübesi
35
%54
%57,4
%61,2
%0,2
99 · Gizli Bahçe
38
%52
%52,6
%55,5
%0,5
100 · Cennet Bahçesi
39
%50
%50,3
%55,9
%0,0
Bölüm editörü ve çalışma akışım
100 bölümün tamamını Unity içinde geliştirdiğim bölüm editörüyle tasarladım. Önce bölümün rolüne ve öğretmek istediği karara bakıyorum. Sonra desen, engel ve hamle bütçesini buna göre değiştiriyorum. Editör ayrı bir pencerede açılıyor: solda bölüm kütüphanesi, ortada tahta, sağda ayarlar ve tasarım planı var. Taslağı botlarla ölçüyor, kaydetmeden oyunda deniyor ve seçtiğim hâlini raporuyla birlikte kaydediyorum.
Plan notları ayrı bir tasarım tablosundan geliyor. Tahtayı değiştirdiğimde otomatik güncellenmiyorlar. Örneğin Servi’nin eski planında 22 hedef yazıyor, güncel tasarımda ise 24 hedef var. Son kontrolü güncel tahta sayacı ve kayıtlı rapor üzerinden yapıyorum.
20. bölüm Servi’nin güncel deseni. Solda bölüm kütüphanesi, ortada hedef ve engel katmanları, sağda tasarım planı ve ayarlar. Altta bot sonuçları var. Görseli büyütmek için üzerine tıklayabilirsin.
Bir bölümü nasıl düzenliyorum?
Amacını belirliyorum. Unity’de Mozaik Blast → Level Editor menüsünü açıp bölümü seçiyorum. Rolü, zorluk ayarı ve öğretmek istediği karar aynı ekranda duruyor. Değişiklikten önce bot testini çalıştırıp sonucu “Referans yap” ile saklıyorum.
Deseni ve engelleri ayrı düzenliyorum. Hedefleri renk fırçalarıyla, kil, çift katlı kil, kafes ve yosunu engel katmanında boyuyorum. Bir katmanı silerken diğeri korunuyor. Sürükleyerek boyadığım alanı tek adımda geri alabiliyorum.
Bütçeyi ayarlayıp yeniden ölçüyorum. Tahta boyutu, renk havuzu, hamle sınırı ve boyanan kareleri koruma ayarı aynı panelde. Üç bot profili varsayılan olarak 1.000’er koşu oynuyor. Referansla koşu sayısı veya seed uyuşmazsa editör puan farkını göstermiyor. Karşılaştırmada oyun kurallarını da sabit tutuyorum. Hamle önerisi önce 300 koşuluk ölçümlerle bir bütçe arıyor, ardından tam testi çalıştırıyor. Öneriyi oyunda deneyip değerlendiriyorum.
Hangi karelerin kaldığına bakıyorum. Isı haritası, hata paylı botun kaybettiği koşularda boyayamadığı hedefleri gösteriyor. Yüzdeler yalnızca kaybedilen koşular üzerinden hesaplanıyor. Renk koyuluğu her haritanın en yüksek değerine göre ayarlandığı için farklı bölümlerin renklerini doğrudan karşılaştırmıyorum.
Taslağı oyunda deniyorum. “Oyunda dene” ile bölüm dosyasını değiştirmeden oyun sahnesine geçiyorum. Hedef önizlemesini, desenin okunmasını ve power-up’ların davranışını burada kontrol ediyorum. Play Mode’dan çıkınca can, altın ve ilerleme kaydı önceki hâline dönüyor.
Bölümü ölçümüyle birlikte kaydediyorum. Güncel test yoksa botlar kayıttan önce yeniden çalışıyor. Dosyada koşu sayısı, seed, kurallar, tarih ve üç profilin sonucu tutuluyor. Tasarım veya kurallar değiştiğinde eski rapor işaretleniyor. Bölümü JSON, referans ve son ölçümü CSV olarak dışa aktarabiliyorum. Kütüphanedeki işaretlerle hangi raporun uygun, eski veya düzeltme bekliyor olduğunu görüyorum.
Karar verirken kullandığım basit hesaplar
Sonuçları okurken bu beş hesaba bakıyorum. Editör bunları otomatik hesaplıyor. Aşağıdaki örnekler Servi ve Kelebek’in bot ölçümlerinden.
Hedefe yakın mı?
Hata paylı bot − hedef = en fazla ±5 puan
Kelebek’in hedefi %54. Düzenlemeden sonra hata paylı bot %56,5 kazanıyor: fark 2,5 puan.
Şansla geçilebiliyor mu?
Rastgele dokunan bot en fazla %15 kazanmalı
Kelebek’te rastgele bot 1.000 denemenin yalnızca 1’ini kazanıyor. Hedefi %85 ve üstü olan kolay giriş bölümlerinde bu sınırı uygulamıyorum.
Beceri ödüllendiriliyor mu?
Hedef odaklı bot − hata paylı bot = 3–8 puan
Kelebek’te fark önce 62,4 − 50,0 = 12,4 puandı. Düzenlemeden sonra 63,0 − 56,5 = 6,5 puana indi. Hata paylı bot, hedef odaklı bota yaklaştı.
Bot hangi karede takılıyor?
Karenin boş kaldığı kayıp ÷ toplam kayıp
Servi’de gövdenin en alt karesi her 100 kayıptan 44’ünde boş kalıyordu. Kök eklendikten sonra en zor kare 100 kayıpta 30’a indi.
Hangi değişiklik işe yaradı?
Etki = yeni sonuç − önceki sonuç, her seferde tek değişiklik
Yosunu taşıyıp 1 hamle eklediğimde hata paylı bot +6,4 puan kazandı. Yalnızca 1 hamle eklediğimde artış +6,5 puandı. Bu ölçümde ek hamle yeterli göründü, bu yüzden yosunun yerini korudum.
Bot sonuçlarını nasıl okuyorum?
Servi’nin güncel ölçümü. Kalan hamle yalnızca kazanan koşuların, kayıp ilerlemesi yalnızca kaybeden koşuların ortalaması. Power-up üretme ve kullanma sayıları da ayrıca raporlanıyor.
Editörün “yayına uygun” etiketi, bölümün belirlediğim bot kontrollerini geçtiğini söylüyor. Hata paylı profil hedefin en fazla 5 yüzde puan uzağında olmalı. Hedefi %85’in altında olan bölümlerde rastgele profil %15’i geçmemeli. Bu etiketi, gerçek oyunculardaki zorluğun veya eğlencenin doğrulandığı şeklinde kullanmıyorum.
Hedef odaklı ve hata paylı botların tamamlama oranı arasındaki farka “beceri payı” adını verdim. Fark 3–8 puan dışındaysa bölümü inceliyorum, ama bu tek başına kaydı engellemiyor. Kolay giriş bölümlerinde, hedef %85 veya üzerindeyse, 3 puanın altı için uyarı da verilmiyor.
Bu akışı kullanarak Servi’nin hedef yerleşimini ve Kelebek’in hamle bütçesini düzenledim. Sorunları, denediğim seçenekleri ve önce–sonra sonuçlarını Bot verisiyle iyileştirmeler kısmında gösteriyorum.
Editörün gösterdiği bir sınır
Isı haritasında bir sınır fark ettim: simetrik desenlerin sağ tarafı düzenli olarak daha sıcak çıkıyor. 73. bölüm Mozaik Zemin’de kafesli sol alt köşe kayıpların %16’sında, sağ alt köşe %50’sinde boş kalıyor. Botlar gruba her zaman en soldaki kareden dokunuyor ve power-up orada oluşuyor. Bu davranış farkı etkileyebilir. Bu yüzden sağdaki kareyi doğrudan tasarım sorunu saymıyorum. Editör, dokunma konumuyla ilgili bu notu haritanın altında gösteriyor. Farklı dokunma konumlarını denemek sıradaki işlerimden biri.
Hangi ayarı neden değiştiriyorum?
Editördeki ayar
Tasarımda baktığım karşılığı
Hedef yerleşimi
Hedefler bir power-up’la birlikte mi tamamlanabiliyor, yoksa tek tek mi takip edilmeli? Son kareler merkeze mi, kenarlara mı kalıyor?
Engel türü ve katmanı
Hamle doğrudan ilerleme mi sağlıyor, erişim mi açıyor, yoksa yayılmayı mı durduruyor? Yeni kuralı başka baskılarla aynı anda yüklemiyor muyum?
Tahta boyutu ve renk havuzu
Grup ve power-up hazırlamak için ne kadar alan var? Havuzdaki ek renkler hedef dışı karoları artırıyor mu? Daha büyük tahta otomatik olarak daha zor demek değil.
Hamle sınırı ve bot hedefi
Bölümün tema içindeki yerini destekliyor mu? Win rate’in yanında kalan hamle ve kayıp ilerlemesi nasıl değişiyor?
Boyanmış kareleri koruma
Oyuncunun kazandığı ilerleme kalıcı mı? Bu kuralı değiştirmek yalnızca zorluk sayısını değil, bölümün kararlarını da değiştiriyor. Kilim’deki ayrı bot karşılaştırması aşağıda.
Bütün bölümlere bakmak
Ayrı dengeleme menüsünde bir temayı, seçtiğim bölümleri veya 100 bölümün tamamını inceleyebiliyorum. Hamle bütçesi aramak, mevcut bütçeye ince ayar yapmak ve bütçeyi değiştirmeden doğrulamak ayrı işlemler. Grafikteki 3 Ekim raporu, o tarihteki 100 bölümün bütçeyi değiştirmeden doğrulanmasına ait. Servi ve Kelebek’in sonraki değişiklikleri bu raporda yok. CSV’de hedef, eski ve yeni hamle sınırı, üç profilin tamamlama oranı, hata paylı botun kalan hamleleri, kayıplardaki ilerleme, grup büyüklüğü ve power-up kullanımı var. Bu sayede bir bölümü komşularıyla birlikte değerlendirebiliyorum.
Kaydetmeden önce kontrol ettiğim şeyler
Desen ve erişim: Hedef renkleriyle renk havuzu uyumlu mu? Boyutu küçültürken hedef veya engel kaybettim mi? Kapalı hedefler ve önizleme anlaşılır mı?
Öğretim ve ritim: Bölüm hangi kararı öne çıkarıyor? Engeller, power-up hazırlama alanı ve hamle bütçesi bu kararı destekliyor mu? Önceki ve sonraki bölümle baskı farkı nasıl?
Ölçümün güncelliği: Son düzenlemeden sonra botları yeniden çalıştırdım mı? Koşu sayısı, seed ve oyun kuralları karşılaştırmaya uygun mu? Kazanan ve kaybeden ortalamalarını ayrı mı okuyorum?
Editör tahta boyutunu 4–10, hamle sınırını 1–99 arasında tutuyor. Hedefsiz bölümü kaydetmiyor. Dosya editör dışında değiştiyse üzerine yazmıyor. Havuzda olmayan bir hedef rengi veya planın rolüne uymayan bot hedefi için uyarı veriyor. Bölümün anlaşılır olup olmadığını ve tasarım amacını koruyup korumadığını ise oyunda deneyerek kontrol ediyorum.
25. bölüm: Kilim
Kilim, ilk temanın son bölümü. 9×9 tahtada dört renk, 35 hedef kare ve 33 hamle var. Engel yok. Yedi yatay renk şeridi kullandım. Oyuncunun, tanıdığı power-up’ları kullanırken grubun konumuna da dikkat etmesini istedim.
Aynı power-up, farklı konum
Mühür bütün tahtayı boyamıyor. İki adımlık elmas alanı desenin ortasında 13, sol kenarında 9 hedef kareye erişiyor. Şemada bütün hedefler henüz boyanmamış. Oyun sırasında gerçek kazanç, o anda kalan hedeflere bağlı.
Ortada: 13 hedef kareKenarda: 9 hedef kare
Power-up, büyük grubun dokunulan karesinde oluşuyor. Bu yüzden 13 karoluk bir grup bulduktan sonra neresine dokunacağını da seçmen gerekiyor. Renk şeritleri Fırça’yla büyük grup hazırlamaya alan bırakıyor. Merkezdeki hedefler ise Mühürün konumunu değerli kılıyor.
Kilim’in 33 hamlelik bütçesini 31 ve 35 hamleyle karşılaştırdım. Oranları, test ayarlarını ve neden 33 hamleyi koruduğumu Botlarla A/B testi kısmında gösteriyorum.
Test ve dengeleme
Üç bot profili kullandım. Hamleleri farklı seçiyorlar, ama hepsi oyunun aynı tahta modelini ve kurallarını kullanıyor. Sonuçlarını ayrı raporluyorum. Animasyonları, öğretim ekranlarını ve ekonomi akışını bu testte oynamıyorlar.
Profil
Davranış varsayımı
Sınırı
Hedef odaklı
Listelenen hamlelerin sonuçlarını önizler. Boyanacak hedefleri, engel hasarını, power-up oluşturmayı ve sonraki grup fırsatını puanlayıp en yüksek puanlı hamleyi seçer.
Kuralları ve bütün tahta durumunu bilir. Kusursuz çözücü değil. Öğrenen bir oyuncu da değil.
Hata paylı
Aynı puanlamayı kullanır. Hamlelerin %25’inde en yüksek puanlı üç seçenek arasından rastgele seçer. En iyi hamle bu havuzun içindedir.
Bu “%25 hata yapan insan” demek değil. Kaynak kodundaki adı Human. Rapordaki human sütunu gerçek insan verisi değil.
Rastgele
Listelenen geçerli hamleler arasından eşit olasılıkla seçer.
Her ekran karesine rastgele dokunmaz. Sabırsız veya yeni bir oyuncunun doğrulanmış modeli değil.
Üç profil de normal bir grubu tek bir dokunma konumuyla temsil ediyor. Grup içindeki bütün power-up yerleşimlerini karşılaştırmıyor. Kilim’de gösterdiğim 13 ve 9 karelik konum farkı bu yüzden ayrıca geometrik olarak incelendi. Bot sonuçları, power-up yerleştirme becerisini bütünüyle temsil etmiyor.
100 bölümün kontrolü
3 Ekim doğrulamasında bölüm ve profil başına 1.000 koşu var: 100 × 3 × 1.000 = 300.000 koşu. Seed 1234. Test sırasında hamle sınırları değiştirilmedi. Sonraki düzenlemelerde Servi 27’den 31 hamleye ve 22’den 24 hedefe, Kelebek 30’dan 31 hamleye geçti. Bu yeni tasarımları ve ölçümlerini Bot verisiyle iyileştirmeler kısmında ayrı gösteriyorum.
3 Ekim raporunda hata paylı bot, her bölümde hedefin en fazla 4,4 yüzde puan uzağında kaldı. Bu, planladığım ritmin bu botla kurulabildiğini gösteriyor. Oyuncuların zorluğu nasıl algılayacağını, eğlenip eğlenmeyeceğini veya geri dönüp dönmeyeceğini henüz bilmiyorum. Raporun hesaplama süresini de oyuncunun bölüm süresi olarak kullanmıyorum.
Tekrarlanabilirlik ve kalite kontrolü
Yeni Kilim testini, oyun kaynaklarının değiştirilmemiş kopyalarıyla çalıştırdım. Önce 1, 7, 25, 26, 51, 76 ve 100. bölümlerde üç profilin 150’şer koşusunu mevcut Unity kaydıyla karşılaştırdım. 21 karşılaştırmanın kazanma sayıları eşleşince alternatiflere geçtim.
Projede 131 testin geçtiği bir kalite kontrol kaydı da var. Tahta kuralları, engeller, power-up’lar, bölüm okuma ve ekonomi gibi alanları kapsıyor. Bu testler kuralların doğru çalışmasını kontrol ediyor. Bölümün oyuncuya nasıl hissettirdiğini değerlendirmek için ayrıca gözlem gerekiyor.
Unity kaydıyla eşleşen kazanma sayıları
Her hücre, seed 777 ile yapılan 150 koşuda kazanılan oyun sayısını gösteriyor. 21 değerin tamamı Unity kaydıyla eşleşti. Bu 3.150 kontrol koşusu, Kilim deneyindeki 16.200 koşuya dahil değil.
Bölüm
Hata paylı
Hedef odaklı
Rastgele
1
144 / 150
143 / 150
34 / 150
7
62 / 150
55 / 150
1 / 150
25
91 / 150
97 / 150
0 / 150
26
134 / 150
140 / 150
15 / 150
51
136 / 150
130 / 150
10 / 150
76
125 / 150
128 / 150
12 / 150
100
67 / 150
83 / 150
0 / 150
Bot verisiyle iyileştirmeler
Servi’de kaybedilen koşularda sık sık boş kalan bir hedef fark ettim. Kelebek’te ise iki bot profili arasındaki fark açılmıştı. İki bölümü de tasarım amaçlarını koruyarak değiştirmek istedim. Seçenekleri ölçtüm, oyunda denedim ve tercih ettiğim hâllerini kaydettim.
Bölüm
Kaydettiğim değişiklik
Hata paylı bot · önce → sonra
Tasarım kararı
20 · Servi
İki mercan hedefle kökü genişlettim. Hamle bütçesini 27’den 31’e çıkardım.
%86,5 → %88,9
Nefes alma bölümünün rolünü korumak. Kayıplarda sık kalan alt hedefi yeniden düzenlemek.
Bunlar botlarla ölçülmüş tasarım düzenlemeleri. Gerçek oyuncuların tamamlama oranı, eğlencesi veya oyuna geri dönmesi üzerindeki etkisi henüz doğrulanmadı.
20 · Servi: nefes alma bölümünün son hedefi
Sorun
Servi’yi zor bir bölümün ardından nefes aldırmak için tasarladım. Bot hedefi %86 ve sonuç buna yakındı. Ama ısı haritasında ağacın en alt karesi öne çıktı: hata paylı botun kaybettiği 135 oyunun %44’ünde bu kare boş kalmıştı. Kaybeden botlar hedeflerin ortalama %92’sini boyuyordu. Bölümün büyük kısmı tamamlandığı hâlde son hedefin sık sık aynı yerde kalması, yerleşime yeniden bakmamı sağladı.
Değişiklik
Gövdenin altına iki mercan kare ekleyip üç karelik bir kök yaptım. En alttaki hedef artık yanındaki hedeflerle aynı grupta boyanabiliyordu. Hamle önerisi bütçeyi 27’den 31’e çıkardı. Taslağı oyunda açıp kökün küçük hedef önizlemesinde okunabildiğini kontrol ettim ve kaydettim.
Önce27 hamle, 22 hedef kare. En sıcak kare %44.Sonra31 hamle, 24 hedef kare. En sıcak kare %30.
Sonuç ve karar
Ölçüm
Önce
Sonra
Hamle · hedef kare
27 · 22
31 · 24
Hata paylı bot
%86,5
%88,9
Hedef odaklı bot
%89,1
%91,2
Rastgele bot
%10,8
%11,4
Kaybedilen oyun (1.000’de)
135
111
En sıcak kare
%44 · gövdenin altı
%30 · kökün sağ ucu
Hata paylı bot hedefin 2,9 puan üstüne çıktı. Bir nefes alma bölümü için bu payı kabul ettim. Desen ve hamle bütçesi birlikte değiştiği için artışı yalnızca köke bağlayamıyorum. Haritada kökün sağ ucunun daha sıcak çıkmasını da doğrudan kötü yerleşim olarak yorumlamıyorum. Botun dokunma konumu bu farkı etkileyebilir.
97 · Kelebek: dersi koruyup bütçeyi değiştirmek
Sorun
Kelebek’in bot hedefi %54. Hata paylı bot %50,0’da, hedef odaklı bot %62,4’te kalıyordu. Aralarındaki 12,4 puan, inceleme için kullandığım 3–8 puan aralığının dışındaydı. Bu yüzden bölüme yeniden baktım. Bu farkın gerçek oyuncuların hata yaptığında nasıl hissedeceğini gösterdiğini söyleyemem.
Denediğim seçenekler
İlk fikrim, ortadaki yosunu gövdenin üst ucuna taşımaktı. Ortadaki yosun iki kanada da yayılabiliyordu. Taşıdıktan sonra hamle önerisini çalıştırdım ve sonuç iyi göründü. Ancak araç aynı anda bütçeyi 30’dan 31’e çıkarmıştı. Ek hamle tek başına yeterli mi diye yosunu eski yerine koyup yalnızca bütçeyi 31 yaptım.
Deneme
Hata paylı
Hedef odaklı
Beceri payı
Önceki hâl · 30 hamle
%50,0
%62,4
12,4 puan
Yosun gövdenin üstünde · 31 hamle
%56,4
%61,1
4,7 puan
Yalnızca 31 hamle · kaydettiğim
%56,5
%63,0
6,5 puan
Sonuç ve karar
31 hamleli iki seçeneğin hata paylı bot sonuçları çok yakındı. Yalnızca bütçeyi değiştirmek de hedefi ve profil farkı aralığını karşılıyordu. Yosunun iki kanada yayılabilmesi, bölümde öğretmek istediğim kararın parçasıydı. Bu yüzden yerini koruyup hamle sınırını 31 yaptım. Kayıtlı sürümde bot hedefin 2,5 puan üstünde, profil farkı 6,5 puan. Bu ölçüm yosunun yerinin hiç etkisi olmadığını kanıtlamıyor.
İki örnekte de profil başına 1.000 koşu, seed 1234 ve aynı oyun kuralları var. Bu editör testinde aynı seed, her koşunun aynı başlangıç tahtasıyla eşleşmesini garanti etmiyor. Hamle seçimi ve oyun uzunluğu rastgele sayı akışını değiştirebiliyor. Sonuçları bu ayarlardaki bot karşılaştırmaları olarak okuyorum. Isı haritasının yüzdeleri de yalnızca kaybedilen koşulara ait.
Kayıtlı raporların ayarları
İki raporda da profil başına 1.000 koşu ve seed 1234 var. Spawn bias %30. Power-up eşikleri 7, 10 ve 13, Kova kapasitesi 8, Mühür yarıçapı 2. Kalan hamle yalnızca kazanılan, hedef ilerlemesi yalnızca kaybedilen koşuların ortalaması. Aşağıdaki değerler hata paylı profile ait. Bu raporlar seçilen tasarımları gösteriyor. Önceki bütün alternatiflerin ham koşu kayıtlarını içermiyor.
Kayıtlı tasarım · 9 Ekim
Hamle / hedef
Kazananlarda kalan hamle
Kayıplarda hedef ilerlemesi
20 · Servi · 22:56
31 / 24
12,87
%93,2
97 · Kelebek · 22:54
31 / 38
7,04
%91,4
Botlarla A/B testi
Kilim’de üç soruya baktım: kaç hamle olmalı, boyanan kareler korunmalı mı ve yeni karolar hedeflere ne kadar yardım etmeli? Her karşılaştırmada ilgili ayarı değiştirip diğer kuralları sabit tuttum. Aynı bot profilleri alternatifleri oynadı. Gerçek oyuncuları iki gruba ayıran canlı bir test yapmadım.
Hipotez ve test planı
Ana ölçümüm, hata paylı botun tamamlama oranının Kilim için seçtiğim %60 hedefine yakınlığıydı. Hedef odaklı ve rastgele botları da izledim. Amacım yalnızca oranı yükseltmek değildi. Her koşulda profil başına 900 koşu var. Desen, renk havuzu ve power-up kuralları aynı. İlgili deneyde yalnızca hamle, boyama veya yeni karo ayarı değişiyor.
1. Hamle bütçesi: 31, 33 veya 35?
Sınadığım fikir: 33 hamle, ilk temanın sonunda power-up planlamak için yeterli alan bırakabilir. 31 hamlede bot hedefin altında, 35 hamlede üstünde kalabilir.
Mevcut 33 hamlelik sürümü, 31 ve 35 hamleyle aynı senaryo seed’lerinde tekrar ölçtüm. Desen, renk havuzu, power-up kuralları ve spawn ayarı sabit kaldı. Her seçenek için profil başına 900, üç profilde toplam 2.700 koşu var.
Hamle
Hata paylı
Hedef odaklı
Rastgele
31
%54,6
%61,3
%0,1
33
%62,1
%70,1
%0,1
35
%71,3
%76,9
%0,4
Kararım: 33 hamleyi korudum. Hata paylı botun %62,1 sonucu, %60 tasarım hedefine yakın. 31 hamlede %54,6, 35 hamlede %71,3 çıkıyor. İlk temanın sonunda power-up planlaması isteyen bir kapanış hedeflediğim için en yüksek oranı seçmedim.
33 hamlede kaybeden hata paylı bot, desenin ortalama %92,1’ini tamamlıyor. Kalan hedeflerin konumuna bakmak için bunu bir işaret olarak kullanıyorum. Bu veri oyuncunun ne kadar hayal kırıklığı yaşadığını veya ek hamle almak isteyip istemediğini ölçmüyor. Kazanan botlarda ortalama 7,38 hamle kalıyor. Bu ortalama yalnızca kazanılan denemelerden hesaplanıyor.
Bu, alternatiflerin yerel karşılaştırması. Mevcut raporu bir önce–sonra iyileştirmesi olarak sunmuyorum ve test için oyunun bölüm dosyasını değiştirmedim.
2. Tamamlanmış kareler korunmalı mı?
Sınadığım fikir: Boyanan kareler korunursa bot kalan hedeflere odaklanabilir. Koruma kalkarsa aynı bütçede bitirmek zorlaşabilir. Bu yüzden tamamlama oranıyla birlikte kaybedilen koşulardaki hedef ilerlemesini de ölçtüm.
Mevcut sürümde doğru boyanan kare korunuyor. Alternatifte yanlış renkle yapılan sonraki patlamalar bu ilerlemeyi bozabiliyor. Bu değişiklik, hedefin yanında “daha önce yaptığımı koruma” yükü de ekliyor.
Boyama kuralı
Kazanan koşu
Tamamlama
Kaybedenlerde boyanan hedef
Kareler korunuyor · mevcut
559 / 900
%62,1
%92,1
Yanlış renk ilerlemeyi bozabiliyor
3 / 900
%0,3
%63,0
Kararım: Boyanan kareleri koruyan kuralı sürdürdüm. Koruma kalktığında hata paylı botun tamamlama oranı %62,1’den %0,3’e, kayıplardaki ilerlemesi %92,1’den %63,0’a indi. Aynı bütçe ve bot puanlamasıyla bu seçenek Kilim’i çok zorlaştırdı. Alternatif kurala göre botun hamle puanlarını veya bütçeyi yeniden ayarlamadım. Dolayısıyla bu testten, üstüne boyamanın her oyunda kötü olduğu sonucunu çıkarmıyorum.
3. Yeni karolar hedeflere ne kadar yardım etmeli?
Sınadığım fikir: Yeni karolar için kullandığım %30 hedef rengi desteği, botun sonucunu tasarım hedefine yakın tutabilir. Bu desteği kaldırıp %60’a çıkardığımda ne değiştiğine baktım. Hata paylı botla birlikte rastgele botu da izledim.
Mevcut ayarda %30 hedef rengi desteği, yani spawn bias var. Bir sütunda eksik hedef rengi bulunuyorsa yeni karonun rengi %30 olasılıkla bu renklerden seçiliyor. Diğer durumda normal renk havuzu kullanılıyor. Bu ayar, %30 kazanma desteği veya işe yarayan bir grup garantisi vermiyor.
Taş geliş ayarı
Kazanan koşu
Tamamlama
Rastgele profil
Yönlendirme yok · %0
460 / 900
%51,1
%0,0
Mevcut · %30
559 / 900
%62,1
%0,1
Daha güçlü · %60
660 / 900
%73,3
%0,4
Kararım: Kilim’de %30 ayarını korudum. Desteği kaldırınca hata paylı bot %51,1’e düşüyor. %60’a çıkarınca %73,3’e ulaşıyor. Mevcut ayar %60 tasarım hedefine yakın ve rastgele bot %0,1’de kalıyor. Üç seçenekte de rastgele hamleler aynı başarıya ulaşmıyor. Oyuncunun adalet veya kontrol hissini ise bu testle ölçmedim.
Deneyin kapsamı
Altı koşul ölçtüm: 31, 33 ve 35 hamle, 33 hamlede üstüne boyama, 33 hamlede %0 ve %60 hedef rengi desteği. Her koşulda profil başına 900, toplam 2.700 koşu var. Deneyin tamamı 16.200 benzersiz koşudan oluşuyor. Mevcut sürüm üç karşılaştırmada ortak, bu yüzden tekrar sayılmıyor.
Üç seed bloğunda 300’er koşu kullandım. Hamle ve boyama karşılaştırmaları aynı başlangıç senaryolarıyla çalışıyor. Yeni karo kuralı değiştiğinde ise aynı seed aynı tahtayı garanti etmiyor. Test ayarlarını ve örneklemeden gelen belirsizliği aşağıda gösteriyorum.
Altı koşulda üç profilin sonuçları
Koşul
Hata paylı
Hedef odaklı
Rastgele
31 hamle
491 / 900 · %54,6
552 / 900 · %61,3
1 / 900 · %0,1
33 hamle · mevcut
559 / 900 · %62,1
631 / 900 · %70,1
1 / 900 · %0,1
35 hamle
642 / 900 · %71,3
692 / 900 · %76,9
4 / 900 · %0,4
Üstüne boyama · 33 hamle
3 / 900 · %0,3
4 / 900 · %0,4
0 / 900 · %0,0
%0 spawn bias · 33 hamle
460 / 900 · %51,1
511 / 900 · %56,8
0 / 900 · %0,0
%60 spawn bias · 33 hamle
660 / 900 · %73,3
721 / 900 · %80,1
4 / 900 · %0,4
Test ayarları ve belirsizlik
Seed blokları 1729, 8675309 ve 20261009. Her blokta 300 koşu var. Her koşunun seed’i blok + deneme × 104729. Deneme numarası sıfırdan başlıyor. Her oyun ayrı bir simülatör çağrısı olduğu için önceki oyunun rastgele sayı tüketimi sonraki başlangıcı değiştirmiyor. Hamle ve boyama karşılaştırmaları aynı başlangıçları kullanıyor. Spawn kuralı ve profillerin farklı seçimleri sonraki tahtaları değiştirebiliyor.
Bütün koşullarda 9×9 tahta, 35 hedef ve dört renk var. Power-up’lar açık, splash kapalı. Eşikler 7/10/13, Kova kapasitesi 8, Mühür yarıçapı 2. Hata paylı bot mevcut sürümde 559/900 (%62,1) kazanıyor. %95 Wilson aralığı yaklaşık %58,9–65,2. Bu aralık, bot koşuları ve senaryoların örneklenmesinden gelen belirsizliği gösteriyor. Gerçek oyuncu davranışını temsil etmiyor.
Kalan hamle yalnızca kazanılan, hedef ilerlemesi yalnızca kaybedilen koşuların ortalaması. Power-up oluşturma ve kullanma bütün koşular üzerinden hesaplanıyor. Eski 100 bölüm raporundaki saniye, oynama değil hesaplama süresi. Oradaki Kilim %60,2 ile bu deneydeki %62,1 farklı seed yöntemleri kullanıyor. Aradaki fark bir tasarım iyileşmesi değil.
SQL ve Excel
Altın varak ekonomisine ve devam tekliflerine bakmak için 4.000 botla oyunu baştan sırayla oynadım. Oyunun kendi tahta ve bot kodunu kullandım. Servi’de editörün kayıtlı sonucu birebir eşleşti.
4.000 bot: %70’i hata paylı, %30’u hedef odaklı. Aynı bölümde art arda 3–8 kez kaybeden bot oyunu bırakıyor.
Hamleleri bittiğinde desenin en az %80’i boyanmışsa ve altını yetiyorsa bot, 30 altınla bir kez devam ediyor. Bu kuralı ben seçtim. Modelde reklam, can bekleme süresi ve satın alma yok.
Toplam 434.900 deneme oynandı. 4.000 botun 2.910’u 100. bölümü bitirdi.
Veriyi üç basit tabloya koyup SQL’le sorular sordum. Sorgular SQLite’ta çalışıyor.
players: her satır bir bot: profili, kaç bölüm geçtiği, oyunu bıraktıysa hangi bölümde bıraktığı, kazandığı ve harcadığı altın.
attempts: her satır bir deneme: bölüm, kazanıp kazanmadığı, devam alınıp alınmadığı, teklif anında desenin yüzde kaçının boyandığı, kazanılan ve harcanan altın.
levels: her bölümün adı, teması ve türü.
1. Ek hamle almak denemeyi kurtarıyor mu?
SQL · sırayla oynama verisi
-- Altınla alınan continue attempt'i kurtarıyor mu?SELECTCASEWHEN offer_progress >= 90THEN'90-99%'ELSE'80-89%'ENDAS painted_at_offer,
COUNT(*) AS continues,
ROUND(100.0 * SUM(won) / COUNT(*), 1) AS won_pct
FROM attempts
WHERE continued = 1GROUPBY painted_at_offer;
painted_at_offer
continues
won_pct
80-89%
37918
32.5
90-99%
72540
54.8
Sorgu ne yapıyor? Ek hamle alınan denemeleri continued = 1 ile seçiyor. CASE WHEN, teklif anında desenin en az %90’ı boyanmışsa “90-99%”, diğer durumda “80-89%” grubuna ayırıyor. Her grupta kaç kez ek hamle alındığını ve bunların yüzde kaçının kazanmayla bittiğini hesaplıyor.
Ne gördüm? Desenin en az %90’ı boyanmışken alınan devamların %54,8’i kazanmayla bitiyor. %80–89 aralığında bu oran %32,5. Aynı 30 altının sağladığı sonuç, kalan hedeflere göre değişiyor. Teklif penceresinde boyanan kare sayısını zaten gösteriyorum. Bu ölçüm, karar verirken ilerlemenin görünür olmasını neden önemsediğimi destekliyor.
2. Botları en çok hangi bölümlerde kaybediyoruz?
SQL · sırayla oynama verisi
-- Botları en çok hangi level'larda kaybediyoruz?SELECT l.level,
l.name,
l.tier,
COUNT(*) AS bots_quit
FROM players p
JOIN levels l ON l.level = p.stopped_at_level
WHERE p.finished = 0GROUPBY l.level, l.name, l.tier
ORDERBY bots_quit DESCLIMIT5;
bölüm
name
tier
bots_quit
13
Kum Saati
zor
99
37
Labirent
zor
89
19
İki Lale
zor
83
56
Zincir
zor
81
81
Kuru Havuz
zor
75
Sorgu ne yapıyor? Oyunu bitirmeyen botları bıraktıkları bölüme göre grupluyor. JOIN, levels tablosundan bölümün adını ve türünü getiriyor. En çok bot kaybedilen beş bölüm listeleniyor.
Ne gördüm? İlk beşin hepsi zor olarak planladığım bölümler: Kum Saati, Labirent, İki Lale, Zincir ve Kuru Havuz. Bu modelde botlar birkaç ardışık kayıptan sonra bırakıyor ve ek hamle alabiliyor. Sonuç bu varsayımlara bağlı. Gerçek oyuncular başka nedenlerle de bırakabilir.
3. Kazanılan altının ne kadarı devam etmek için gidiyor?
SQL · sırayla oynama verisi
-- Her temada kazanılan altının ne kadarı continue'a gidiyor?SELECT l.theme,
SUM(a.gold_earned) AS gold_earned,
SUM(a.gold_spent) AS gold_spent,
ROUND(100.0 * SUM(a.gold_spent) / SUM(a.gold_earned), 1) AS spent_pct
FROM attempts a
JOIN levels l ON l.level = a.level
GROUPBY l.theme_no, l.theme
ORDERBY l.theme_no;
theme
gold_earned
gold_spent
spent_pct
Karo Workshop
1094461
669390
61.2
Excavation
1132337
897780
79.3
Palace
1040035
883230
84.9
Garden
901869
863340
95.7
Sorgu ne yapıyor? attempts tablosunu levels ile JOIN’leyip her temada kazanılan ve devam etmek için harcanan altını topluyor. Harcananı kazanılana bölüp yüzdeye çeviriyor.
Ne gördüm? Çini Atölyesi’nde kazanılan altının %61’i, Bahçe’de %96’sı devam etmek için harcanıyor. Bu senaryoda sona doğru altın birikmiyor, neredeyse kazanıldığı kadar harcanıyor. Botlar koşulları sağladıklarında her zaman devam etmeyi seçiyor. Bu bir satın alma veya gelir tahmini değil.
Excel çalışma kitabı
Aynı koşuyu Excel’e de aktardım. Players sayfasında her bot, Continues sayfasında her devam işlemi ve sonucu ayrı bir satır. Continue sayfasında iki profilin sonuçlarını ayrı gösteriyorum. Levels sayfasında başlayan ve bırakan botlar, Economy sayfasında tema başına kazanılan ve harcanan altın var. Hesaplar COUNTIFS ve SUM formülleriyle yapılıyor.
Excel · iki formül
Continue!B2 · teklifte desenin %80–89’u boyanmışken alınan continue sayısı
=COUNTIFS(Continues!E:E, ">=80", Continues!E:E, "<=89")
Levels!G2 · bu level’da oyunu bırakan bot sayısı
=COUNTIFS(Players!E:E, A2)
Excel’deki Continue sayfası. İki profilde de sonuç aynı yönde. Görseli büyütmek için üzerine tıklayabilirsin.
Bu kısımdaki bütün tablolar bot verisinden geliyor. Gerçek oyuncu sonucu değil. Koşu 12 Ekim 2026’da, seed 20261012 ile yapıldı.
Analitik ve ürün kararları
Botlarla tahta tasarımını karşılaştırabildim. Ürün kararları içinse oyuncunun öğretimden, bölümden ve devam teklifinden nasıl geçtiğini görmem gerekecek. Bu nedenle hamlelerin bitmesini, devam seçimini, öğretim adımlarını ve ekonomi hareketlerini kaydeden olaylar ekledim. Aşağıdaki tablo, veri geldiğinde neye bakacağımı gösteriyor. Henüz elde edilmiş oyuncu sonuçları yok.
Akışı anlamayan oyuncular varsa metni veya işaretlemeyi değiştirmek. Olay dizisi tek başına nedenini söylemez. Küçük bir gözlem testiyle kontrol etmek.
Hangi bölüm gereğinden fazla tıkıyor?
level_start / level_end · deneme sayısı, win/fail/quit/restart, kalan hamle, ilerleme
İlk denemeleri, tekrar oynanan bölümleri ve ek hamle kullanılan sonuçları ayrı incelemek. Sorun son karelerdeyse yerleşimi. Genel baskıysa hamle bütçesini denemek.
Hamle bitince oyuncu ne seçiyor?
out_of_moves / continue_used · gösterilen teklifler, altın, ilerleme, devam yöntemi
Teklife erişebilenler içindeki devam oranını ve sonraki sonucu izlemek. Bir seçenek daha az kullanılıyor diye doğrudan pahalı veya değersiz saymamak.
Ekonomi nerede sıkışıyor?
earn_virtual_currency / spend_virtual_currency / lives_refill · kaynak, harcama ve can yenileme
Tekrar oynama ödüllerini ayrı görmek. Altın birikimiyle can veya devam baskısının ilişkisini incelemek.
Mağaza ve reklam akışı çalışıyor mu?
shop_open / shop_purchase / rewarded_ad · açılış kaynağı, satın alma sonucu, ödülün verilmesi
Tamamlanan, iptal edilen, bekleyen ve başarısız işlemleri ayırmak. Önce teknik akışı kontrol etmek. Sonra dönüşüm hipotezi kurmak.
level_end olayında sonuç, deneme sayısı, bölüm süresi, kullanılan ve kalan hamleler, boyanan hedef yüzdesi ve altın ya da reklamla devam sayıları tutuluyor. out_of_moves ise hangi devam seçeneklerinin gerçekten sunulduğunu kaydediyor. Böylece teklif hiç gösterilmeyen denemeyle, gösterilip seçilmeyen denemeyi ayırabiliyorum.
Oyuna geri dönme, gelir veya satın alma oranı için henüz oyuncu sonucu yok. Veri geldiğinde önce kayıtların doğru çalıştığını kontrol etmek, ardından bölüm bazında hipotez kurmak istiyorum. Kilim’in hamle sınırını Remote Config ile değiştirebiliyorum. Boyama ve hedef rengi desteği deneyleri içinse yeni bir oyun kuralı sürümü hazırlamak gerekiyor.
Ekonomi ve para kazanma
Oyunun para birimi altın varak. Bölüm kazanarak, ödüllü reklam izleyerek veya mağazadan paket alarak varak kazanılabiliyor. Ek hamle ve can doldurma için harcanıyor. Tablodaki değerler varsayılan oyun ayarları. Bu fiyatların oyuncu verisiyle doğrulandığını söylemiyorum.
Sistem
Varsayılan değer
Tasarımda dikkat ettiğim nokta
Başlangıç ve kazanma
60 varak başlangıç · kazanma ödülü 5 + kalan hamle
Verimli tamamlama ödüllendiriliyor. Tekrar kazanılan bölümler da ödül verdiği için birikim ve kolay bölüm tekrarı ayrıca izlenmeli.
Can
En fazla 5 · 30 dakikada 1 yenileme
Can, denemeyi bitirme akışına bağlı. Bot ölçümünde bu bekleme ve oturum etkisi yok.
Altınla devam
+5 hamle · ilk ücret 30, sonraki altınla devam seçenekleri 60, 90…
Ücret aynı denemedeki altınla devam sayısıyla artıyor. Reklamla devam bu sayacı artırmıyor.
Can doldurma
100 varak
Bakiye ve can sıfırlanması birlikte izlenmeli. Yalnızca harcama sayısı yeterli değil.
Ödüllü reklam
Devam: +5 hamle, denemede en fazla 1 · serbest varak: 20, günde en fazla 5
Ek can ve kazanma ödülünü ikiye katlama seçenekleri de var. Ödül, reklamın tamamlanma sonucuna bağlı.
Satın alma
300 / 1.000 / 2.500 varak paketleri
Fiyat mağazadan ve yerel para birimiyle geliyor. Gerçek satın alma veya gelir sonucu bu çalışmanın parçası değil.
Bölümleri dengelerken ek hamle ve satın alma olmadan tamamlanıp tamamlanmadıklarına bakıyorum. Ekonominin, temel bölümdeki bir sorunu örtmesini istemiyorum. Ücretleri ve reklam sınırlarını Remote Config ile değiştirebiliyorum. Bir değişiklikten önce neyi sınayacağımı ve hangi ölçüyü korumak istediğimi belirlemem gerekiyor.
Teknik ayrıntılar
Kodun yapısı
Oyunu Unity 6’da C# ile yazdım. Kuralları, ekranda nasıl gösterildiklerinden ayırdım. Geliştirici araçları da bu kuralları kullanıyor. Bir kural değiştiğinde oyun, botlar ve editör aynı kodla çalışmaya devam ediyor.
Parça
Ne yapıyor
Core
Tahta, patlama, boyama, engeller, power-up’lar, bölüm dosyaları ve oyuncu ilerlemesi. Görsel ya da sahne kodu içermiyor.
Game
Tahtanın görünümü, animasyonlar, Arayüz, haptic ve ekranlar arası akış.
Services
Firebase (Analitik ve Remote Config), AdMob ve Unity IAP. Oyun bunlara interface’ler üzerinden ulaşıyor. Paket kurulu değilse bu kod derlenmiyor.
Dev tools
Botlar, oyun içi kısayollar, sahte reklam ve store. Yalnızca Unity editöründe ve development build’lerinde var. Mağaza sürümüne girmiyor.
Editör ve testler
Bölüm editörü, denge ve QA menüleri yalnızca Unity editöründe çalışıyor. Kuralları NUnit birim testleri koruyor. 9 Ekim’de 138 testin hepsi geçti.
Bir bölüm: harflerden oluşan küçük bir dosya
Her bölüm küçük bir JSON dosyasında duruyor. Hedef desenini harflerle tutuyorum: T turkuaz, K kobalt, M mercan, S safran, Z zümrüt, nokta ise boş kare. Engeller ayrı bir katmanda aynı biçimde yazılıyor. spawnColors, tahtaya gelen karoların renklerini belirliyor. Servi’de safran yok. target ise hata paylı botun tamamlama hedefi. Bölümü editörden veya dosyadan, kural koduna dokunmadan değiştirebiliyorum.
Bir gruba dokunulduğunda Blast sonucu hesaplayıp tahtaya uyguluyor. Hamle sayacı, kazanma, kaybetme ve yosun yayılması da burada belirleniyor. Preview aynı hesabı tahtayı değiştirmeden yapıyor. Botlar seçenekleri bununla değerlendiriyor. Böylece testteki kuralla oyundaki kural aynı kalıyor.
BoardModel.cs · bir dokunuş
public BlastResult Preview(int x, int y) =>
State == GameState.Playing ? Resolve(x, y, previewResult) : null;
public BlastResult Blast(int x, int y)
{
if (State != GameState.Playing) returnnull;
var result = Resolve(x, y, moveResult);
if (result == null) returnnull;
MovesLeft--;
MoveNumber++;
Apply(result);
RecountPainted();
if (PaintedCount >= TargetCount) State = GameState.Won;
elseif (MovesLeft <= 0) State = GameState.Lost;
else
{
if (result.MossDestroyed == 0) SpreadMoss(result);
ShuffleUntilPlayable(result);
if (!HasAnyMove()) State = GameState.Lost;
}
return result;
}
Ekranda: aynı sonucu sırayla oynatmak
Ekran kodu kuralları yeniden hesaplamıyor. Dokunuşu modele iletiyor, gelen sonucu animasyonları yöneten sınıfa veriyor. Temizlenen karolar, boyanan kareler, engel hasarı, power-up’lar, düşüş ve yosun bu sonuçtan okunup sırayla oynatılıyor.
Patlama, boyama, düşüş, engeller ve power-up’lar aynı tahta modelinde hesaplanıyor. Botlar da bu modeli kullanıyor. Sabit seed’ler ve CSV raporlarıyla bir değişikliği yeniden ölçebiliyorum.
Bölüm düzenleme ve dengeleme araçlarının çalışma akışı Bölüm editörü kısmında. Bu araçların ortak tahta modelini kullanması, editörde gördüğüm bir kuralın oyun ve bot ölçümünde farklı uygulanmasını önlemeye yardımcı oluyor.
Oynanışı etkileyen küçük kurallar
Yeni bir karo geldiğinde %30 olasılıkla, o sütunda eksik kalan hedef renklerinden biri seçiliyor. Diğer durumlarda normal renk havuzu kullanılıyor. Desenin sonuna yaklaşırken doğru rengi bekleme ihtimalini azaltmak istedim. Power-up türünü de grup büyüklüğü belirliyor: 7 ve üstü Fırça, 10 ve üstü Kova, 13 ve üstü Mühür oluşturuyor.
BoardModel.Apply.cs · yeni karonun rengi
int SpawnColor(int column)
{
if (Rules.SpawnBias > 0f)
{
biasedSpawnPool.Clear();
for (int y = 0; y < Height; y++)
{
int cell = Index(column, y);
int target = targets[cell];
if (target >= 0 && painted[cell] != target && Array.IndexOf(spawnColors, target) >= 0) biasedSpawnPool.Add(target);
}
if (biasedSpawnPool.Count > 0 && random.NextDouble() < Rules.SpawnBias)
return biasedSpawnPool[random.Next(biasedSpawnPool.Count)];
}
return spawnColors[random.Next(spawnColors.Length)];
}
Remote Config değerlerinin güvenli uygulanması
Remote Config ile bölümün hamle sınırını, genel hamle katkısını, can ve ekonomi değerlerini değiştirebiliyorum. Sayıları izin verilen aralıklarda tutuyorum. Örneğin bölümün hamle sınırı 1–99 arasında kalıyor. Yeni ayarlar devam eden tahtayı değiştirmiyor, harita akışında uygulanıyor.
Bu altyapıyı deneyleri kontrollü uygulayabilmek için hazırladım. Henüz bir büyüme sonucu ölçmedim. Reklam ve satın alma akışlarını da Unity editöründe sahte servislerle kontrol edebiliyorum.
Arayüz ve görseller
Görsellerde çiniden esinlendim. Turkuaz arka plan, kobalt çerçeve ve sırlı seramik gibi parlayan kabartmalı karolar kullandım. Karoları, engelleri ve power-up’ları Blender’da hazırladım. Arayüz ve arka planı Figma’da tasarladım. Aşağıdaki görseller oyunun kendi dosyalarından.
Beş renk, beş çiçek
Her renge ayrı bir çiçek verdim. Unutma beninin yuvarlak yaprakları, çan çiçeğinin sivri yaprakları, gülün katları, papatyanın ince yaprakları ve nilüferin yandan görünüşü birbirinden ayrılıyor. Karoların yalnızca renkle tanınmasını istemedim. Renkleri ayırt etmekte zorlanan veya ekranı güneş altında gören birinin de şekilden yararlanabilmesini amaçladım.
TurkuazUnutma beni
KobaltÇan çiçeği
MercanGül
SafranPapatya
ZümrütNilüfer
Üstte oyundaki beş karo, altta aynı karolar gri tonlamada. Renk kalkınca da çiçekler birbirinden ayrılıyor.
Hedef kareyi renk dışında da göstermek
Doğru renkteki bir grup patladığında altındaki hedefler boyanıyor. Sonraki yanlış renk, tamamlanmış kareyi bozmuyor. Bekleyen hedefi göstermek için karonun çevresinde kalan şeride çapraz tarama ekledim. Boyanınca tarama kalkıyor ve zemin sırlı yüzeye dönüyor. Böylece kalan hedefleri renk dışında bir işaretle de takip edebiliyorsun.
Hedef değilSade sıva zemin.Boyanmayı bekliyorKobalt hedef: açık mavi zemin ve kobalt tarama. Üstteki karonun rengi fark etmiyor.TamamlandıZemin kobalt sırına döndü, tarama kalktı.
Oyundaki zemin, tarama ve karo dosyalarını oyunun çizim kurallarıyla üst üste koyarak hazırladım.
Engeller ve power-up’lar
Engelleri ve power-up’ları karolarla aynı kamera ve ışıkta hazırladım. Birlikte durduklarında aynı görsel sete ait olmalarını istedim. Kildeki çatlak tek darbeyi, üst üste katmanlar çift darbeyi çağrıştırıyor. Kafesin içindeki karo gruba katılabildiği için rengini görünür bıraktım. Yosuna yayılan, canlı bir görünüş verdim. Pirinç ve krem rengindeki Fırça, Kova ve Mühür çiçeksiz bir karonun üzerinde duruyor. Böylece simgeleri öne çıkıyor.
KilBir darbe
Çift katlı kilİki darbe
KafesKaroyu yerinde tutar
YosunYayılır
Fırça7–9 karelik grup
Kova10–12 karelik grup
Mühür13+ karelik grup
Render kalitesini düzeltmek
İlk görsellerde parlamalar sert ve tırtıklıydı. Yükseklik haritasının 8 bitlik basamakları, fazla pürüzsüz sır ve küçük ışık kaynakları buna katkı yapıyordu. Haritayı daha yüksek hassasiyetle yumuşattım, kabartmayı alçalttım, sır yüzeyini hafifçe matlaştırdım ve ışıkları büyüttüm. Görselleri iki kat çözünürlükte hazırlayıp oyun boyutuna küçülttüm. Kilde yüzeyin üzerinde duran çatlak çubuklarını gerçek oluklara çevirdim. 19 görseli yeniledim. Boyutları ve içe aktarma ayarları değişmediği için kapladıkları doku belleği artmadı.
Önce
Sonra
Düz kobalt karo: sert parlama yumuşadı.
Önce
Sonra
Kil çatlağı, yakından: yüzeydeki çubuk gerçek oluğa döndü.
Arayüz parçaları
Butonları, rozetleri, çerçeveleri, panelleri ve simgeleri Figma’da tasarladım. Lacivert dış çizgi, koyu alt ton ve hafifçe kaydırılmış açık yüzeyi hepsinde kullandım. Butonlara bir de parlama çizgisi ekledim. Panel, çerçeve ve butonları 9-slice kestim, böylece uzadıklarında köşeleri bozulmuyor. Aynı paneli diyaloglarda, mağazada ve üst bilgi alanında kullanıyorum.
Ana buton
Ödüllü reklam
Harita rozeti
Kilitli rozet
Çerçeve
Panel
Can
Altın varak
Kilit
Ayarlar
Reklam izle
Lacivert #1B2E5E Dış çizgiler
Kobalt #2F63C6 Çerçeve, reklam butonu
Yeşil #47C65E Ana buton
Safran #FFC93C Rozet, kilit, altın
Mercan #F2545B Can
Turkuaz #2DB7AF Arka plan
Ekran düzeni ve diller
Hamle sayısını büyük bir dairede, hedef deseni hemen yanında tutuyorum. Tahtanın altındaki yeniden başlatma ve haritaya dönüş seçenekleri, oynanış alanının dışında.
Menü, ipucu ve teklif metinleri 7 dilde var: Türkçe, İngilizce, Fransızca, İtalyanca, Almanca, İspanyolca ve Portekizce. Uzun metinleri, küçük ekranda hedef önizlemesini ve renk dışındaki işaretleri gerçek cihazda kontrol etmek istiyorum. Oyuncuların bunları nasıl okuduğunu da ayrıca gözlemlemek gerekecek.
Sıradaki adımlar
Gerçek oyunculara ulaşıp hedef desenin, doğru renk kuralının ve power-up’ların ne kadar anlaşılır olduğunu oynanış testlerinde kontrol etmem gerekiyor.
Crumble Crew, beş gruba ayrılan 50 bölümlük bir yıkım bulmacası. Alttaki üç renkli butondan birini seçerek hedefindeki blokları kaldırıyorsun. Desteği giden yapı çöküyor. En çok bloğu yıkan hamle her zaman en iyi seçim değil. Yanlış sırayla ilerlersen son bir blok ayakta kalabiliyor.
Kısa bir kararın ardından çöküşü rahatça izleyebileceğin bir oyun yapmak istedim. Her grupta tek bir yeni blok kuralı tanıtıyor, sonra onu önceki kurallarla birleştiriyorum. Bölümün hangi kararı istediğine, bu karar için ekranda neyin görünmesi gerektiğine ve zor bölümlerin arasında nerede nefes aldıracağıma odaklandım.
Bu projede yaptıklarım
Bölüm tasarımı: 50 bölümün tamamını geliştirdiğim editörde tasarladım. Onar bölümlük beş grubun yeni bloğunu, öğretim bölümlerini ve finalini planladım.
Test ve iyileştirme: Bölüm kontrol aracı ve 50 davranış profili kullanan bir bot testi yazdım. Veriyi SQL ve Excel’le inceledim. Gördüğüm sorunlara göre 7 bölümü değiştirip testleri yeniden çalıştırdım.
Ürün kararları: Analitik olaylarını ve ölçülerini belirledim. Remote Config ayarlarına sınırlar koydum. Oyunda reklam veya satın alma yok. Veriyi ilerleme, öğrenme ve performansı incelemek için kullanmayı planladım.
Geliştirme ve görseller: Çöküş kurallarını Unity’de C# ile yazdım. Blokları Blender’da modelledim, arayüzü Figma’da tasarladım.
Veriyi nasıl topladım?
Geniş ölçekli oyuncu testine erişimim olmadığı için bölümleri, farklı oynama davranışlarını modelleyen botlarla test ettim. Botların varsayımlarını sonuçlarla birlikte paylaştım. Değişiklikleri aynı koşullarda karşılaştırdım. Bu sonuçlar bot testlerinden geliyor. Gerçek oyuncular üzerindeki etkisini henüz doğrulamadım.
Her buton yalnızca kendi rengindeki blokları yıkıyor. Üzerindeki sayı, o anda kaç bloğa vuracağını gösteriyor. Desteği giden bloklar düşüyor. İki blok yüksekliği veya daha fazla mesafeden düşen normal bloklar parçalanıp alttakileri de ezebiliyor. Hamleyi geri alamıyorsun ve sıradaki buton görünmüyor.
Önce sırayı öğrenmek
Videoda aynı bölümü iki kez oynuyorum. İlk denemede hamleler bitiyor ve bir kırmızı blok ayakta kalıyor. İkinci denemede o bloğu önce kaldırıyorum. Son vuruşla bütün yapı çöküyor. Değişen yalnızca hamle sırası.
İlk dokunuşta hedef bloklar parlıyor, ikinci dokunuşta yıkılıyor. Hamleyi onaylamadan önce sonucunu görebileceğin bir adım bıraktım.
Kullanılan butonun yerine sıradaki geliyor. Oyuncu yalnızca ekrandaki üç butonu
görüyor.
Bütün bloklar yıkılınca bölüm bitiyor. Hamleler biterse oyun kaç bloğun ayakta
kaldığını söylüyor ve “Tekrar dene” ile bölüm baştan başlıyor.
Oyun ekranındaki öğeler
4. bölümden bir ekran. Numaralar, burada sözünü ettiğim öğeleri gösteriyor.
12345
1Kalan hamleler. Her nokta
bir hamle. Bu ekranda iki hamle kaldı.
2Bölüm adı ve menü. Menü
oyunu duraklatıyor: devam etmek, bölümü yeniden başlatmak ya da ana sayfaya
dönmek.
3Yapı. Bölümün kendisi:
zemine ya da birbirine dayanan renkli bloklar. Bütün bloklar yıkılınca bölüm
biter.
4Hedefteki bloklar. Butona
bir kez dokununca vuracağı bloklar parlıyor. Burada kırmızı 6’nın yıkacağı
iki ayak. İkinci dokunuş onları yıkıyor.
5Butonlar. Ekranda hep üç
buton var. Rengi hangi blokları yıkacağını, sayısı kaç bloğa vuracağını
söylüyor. Kullanılanın yerine sıradaki geliyor.
Oyun döngüsü
BakHangi blok neyi taşıyor?
SeçBir renge dokun, hedefler parlasın.
Vurİkinci dokunuş blokları yıkar.
İzleDesteği giden her şey çöker.
Hamleler bitince kaç bloğun ayakta kaldığı görünüyor. Bölümü tek dokunuşla yeniden başlatabiliyorsun. Geri alma yok ve sıradaki buton gizli. Oyuncunun kaybettikten sonra başka bir sıra denemesini istedim.
Bölüm dışında ilerleme bir patikadan takip ediliyor. Her bölüm sıradakini açıyor, her on bölümde yeni bir blok geliyor. Bütün bölümler bitince patikanın sonunda “Yakında” kutusu çıkıyor. Reklam ve satın alma eklemedim. İlerlemenin karşılığı yeni yapılar ve bloklar.
Bölüm tasarımı
50 bölümü onar bölümlük beş gruba ayırdım. Her grup bir yeni blokla başlıyor. Önce kuralını tanıtıyor, sonra eski bloklarla birleştiriyor ve bir finalle kapanıyor. Eski blokları oyundan çıkarmıyorum. Son bölümde çelik, bukalemun ve çift renkli bloklar birlikte kullanılıyor. Yeni bir blok fikri geldiğinde bir grup daha ekleyebilmek için katalog ve bölüm seçimini buna uygun kurdum.
Soldan sağa: normal, çelik, bukalemun, çapa, çift renkli.
Bölümler
Yeni blok
Ne yapıyor
Oyuncunun muhtemel yeni sorusu
1–10
Normal
Desteği gidince düşer, yüksekten düşerse parçalanır
Hangi blok neyi taşıyor?
11–20
Çelik
Düşünce kırılmaz, üstüne düşen de onu ezemez. Ancak kendi rengiyle vurulunca
kırılır
Çöküşten sonra geriye ne kalacak?
21–30
Bukalemun
Son kullanılan rengi alır
Hamle sıram renkleri nasıl değiştirecek?
31–40
Çapa
Havada asılı durur, komşularını taşır
Bu yapı yere değil de neye tutunuyor?
41–50
Çift renkli
İki ayrı renkle, iki vuruşta kırılır
Aynı bloğa hangi sırayla vurmalıyım?
Her grubun ritmini önce planlamak
Her gruba yeni bloğu tanıtan iki kısa bölümle başlıyorum. Ardından ipuçlarını kaldırıp yapıları büyütüyorum. Grubun finalinde öğrenilen kararları birlikte kullanmak gerekiyor. Öğretim bölümlerinde en fazla üç buton ve üç hamle var. Çelik grubundan dört örnek aşağıda.
Bölüm
Görevi
Oyuncudan beklediğim karar
11 · Tutorial
Çeliğin düşünce kırılmadığını göstermek
Çöküşü izleyip enkazın ortasında sağlam kalan çeliği görmek
12 · Tutorial
Üstüne düşen blokların çeliği ezemediğini göstermek
Ezilmeyen çeliği kendi rengindeki butonla kırmak
13 · Serbest
Aynı kuralı bu kez ipucu olmadan sormak
Çöküşten sonra hangi çeliğin ayakta kalacağını önceden görmek
20 · Final
Grubu en dar çözümle kapatmak: 81 sıradan yalnızca biri kazandırıyor
Yapının destek ilişkilerinden tek doğru sırayı çıkarmak
Zorluk ölçüsünü nasıl kullanıyorum?
İlk baktığım şey, denenen hamle sıralarından kaçının kazandırdığı. Kazandıran yol azaldıkça hata payı daralıyor. Bu sayı çözüm alanını anlatıyor. Bir insanın bölümü ne kadar zor bulacağını tek başına söylemiyor. Tek çözümü açıkça görülen bir bölüm, birkaç yanıltıcı yolu olan bölümden daha rahat okunabilir.
Yanlış seçeneklerin ne kadar cazip göründüğünü de bu puandan anlayamıyorum. Bu yüzden bot sonucuna ve bölümün grup içindeki görevine birlikte bakıyorum. 14. bölüm Pyramid’de bunlar farklı şeyler söyledi ve tasarımı yeniden ele aldım.
Tasarım kuralları ve kontrol aracı
Normal bölümlerde hamle sırasının önemli olmasını, plan yapmanın işe yaramasını ve doğru yolun okunabilmesini istedim. Yazdığım çözücü bütün hamle sıralarını deniyor. Bu hedeflere uymayabilecek bölümleri işaretliyor, sonra tasarımı oyunda inceliyorum. Öğretim bölümlerini bu kurallardan ayrı tutuyorum. Onlarda önce yeni bloğun davranışını göstermek istiyorum.
LevelAnalyzer.cs · tasarım kuralları, kısaltılmış
// Öğretici bölümlerde amaç kuralı göstermek; tasarım kuralları yalnızca normal bölümlere uygulanır.if (r.index < TutorialLevels || r.def.tutorial) return;
if (r.greedy.won) r.warnings.Add("En büyük sayıyı seçen bot kazanıyor");
if (r.myopic.won) r.warnings.Add("Sadece bu turu düşünen bot kazanıyor: uzun vadeli plan gerekmiyor");
if (!r.greedy.won && r.greedy.percent > NearMissPercent && !r.greedy.onlyArmoredLeft)
r.warnings.Add($"En büyük sayıyı seçen bot kıl payı kaybediyor (%{r.greedy.percent}): kayıp haksız hissettirebilir");
// İlk hamleler: kazandıran hamle gözden kaçacak kadar zayıf görünmemeli, ikinci karar da önemli kalmalı.if (bestWinningImmediate < maxImmediate * HiddenMathRatio)
r.warnings.Add($"Kazandıran ilk hamle anlık olarak çok zayıf görünüyor ({bestWinningImmediate} blok, en iyi anlık {maxImmediate}): gizli matematik riski");
if (!standingOk)
r.warnings.Add($"Doğru ilk hamlelerden sonra ayakta kalan yapı %{MinStanding}-{maxStanding} aralığında değil: ikinci karar önemsizleşebilir");
if (winnable == r.firstMoves.Count)
r.warnings.Add("Her ilk hamle kazanılabilir: ilk karar önemsiz");
En büyük sayıya basmak yetmemeli. Hep en büyük sayılı butona basan bir
oyuncu bölümü geçebiliyorsa araç bölümü işaretliyor. Normal bir bölümde bu, hamle sırasının
önemini yitirdiği anlamına geliyor.
Plan yapmak işe yaramalı. Her hamlede o an en çok bloğu yıkan seçeneğe
gitmek bölümü geçirmeye yetiyorsa araç işaretliyor. O zaman ileriyi düşünmeye gerek
kalmıyor.
Kolay yollar kıl payı kaybettirmemeli. En büyük sayıya veya anlık en büyük yıkıma giden yol, yapının %90’ından fazlasını yıkıp kaybediyorsa araç uyarıyor. Böyle bir kayıp tekrar deneme isteği de uyandırabilir, haksızlık da hissettirebilir. Bot verisi bu duyguyu söylemiyor. Uyarıyı tasarımı incelemek için kullanıyorum.
Doğru ilk hamle okunabilmeli. Kazandıran ilk hamle, ilk bakışta en iyi görünen seçeneğin yarısından az blok yıkıyorsa araç uyarıyor. Destek ilişkileri bu seçimi açıklıyor olabilir. Bu yüzden yalnızca sayıya bakıp reddetmiyor, yapıyı oyunda inceliyorum.
İki karar da önemli olmalı. Her ilk hamle kazandırıyorsa ilk karar
önemsizleşiyor. Doğru ilk hamlelerin hiçbiri yapının %30–70’ini ayakta bırakmıyorsa ikinci
karar önemsizleşebiliyor (bukalemunlu bölümlerde üst sınır %90). Araç iki durumu da
işaretliyor.
50 bölümün tamamı bu kontrolden uyarısız geçiyor. Ama çözücü bütün buton sırasını baştan biliyor. Oyuncu ise yalnızca ekrandaki üç butonu görüyor. Balcony’deki bilgi tuzağını çözücü kaçırdı, bot testi ortaya çıkardı.
Yeni bir bloğu öğretmek
Yeni blokları iki kısa bölümle tanıtıyorum. Videodaki 11. bölüm, çeliğin ilk dersi. Bu bölümleri üç kuralla tasarladım:
Her bölümde tek bir şey öğret. Çeliğin iki özelliği var, ikisini
ayrı bölümlere böldüm: 11. bölümde çelik düşünce kırılmıyor, 12. bölümde üstüne
düşen bloklar onu ezemiyor.
Önce göster, sonra denet. Kısa bir ipucu kuralı ve dokunulacak yeri söylüyor. Ardından çöküş, farkı görünür kılıyor. Diğer bloklar parçalanırken çelik enkazın ortasında sağlam kalıyor.
İlk denemeyi sade tut. Öğretim bölümlerinde en fazla üç buton ve üç hamle var. Hemen sonraki bölümde aynı kuralı bu kez ipucu vermeden kullanmanı istiyorum.
Zorluk eğrisi
Sütunlar güncel bölümlerin çözüm alanını gösteriyor. Renkler öğretim, normal ve final bölümlerini ayırıyor. Bot testinden sonra yedi bölümü değiştirdim. 10 Ekim’de kataloğu yeniden kontrol ettim: 50 bölümün de çözümü var. Taranan durumlarda başlangıçta desteksiz blok, sıfır hedefli buton veya aynı blokları hedefleyen iki seçenek bulunmadı. Bunlar kural kontrolleri. Oyuncuların hissettiği zorluk henüz ölçülmedi.
Tutorial bölüm
Normal bölüm
Final
Çok kolayher
sıra kazanırKolay3’te
1Orta9’da
1Zor27’de
1Çok zor81’de
1
Temel1–10
Çelik11–20
Bukalemun21–30
Çapa31–40
Çift renkli41–50
Veriyi tablo olarak göster
Bölüm
Kazandıran sıra
Tüm sıralar
1
3
7
2
4
27
3
1
9
4
1
9
5
2
27
6
3
27
7
3
81
8
2
81
9
2
81
10
2
81
11
1
2
12
1
2
13
3
27
14
2
27
15
3
81
16
4
27
17
5
81
18
2
81
19
9
81
20
1
81
21
2
2
22
2
2
23
5
27
24
2
27
25
3
79
26
4
27
27
4
81
28
4
81
29
7
77
30
1
81
31
1
1
32
2
2
33
4
25
34
2
27
35
3
81
36
4
27
37
4
81
38
2
81
39
3
27
40
1
81
41
2
2
42
6
6
43
4
27
44
3
27
45
3
81
46
5
27
47
3
81
48
2
81
49
7
81
50
2
81
Gruplara iki kolay öğretim bölümüyle başlıyorum. Zorluk dalgalanarak artıyor ve finalde yükseliyor. Aradaki düşüşleri de planladım. Zor bir bölümün ardından nefes alma bölümü geliyor. Yeni gruba geçince de yeni kuralı deneyebilmen için baskıyı düşürüyorum.
Bölüm editörü
50 bölümün tamamını Unity’de geliştirdiğim editörle tasarladım. Yapı, buton sırası, hamle bütçesi ve tasarım notu aynı yerde duruyor. Önce bölümdeki kararı belirliyorum, sonra yapıyı kuruyorum. Kontrolleri çalıştırıp taslağı kaydetmeden oyunda açabiliyorum. Aşağıda bu akışı 20. bölüm Viaduct üzerinden gösteriyorum.
Unity içindeki bölüm editörü, 20. bölüm açık. Solda bölüm listesi, ortada çizim
alanı, sağda canlı kontrol: bu bölümde 81 hamle sırasından yalnızca biri kazandırıyor.
Kur: Yapıyı ızgarada boyuyor, butonları ve hamle sayısını diziyorum.
Kontrol et: Canlı kontrol bütün hamle sıralarını deniyor. Kaçının
kazandırdığını ve hangi tasarım kuralının tutmadığını hemen gösteriyor.
Oyna ve düzelt: Bölümü kaydetmeden oyunda açıp çöküşün nasıl göründüğüne ve
yapının telefonda rahat okunup okunmadığına bakıyorum.
Editörde bir bölümün adımları ve ekran görüntüleri
Bir şekille başlıyorum. Köprü, vinç, saat kulesi… Bölümlerin adı da buradan
geliyor. Şekil kadar önemli olan, oyuncunun orada neye karar vereceği: hangi ayağı önce
kesecek, çatıyı mı indirecek temeli mi?
Yapıyı çiziyorum. Üstteki paletten blok türünü ve rengini seçip ızgarada
sürükleyerek boyuyorum. Sağ tık siliyor, Alt tuşuyla tıkladığım blok fırçam oluyor. Yapı
ızgaraya sığmazsa ızgarayı soldan, sağdan ya da üstten genişletiyorum. Desteği olmayan blok
kırmızı çerçeveyle işaretleniyor. Bölüm açılır açılmaz bir şeyin düşmesini istemiyorum.
Üstte blok türleri ve renkler. Havada kalan iki mavi blok kırmızı çerçeveyle
işaretli.
Butonları diziyorum. Her butonun bir rengi ve bir sayısı var. İlk üçü bölüm
açıldığında ekranda oluyor, diğerleri sırayla geliyor. Yani butonların sırası da bulmacanın
bir parçası. Bir butonun üzerine geldiğimde ilk hamlede hangi bloklara vuracağını ızgarada
görüyorum. Oyuncunun kaç hamle hakkı olacağını da bu aşamada belirliyorum.
Kırmızı 6’nın üzerine gelince ilk hamlede vuracağı altı blok beyaz
çerçeveyle işaretleniyor. Altta butonların sırası.
Canlı kontrole bakıyorum. Sağdaki panel her değişiklikte yenileniyor ve
bana şunları söylüyor: bütün hamle sıralarından kaçı kazandırıyor, en kısa çözüm hangisi,
hep en büyük sayıya basan ya da sadece o hamleyi düşünen bir bot kazanıyor mu, her ilk
hamle yapının ne kadarını ayakta bırakıyor. Tutmayan bir şart varsa hemen altında uyarı
olarak çıkıyor.
Canlı kontrol: 81 sıradan 1’i kazandırıyor, iki bot stratejisi de kaybediyor ve
bütün şartlar geçiyor.
Sayılar tutana kadar değiştiriyorum. İşin en uzun kısmı bu, çünkü tek bir
blok bütün bölümü değiştirebiliyor. Yukarıdaki 20. bölümde 81 hamle sırasından yalnızca biri
kazandırıyor. Ortadaki iki ayaktan sağdakinin en alt bloğu mavi. Onu sarıya çevirdiğimde bu
sayı 7’ye çıkıyor ve hep en büyük sayıya basan bot da kazanmaya başlıyor, yani final için koyduğum planlama hedefi
tutmuyor (resimde). Aynı şeyi soldaki ayağın ortasındaki blokta yaptığımda ise hiçbir sıra
kazandırmıyor. İkisini de oyunu açmadan, bloğu boyadığım anda görüyorum.
Aynı bölüm, tek farkla: ortadaki sağ ayağın en altındaki blok maviden sarıya
döndü. Kazandıran sıra 1’den 7’ye çıktı. Panel neyin bozulduğunu tek tek sayıyor.
Benzer bölümlere bakıyorum. Karar yapısı başka bir bölüme çok benziyorsa editör adını gösteriyor. Bölümlerden birini değiştirebiliyor veya aralarını açabiliyorum. Farklı görünen iki yapının aynı bulmacayı tekrar etmesini istemiyorum.
Oyunda deniyorum. Kural kontrolü tasarım hedeflerimi karşılıyor,
keyifli olup olmadığını söylemiyor. “Oyunda dene” tuşu bölümü doğrudan oyunda açıyor. Çöküş
güzel görünüyor mu, yapı telefon ekranında rahat okunuyor mu, ona bakıyorum.
Solda editördeki çizim, sağda aynı bölüm oyunda.
Sıraya koyuyorum. Bölümü listede yukarı aşağı taşıyıp difficulty curve’deki
yerine oturtuyorum. Listede her bölümün
yanındaki nokta kontrolden geçip geçmediğini gösteriyor. Build alırken bütün bölümler bir
kez daha denetleniyor.
Bölüm listesi. Havada blok bırakılan Viaduct’ın noktası kırmızıya döndü.
Canlı kontrol çözüm olup olmadığını ve seçeneklerin birbirini tekrar edip etmediğini gösteriyor. Bütün buton sırasını biliyor. Oyuncunun görebildiği üç butonla nasıl karar vereceğini ise bu araç tek başına değerlendiremiyor. Bunun için davranış profilli botlara ve oyundaki görsel kontrole bakıyorum.
14. bölüm: sorun, karar, sonuç
Pyramid, çelik grubunda üç hamlelik bir bölüm. 27 sıradan 2’si kazandırıyor: önce kırmızı 9, sonra sarılardan biri, en son mavi 8. Başlangıçta yalnızca üç buton görünüyor. Diğerleri kullanılan butonun yerine geliyor. İlk bot testinde iki veya üç hamle ileriyi hesaplayan profillerin yalnızca %2’si ilk denemede kazanıyordu. Anlık hamleye bakanlarda bu oran %55’ti. Plan yapmayı desteklemek istediğim bölümde sonuç tersine dönmüştü.
Eski düzen
Ekranda932Sırada382
Kırmızı 9’a basıyor. Yerine kırmızı 3 geliyor. Ekranda sarı 3, sarı 2 ve kırmızı
3 var.
Ekrandakilerle hesaplayınca en iyi devam kırmızı 3 görünüyor: ardından sarı 3’le
yapının %84’ü yıkılıyor, sarıyla devam etmek en fazla %61. Kırmızı 3’e basıyor.
Mavi 8 ancak şimdi geliyor. Yapının %97’sini yıkıyor ama bölüm kaybediliyor.
Plan yapan kaybediyor
Yeni düzen
Ekranda932Sırada832
Kırmızı 9’a basıyor. Yerine mavi 8 geliyor. Ekranda sarı 3, sarı 2 ve mavi 8
var.
Ekrandakilerle hesaplayınca sarıdan sonra mavi 8’in yapının tamamını yıktığı
görülüyor. Sarıya basıyor.
Mavi 8 kalan yapıyı indiriyor ve bölüm kazanılıyor.
Plan yapan kazanıyor
Harita iki düzende de aynı. Değişen yalnızca sıradaki iki butonun yeri. Çerçeveli
bloklar çelik. Adımlar, iki üç hamle ileriyi hesaplayan bir botun yolunu gösteriyor.
Sorun: kazanan yolun son parçası ekranda değildi
Eski sırada mavi 8, ikinci hamleden sonra görünüyordu. Ekrandaki butonlarla plan yapan bot, gördüğü en iyi devamı seçip kaybediyordu. Anlık hamleye bakan bot için kırmızı 3 ve sarı 3 eşit görünüyordu. İkisi de yapının %9’unu yıkıyordu. Botların yarısı sarıyı seçiyor, sonra açılan mavi 8’e basıp kazanıyordu. Kazanan yolu bulmalarını planlarından çok bu eşit seçim belirliyordu.
Kazanan devamın ekrandaki bilgiyle görülebilmesini istedim. Plan yapmak işe yaramalı, yalnızca o an en çok bloğu yıkmak yeterli olmamalıydı. Çözüm alanını da korumak istedim: yine 27 sıradan 2’si kazandırmalıydı.
Sıradaki kırmızı 3 ile mavi 8’in yerini değiştirdim. Yapı aynı kaldı. Mavi 8 artık ilk hamleden sonra görünüyor. Sarıdan sonra kullanıldığında bütün yapıyı indireceği hesaplanabiliyor. Hemen mavi 8’e basmak ise kazandırmıyor. Sarıdan önce kullanıldığında yapının %22’si ayakta kalıyor ve son hamle yetmiyor.
Bu değişikliği seçmeden önce iki adayı daha aynı testten geçirip eledim:
Kırmızı kirişin en sağdaki bloğunu sarıya çevirmek. Plan yapan botların ilk denemede kazanma oranı %62’ye çıktı, ama kazandıran sıra 27’de 1’e düştü ve bölüm kâğıt
üzerinde zorlaştı. 14. bölüm bir final değil, bu yüzden eledim.
Sarı 3’ü sarı 1 yapmak. Kazandıran sıra yine 27’de 1’e düştü ve plan yapan
botlar (%16) o anki hamleye bakanlardan (yaklaşık %25) hâlâ daha az kazanıyordu. Sorunu
çözmüyordu.
Sonuç ve öğrendiğim şey
Plan yapan profillerin ilk denemede kazanma oranı %2’den %42’ye çıktı. Kazandıran sıra sayısı 27’de 2 olarak kaldı. Bütün profiller birlikte değerlendirildiğinde oran %22’den %28’e yükseldi. Açılışta hâlâ iyileştirilecek yer var. Bu değişikliği, çözüm alanını daraltmadan plan yapmayı daha iyi desteklediği için seçtim. Testin kapsamını Botlarla A/B karşılaştırmaları kısmında anlatıyorum.
Test ve dengeleme
İki ayrı test kullandım: bölümdeki kararları incelemek için tek tek bölüm testi, simülasyondaki ilerlemenin nerede durduğunu görmek için sırayla oynama testi. Bu kısımdaki sonuçlar, yedi değişiklikten önceki başlangıç ölçümü. Güncel katalog kontrolünü ve önce–sonra karşılaştırmalarını bundan ayrı gösteriyorum.
Bot profilleri ve test yöntemi
Planlama derinliği, hata eğilimi, hafıza ve sabır ayarları farklı 50 bot profili hazırladım. Her bot oyunun kendi kural kodunu kullanıyor. Yalnızca ekranda görünen üç butonu biliyor, sıradakini göremiyor. Profiller aşağıdaki özelliklerde ayrılıyor:
Düşünme derinliği. Bir, iki ya da üç hamle ileriyi hesaplıyor.
Dalgınlık. İki seçenek birbirine yakın göründüğünde ne sıklıkla yanlışını
seçiyor.
Büyük sayı merakı. Üzerinde büyük sayı olan butona basmaya ne kadar
meyilli.
Hafıza. Kaybettiren açılışı bir sonraki denemede ne kadar hatırlıyor,
sıradaki butonları aklında tutup tutmuyor.
Sabır. Aynı bölümde art arda kaç kez kaybedince oyunu bırakıyor.
Her profil oyunu 20 kez oynadı. Testi, rastgele oluşturduğum dört ayrı 50 profillik grupla tekrarladım. Toplam 4.000 koşu var: dört grup × 50 profil × 20 tekrar. Grupları değiştirerek bulguların profil karışımına ne kadar bağlı olduğuna baktım. Davranış ayarlarını ben seçtim. Gerçek oyuncu verisiyle henüz ayarlanmadıkları için bu botları tasarımdaki sorunları aramakta kullanıyorum.
Bu kısımdaki testler ve ölçüler
Bölüm testi
Her bot her bölümü ayrı ayrı oynuyor, geçmek için en fazla 30 deneme hakkı var.
Bölümün tek başına ne kadar zorladığını gösteriyor. Grafikler ve karar tablosundaki
sonuçlar bu testten.
Sırayla oynama testi
Botlar oyunu baştan, bölümleri sırayla oynuyor. Aynı bölümde art arda kaybedip sabrı
biterse oyunu bırakıyor. Botların nerede bıraktığını gösteriyor. SQL ve Excel bu
testin verisini kullanıyor.
Başarı başına deneme
Başarı başına deneme = bölümdeki toplam deneme ÷ bölümü geçen bot sayısı. Geçemeyen veya bırakan botların denemeleri de toplama giriyor. Bu değer, yalnızca geçen botların deneme ortalaması değil.
İlk denemede geçme
Bölüme başlayan botlardan ilk denemesinde geçenlerin oranı.
Drop-off
Bir bölüme ulaşan botlardan oyunu o bölümde bırakanların oranı (sırayla oynama
testinde).
Near miss
Yalnızca 1–2 blok kalarak kaybedilen deneme.
Tek tek bölüm testinde dört grup × 50 profil × 20 tekrar, her düzen için 4.000 koşu oluşturuyor. Sırayla oynama testinde ise 4.000 bot oyuna başlıyor. Sonraki bölümlere daha azı ulaşıyor. Bunlar aynı davranış varsayımlarının tekrarları. 4.000 insan katılımcı yok. Excel özeti ilk sırayla oynama testine ait, sonraki düzenlerin ham kayıtlarını içermiyor.
İlk testte gördüğüm sorunlar
Zorluk puanı ile botların deneme sayısı çoğunlukla aynı yönde değişti. Sıra korelasyonu 0,89, tam örtüşme 1 olurdu. Daha çok şey öğrendiğim örnekler ise bu ilişkiye uymayan bölümlerdi:
Çözüm sayısına göre orta, botta zor. Fountain’da (44) 27 sıradan 2’si kazandırıyor. Aynı çözüm oranına sahip bölümlerde botların başarı başına deneme değeri 3–4 iken Fountain’da 9,5. Kaybettiren iki açılış, kazandıran seçeneğe çok benziyor. Çözüm sayısı bu benzerliği göstermiyor.
Kontrol aracının göremediği tuzak. Balcony’de (5. bölüm) doğru çözüm, henüz
ekranda olmayan bir butona bağlı. Ekrandakine bakarak en iyi hamleyi yapan bot bile ilk
denemede kaybediyor. Botların yalnızca %3’ü ilk denemede geçiyor. Kontrol aracı bütün
butonları baştan bildiği için bunu görmüyordu. Bu, oyunun beşinci bölümünde ilk denemeyi etkileyen bir bilgi tuzağı. Erken
ilerlemede özellikle incelemek istediğim bir nokta.
Plan yapmanın ters teptiği bölüm. Pyramid’de (14) anlık hamleye bakan botların %55’i ilk denemede kazanıyor. İki veya üç hamle ileriyi hesaplayanlarda oran %2. Bölümün plan yapmayı desteklemesini istediğim için buton sırasına yeniden baktım.
Erken bir duvar. Crane (10. bölüm) ilk grubun finali. Sırayla oynama
testinde Crane’e ulaşan botların %46’sı oyunu burada bırakıyor. İlk grubun finali olduğu için bu darboğazı, sonraki
bölümlerden önce ele aldım.
Ortadaki bölüm finalden zor. Ship (28. bölüm), grubunun finalinden bile
fazla deneme istiyor ve grubun temposunu bozuyor.
Takılıp kalınan bölümler. Robot’ta (47. bölüm) botların %10’u, son bölüm
Skyline’da (50. bölüm) üçte biri 30 denemede bile çözemiyor.
İlk düzende 50 bölümün başarı başına deneme grafiği
Her sütun bir bölümü gösteriyor. Yüksekliği, toplam denemenin bölümü geçen bot sayısına bölünmesiyle hesaplanıyor. Grafik değişikliklerden önceki tasarımlara ait.
Diğer bölümler
Sorun çıkan bölüm
Başarı başına deneme
05101520
Temel1–10
Çelik11–20
Bukalemun21–30
Çapa31–40
Çift renkli41–50
Veriyi tablo olarak göster
Bölüm
Başarı başına deneme
İlk denemede geçen
1 · First Smash
1,0
%100
2 · Shell
1,6
%60
3 · Right Support
1,4
%66
4 · Bridge
1,4
%71
5 · Balcony
3,7
%3
6 · Twin Bridge
2,0
%37
7 · Layers
3,3
%42
8 · Castle
3,7
%12
9 · Twin Towers
2,8
%33
10 · Crane
8,3
%10
11 · Steel Roof
1,0
%100
12 · Steel Floor
1,0
%100
13 · Stairs
2,2
%45
14 · Pyramid
3,7
%22
15 · Clock Tower
5,0
%22
16 · I-Beam
2,3
%36
17 · Factory
4,3
%24
18 · Aqueduct
7,7
%9
19 · Gear
2,5
%31
20 · Viaduct
8,2
%8
21 · Color Shift
1,0
%100
22 · Shifting Stilts
1,0
%100
23 · Mushroom
1,8
%46
24 · Hourglass
3,3
%19
25 · Windmill
4,2
%27
26 · Crown
3,4
%55
27 · Turtle
3,1
%20
28 · Ship
11,2
%6
29 · Flower
1,8
%53
30 · Cathedral
9,0
%11
31 · Anchor Beam
1,0
%100
32 · Anchor Shelf
1,0
%100
33 · Balloon
3,1
%21
34 · Floating Islands
3,8
%20
35 · Kite
4,6
%23
36 · Sky Bridge
1,5
%64
37 · Airship
5,2
%19
38 · Cable Car
6,3
%13
39 · Satellite
1,8
%50
40 · Floating Castle
8,1
%16
41 · Two Coats
1,0
%100
42 · Tough Roof
1,0
%100
43 · Totem
1,5
%71
44 · Fountain
9,5
%14
45 · Rocket
8,6
%7
46 · Zigzag
1,6
%61
47 · Robot
8,8
%20
48 · Train
3,5
%24
49 · Lighthouse
3,0
%32
50 · Skyline
20,9
%12
SQL ve Excel
Yedi bölümü değiştirmeden önceki sırayla oynama testinde, 4.000 bot koşusunda toplam 126.873 deneme oynandı. level_start ve level_end kayıtlarını üç tabloya aktarıp SQL’le inceledim. Sorgular SQLite’ta çalışıyor.
players: her satır bir bot. Kaç hamle ileriyi düşündüğü lookahead, kaç bölüm geçtiği, oyunu bitirip bitirmediği ve bıraktıysa hangi bölümde bıraktığı: stopped_at_level.
attempts: her satır bir deneme: bölüm, kaçıncı deneme olduğu, kalan blok sayısı ve kazanıp kazanmadığı. Kazandıysa won 1, kaybettiyse 0.
levels: her bölümün numarası ve adı.
1. Botları en çok hangi bölümde kaybediyoruz?
SQL · bot testi verisi
-- Botları en çok hangi level'da kaybediyoruz?SELECT p.stopped_at_level AS level,
l.name,
COUNT(*) AS bots_quit
FROM players p
JOIN levels l ON l.level = p.stopped_at_level
WHERE p.finished = 0GROUPBY p.stopped_at_level, l.name
ORDERBY bots_quit DESCLIMIT5;
bölüm
name
bots_quit
10
Crane
1149
5
Balcony
559
7
Layers
360
18
Aqueduct
248
8
Castle
239
Sorgu ne yapıyor? Oyunu bitirmeyen botları alıyor ve bıraktıkları bölüme göre gruplayıp her bölümde kaç bot bıraktığını sayıyor. JOIN, bölüm numarasının yanına levels tablosundan adını getiriyor. En büyük beş sayı listeleniyor.
Ne gördüm? En çok bot Crane’de, 10. bölümde bırakıyor: 1.149 bot. Bu, Crane’e ulaşan 2.520 botun %45,6’sı. Crane ilk grubun finali. Bu yüzden ilk incelediğim yer oldu. İkinci sıradaki Balcony’de (5. bölüm) sonradan bir bilgi tuzağı buldum.
2. Kayıplar kıl payı mı?
SQL · bot testi verisi
-- Kaybedilen attempt'lerin ne kadarı kıl payı (1–2 blok kaldı)?SELECT a.level,
l.name,
COUNT(*) AS losses,
ROUND(100.0 * SUM(CASEWHEN a.blocks_left <= 2THEN1ELSE0END) / COUNT(*), 1) AS near_miss_pct
FROM attempts a
JOIN levels l ON l.level = a.level
WHERE a.won = 0GROUPBY a.level, l.name
HAVINGCOUNT(*) >= 100ORDERBY near_miss_pct DESCLIMIT5;
bölüm
name
losses
near_miss_pct
35
Kite
606
95.0
37
Airship
797
86.1
16
I-Beam
1166
80.3
14
Pyramid
3525
72.3
40
Floating Castle
971
66.9
Sorgu ne yapıyor? Yalnızca kaybedilen denemelere bakıyor: won = 0. Her bölümde kaybı sayıyor. CASE WHEN, 1–2 blok kalan kaybı 1, diğerlerini 0 sayıyor. Toplamı kayıp sayısına bölüp yüzdeye çeviriyor. HAVING, 100’den az kaybı olan bölümleri dışarıda bırakıyor, çünkü az veriyle yüzde yanıltıcı olur.
Ne gördüm? Kite’ta kayıpların %95’i, yalnızca 1–2 blok kaldığında oluyor. Bu kadar yaklaşmak yeniden deneme isteği de uyandırabilir, haksızlık da hissettirebilir. Hangisinin yaşandığını bot verisi söylemiyor. Oynayan birini izlemek gerekiyor.
3. Plan yapan bot Pyramid’de kazanabiliyor mu?
SQL · bot testi verisi
-- Pyramid'de (14. level) plan yapan botlar ilk attempt'te kazanıyor mu?SELECT p.lookahead,
COUNT(*) AS bots,
ROUND(100.0 * SUM(a.won) / COUNT(*), 1) AS first_try_win_pct
FROM attempts a
JOIN players p ON p.player_id = a.player_id
WHERE a.level = 14AND a.attempt_no = 1GROUPBY p.lookahead
ORDERBY p.lookahead;
lookahead
bots
first_try_win_pct
1
390
58.7
2
528
2.3
3
437
1.8
Sorgu ne yapıyor? Pyramid’in (14. bölüm) ilk denemelerini alıyor. Botun ne kadar ileriyi düşündüğü players tablosunda olduğu için iki tabloyu JOIN’le birleştiriyor ve sonucu lookahead değerine göre ayırıyor. won 1 ya da 0 olduğu için SUM(won) kazanan sayısını veriyor. Bunu bot sayısına bölüyor.
Ne gördüm? Anlık hamleye bakan botların %58,7’si ilk denemede kazanıyor. İki veya üç hamle ileriyi hesaplayanlarda oran yalnızca %2. Bu ilerleme verisi de Pyramid’de plan yapmanın tersine çalıştığını gösterdi. Buton sırasını bu yüzden değiştirdim.
Excel çalışma kitabı
Veriyi Excel’de de inceledim. Attempts sayfasında her deneme bir satır. Levels sayfası, COUNTIFS ile bu satırlardan bölüm sonuçlarını hesaplıyor. Örneğin bölüm numarası ve ilk deneme koşulunu birlikte sayarak başlayan bot sayısını buluyorum. Segment sayfasındaki sarı hücreye bölüm numarası girince ilk denemede kazanma oranı, botun planlama derinliğine göre yeniden hesaplanıyor.
Excel · Levels sayfasından iki formül
C2 · level’a başlayan bot: o level’da 1. attempt’i olan satırlar
=COUNTIFS(Attempts!C:C, A2, Attempts!D:D, 1)
K2 · near miss: kaybedilip 1–2 blok kalan attempt’lerin kayıplara oranı
=IFERROR(COUNTIFS(Attempts!C:C, A2, Attempts!E:E, 0, Attempts!G:G, "<=2")/J2, 0)
Excel’deki Levels sayfası. Drop-off sütunu renkle işaretli. Crane ve Balcony öne çıkıyor. Görseli büyütmek için üzerine tıklayabilirsin.
Excel çalışmasındaki bölüm özeti
Tablo, yedi değişiklikten önceki sırayla oynama testinin 50 bölümlük özeti. 4.000 başlangıç ve 126.873 deneme var. Bir bölümü tek başına başlatan testten farklı olarak burada yalnızca o bölüme ulaşmış botlar bulunuyor. Bütün satırları görmek için tabloyu kaydırabilirsin.
Bölüm
Ulaşan koşu
4.000 başlangıçtan ulaşma
Ulaşanlarda drop-off
Attempts per success
İlk denemede geçme
Kayıplarda near miss
1 · First Smash
4.000
%100,0
%0,0
1,00
%99,9
%0,0
2 · Shell
4.000
%100,0
%1,9
1,61
%62,0
%0,0
3 · Right Support
3.924
%98,1
%0,2
1,40
%67,0
%31,4
4 · Bridge
3.915
%97,9
%0,2
1,37
%69,0
%0,0
5 · Balcony
3.907
%97,7
%14,3
3,89
%3,5
%43,3
6 · Twin Bridge
3.348
%83,7
%1,5
2,00
%37,7
%0,0
7 · Layers
3.299
%82,5
%10,9
2,65
%44,6
%20,9
8 · Castle
2.939
%73,5
%8,1
3,38
%13,4
%0,0
9 · Twin Towers
2.700
%67,5
%6,7
2,59
%34,7
%0,0
10 · Crane
2.520
%63,0
%45,6
9,25
%8,0
%20,0
11 · Steel Roof
1.371
%34,3
%0,0
1,00
%100,0
%0,0
12 · Steel Floor
1.371
%34,3
%0,0
1,00
%100,0
%0,0
13 · Stairs
1.371
%34,3
%1,2
2,01
%48,6
%18,5
14 · Pyramid
1.355
%33,9
%10,9
3,92
%18,4
%72,3
15 · Clock Tower
1.207
%30,2
%15,7
4,13
%25,4
%38,1
16 · I-Beam
1.018
%25,4
%1,2
2,16
%42,8
%80,3
17 · Factory
1.006
%25,1
%9,2
3,58
%27,5
%10,7
18 · Aqueduct
913
%22,8
%27,2
6,55
%9,1
%45,9
19 · Gear
665
%16,6
%1,2
2,46
%26,9
%51,4
20 · Viaduct
657
%16,4
%21,8
6,47
%7,8
%51,1
21 · Color Shift
514
%12,8
%0,0
1,00
%100,0
%0,0
22 · Shifting Stilts
514
%12,8
%0,0
1,00
%100,0
%0,0
23 · Mushroom
514
%12,8
%0,0
1,62
%51,4
%22,7
24 · Hourglass
514
%12,8
%0,8
2,55
%19,8
%0,0
25 · Windmill
510
%12,8
%4,5
3,07
%37,8
%7,9
26 · Crown
487
%12,2
%2,3
2,05
%73,3
%0,0
27 · Turtle
476
%11,9
%0,6
2,56
%22,9
%8,3
28 · Ship
473
%11,8
%31,1
8,34
%4,7
%13,4
29 · Flower
326
%8,2
%0,3
1,50
%61,7
%0,0
30 · Cathedral
325
%8,1
%20,9
6,22
%14,8
%35,9
31 · Anchor Beam
257
%6,4
%0,0
1,00
%100,0
%0,0
32 · Anchor Shelf
257
%6,4
%0,0
1,00
%100,0
%0,0
33 · Balloon
257
%6,4
%0,0
2,26
%30,0
%61,3
34 · Floating Islands
257
%6,4
%4,7
3,20
%21,0
%10,8
35 · Kite
245
%6,1
%6,5
3,65
%28,6
%95,0
36 · Sky Bridge
229
%5,7
%0,0
1,30
%74,2
%0,0
37 · Airship
229
%5,7
%11,8
4,95
%21,4
%86,1
38 · Cable Car
202
%5,1
%10,4
4,99
%15,3
%34,2
39 · Satellite
181
%4,5
%0,0
1,63
%58,6
%44,7
40 · Floating Castle
181
%4,5
%25,4
8,19
%9,9
%66,9
41 · Two Coats
135
%3,4
%0,0
1,00
%100,0
%0,0
42 · Tough Roof
135
%3,4
%0,0
1,00
%100,0
%0,0
43 · Totem
135
%3,4
%0,0
1,16
%91,1
%0,0
44 · Fountain
135
%3,4
%14,8
4,71
%25,2
%43,3
45 · Rocket
115
%2,9
%7,0
4,75
%3,5
%25,7
46 · Zigzag
107
%2,7
%0,0
1,20
%85,0
%0,0
47 · Robot
107
%2,7
%0,0
2,22
%41,1
%0,0
48 · Train
107
%2,7
%0,9
2,64
%38,3
%19,0
49 · Lighthouse
106
%2,6
%0,9
2,38
%33,0
%15,9
50 · Skyline
105
%2,6
%3,8
4,63
%15,2
%54,2
Ulaşma oranını 4.000 başlangıca göre hesaplıyorum. Bırakma ve ilk denemede kazanma oranlarında ise o bölüme ulaşan botları kullanıyorum. Başarı başına deneme hesabında toplam denemeyi geçen bot sayısına bölüyorum. Geçemeyenlerin denemeleri de bu toplama dahil. Kıl payı kayıp oranı, bir veya iki blok kalan kayıpların bütün kayıplara bölünmesi. Çalışma sayfasındaki “oyuncu” kimliklerinin tamamı bot koşularına ait. Başlangıç ve kazanma sayılarını COUNTIFS ile buluyorum.
Bot verisiyle iyileştirmeler
Bir değişikliği yalnızca deneme sayısını düşürdüğü için seçmedim. Bölümün grup içindeki görevini koruması, çözülebilir kalması ve buton kontrollerinden geçmesi de gerekiyordu. Aşağıdaki yüzdeler önceki bot karşılaştırmalarının yuvarlanmış özetleri. Yeni oyuncu ölçümleri yok.
Yedi bölümde küçük değişiklikler denedim. Bazen bir veya iki bloğun rengini, bazen iki butonun sırasını değiştirdim. Önce kontrol aracını çalıştırdım. Sıfır hedefli veya aynı bloklara vuran butonlar olmamalı, en büyük sayıya basmak tek başına kazandırmamalıydı. Bu kontrolleri geçen taslakları botlarla yeniden ölçtüm. Bölümün rolünü koruyan seçenekler arasından tercih ettiğimi kaydedip nedenini tasarım notuna yazdım.
7 bölümde ne değişti?
Bölüm
Veri ne gösterdi
Karar
Sonuç (botlarla)
5 · Balcony
Botların yalnızca %3’ü ilk denemede geçiyor. Doğru çözüm ekranda olmayan bir
butona bağlı
4. sıradaki iki bloğun rengi yer değiştirdi
Başarı başına deneme 3,7 → 2,9. İlk denemede geçen %3 → %10
10 · Crane
İlk final. Buraya gelen botların %46’sı oyunu bırakıyor
İki butonun yeri değişti, en alttaki bir blok kırmızı oldu
Başarı başına deneme 8,3 → 5,4. İlk denemede geçen %10 → %28
14 · Pyramid
O anki hamleye bakan kazanıyor (%55), plan yapan kaybediyor (%2)
İki butonun yeri değişti
İlk denemede plan yapanların %42’si, o anki hamleye
bakanların %4’ü geçiyor
28 · Ship
Grubun finalinden zor: başarı başına 11,2 deneme
En alttaki bir blok maviye döndü
Başarı başına deneme 11,2 → 3,9
44 · Fountain
Çözüm sayısına göre orta, botta başarı başına 9,5 deneme. Açılışlar yanıltıcı.
Bir blok sarıya döndü
Başarı başına deneme 9,5 → 5,3. İlk denemede geçen %14 → %36
47 · Robot
Botların %10’u 30 denemede bile çözemiyor
İki butonun yeri değişti, en alttaki bir blok maviye döndü
Başarı başına deneme 8,8 → 3,8. 30 denemede çözemeyen %10 → %0,1
50 · Skyline
Son bölüm. Botların üçte biri 30 denemede bile çözemiyor
İki butonun yeri değişti, bir blok sarıya döndü
Başarı başına deneme 20,9 → 7,4. 30 denemede çözemeyen %35 → %7
Pyramid ve Robot’ta kazandıran sıra sayısı değişmedi. Pyramid’de plan yapan botlar daha çok kazanıyor. Robot’ta yanıltıcı açılışı kaldırınca başarı başına deneme değeri yarıdan fazla düştü. İki örnekte de çözüm alanını genişletmeden botların kararlarını değiştirebildim.
Yeniden testten sonra
Crane’e ulaşıp oyunu orada bırakan botlar %45,6’dan %29’a indi.
11. bölüme ulaşan koşular %34’ten %47’ye, son bölüme ulaşanlar %2,6’dan %4,3’e çıktı.
Darboğaz yer değiştirdi: botların en çok bıraktığı bölüm artık Aqueduct (18. bölüm). Buraya
ulaşanların %35,6’sı oyunu bırakıyor.
Balcony’de ilk denemede geçen botlar %3’ten %10’a çıktı. Oyunun beşinci bölümü için hâlâ
düşük.
Crane ve Skyline’da buton sırası ile bir bloğun rengi birlikte değişti. Karşılaştırma yeni tasarımın bütününü ölçüyor. Farkı tek bir değişikliğe bağlayamıyorum. İlerleme oranları da botların sabır ayarından etkileniyor. Gerçek oyuncuların oyuna geri dönme oranını ölçmedim.
Botlarla A/B karşılaştırmaları
Bir butonu daha erken göstermek, çözüm alanını değiştirmeden plan yapmayı destekleyebilir mi? Pyramid’de bu soruya baktım. A eski sıra. B’de sıradaki kırmızı 3 ile mavi 8 yer değiştiriyor. Yapı, üç hamlelik bütçe, başlangıç butonları ve kurallar aynı.
Test kararı
Tanımı
Hipotez
Mavi 8’in ilk hamleden sonra kullanılabilir olması, plan yapan profillerin kazanan devamı okumasını kolaylaştıracak.
Ana ölçü
İki veya üç hamle ileriyi hesaplayan profillerin ilk denemede kazanma oranı. Tek hamleye bakan profilleri ve bütün profil karışımını ayrıca raporluyorum.
Koruduğum tasarım koşulları
27 sıradan 2’si kazandırsın. Hamle sırası önemli kalsın. Bir profilin puanını yükseltmek için çözüm alanını daha da daraltmayayım.
Test kapsamı
Önceki tek tek bölüm karşılaştırması: dört grup × 50 profil × 20 tekrar, düzen başına 4.000 koşu. Bunlar varsayılan profillerin tekrar simülasyonları.
Eski düzen
Yeni düzen
Kazandıran hamle sırası
27’de 2
27’de 2
İlk denemede geçen: plan yapan botlar
%2
%42
İlk denemede geçen: o anki hamleye bakan botlar
%55
%4
İlk denemede geçen: bütün botlar
%22
%28
Başarı başına deneme
3,7
2,8
B’yi seçtim. Plan yapan botların ilk denemede kazanma oranı 40 yüzde puanı arttı. Anlık hamleye bakanlarda %55’ten %4’e indi. Bu bot modelinde plan yapmak daha çok işe yarıyor. Bütün profillerde artış yalnızca 6 puan. Bu yüzden açılışı incelemeye devam edeceğim.
Bu test botlarla yapıldı. İnsan katılımcıları rastgele iki gruba ayırmadım. Yüzdeler önceki testin yuvarlanmış özetleri. 10 Ekim’de iki sırada da 27’de 2 çözüm olduğunu yeniden kontrol ettim. Bu kontrol, davranış yüzdelerini yeniden ölçmüyor. Oyuncuların dönüşümü, istatistiksel anlamlılık veya oyuna geri dönmesi hakkında bu karşılaştırmadan sonuç çıkarmıyorum.
Neden bir hamle daha eklemedim?
Zor bölüme bir hamle eklemeyi de kontrol ettim. Ama fazladan hamle, sıranın sonunda sıfır hedefli veya aynı hedefleri seçen butonlar açabiliyor. Bütçeyi artırmak bu yüzden tek başına geçerli bir çözüm değildi. Düzenlemeleri bölümün içinde yaptım. Remote Config ile değiştirdiğim bütçeleri de deneye almadan önce bu kontrolden geçirmem gerekiyor.
Analitik ve ürün kararları
Analitik olaylarını, oyuncu verisi geldiğinde araştırmak istediğim sorulara göre kurdum. Aşağıda neyi ölçeceğimi ve sonuca göre neyi inceleyeceğimi gösteriyorum. Henüz oyuncu sonuçları yok. Yerel bot dosyaları ile Firebase’e giden oyuncu kayıtlarını ayrı tutuyorum.
Soru
Olaylar ve ölçüm
İnceleyeceğim karar
İlerleme nerede tıkanıyor?
level_start / level_end / level_quit · tekil başlangıç, geçiş, deneme ve çıkış
İlk denemeyi, tekrar oynanan bölümü ve bitmeyen oturumu ayırmak. Düzen değişikliği denemeden önce kararı ve görünür bilgiyi incelemek.
Kayıplar bir–iki blokta mı yoğunlaşıyor?
level_end · blocks_left, moves_used, deneme
Kalan bloğu ve önceki seçimleri incelemek. Near miss, oyuncunun tekrar oynamak mı istediğini yoksa haksızlık mı hissettiğini söylemez.
İlk dokunuşun ve hedef önizlemesinin nasıl okunduğunu birkaç oturumda izleyip daha kısa ipucunu denemek. Eksik bitiş olayı tek başına nedeni açıklamaz.
Çıkışın performansla ilişkisi var mı?
quality_tier, level_quit ve Crashlytics · cihaz ve sürüm bilgisi
Aynı bölümü cihaz gruplarında karşılaştırıp frame time’larını incelemek. Birlikte görünen olayları araştırılacak bir soru olarak ele almak.
Rating prompt hangi anda çıkmalı?
review_prompt · 10. bölüm veya oyun sonundaki tetikleme noktası
Deneme numarası cihazda saklanıyor. Bölüm sonu kaydında sonuç, kullanılan ve kalan hamleler, kalan bloklar ve süre var. Yeniden başlama ile başka bölüme geçişi ayrı çıkış nedenleri olarak tutuyorum. Hiç hamle yapmadan çıkılan bölümü oynanmış bölüm kaybı olarak saymıyorum. Uygulama kapanırsa başlangıcı olan ama bitişi olmayan bir kayıt kalabilir. Bu kayıtları ayrıca incelemek gerekiyor.
Aynı ölçü tanımlarını kullanarak ileride bot ve oyuncu sonuçlarını karşılaştırabilirim. Ancak iki grup eşdeğer değil. İlk ve yedinci gün geri dönüşünü ölçmek için tarihli oyuncu grupları ve yeterli gözlem süresi gerekiyor. Botların sonraki bölüme ulaşması bu soruyu cevaplamıyor.
Ekonomi ve ürün tercihleri
Crumble Crew’de reklam, uygulama içi satın alma, oyun içi para veya can sistemi yok. Bölümü çözüyor, kaybedince yeniden deniyor ve sonraki yapıyı açıyorsun. Her on bölümde yeni bir blok geliyor. Bu akışta ücretli devam seçeneği, bölümün temel zorluğunu değiştirmiyor.
Görünür ödül, yapının çökmesi ve patikada sonraki durağın açılması. Bu akışı tercih ettim. Oyuncuların geri dönüşünü artırdığını veya başka bir gelir modelinin kötü işleyeceğini ölçmedim. Analitik planını ilerleme, öğrenme ve performans üzerine kurdum.
Teknik ayrıntılar
Oyunla kontrol aracının aynı kuralları kullanması
Neyin düşüp kırılacağını ızgara modeli hesaplıyor. Fizik motoru bu sonucu enkazla gösteriyor. Blok yerdeyse, altında sağlam blok varsa veya aynı sırada en fazla iki hücre uzaktaki sağlam komşuya bağlıysa destek alıyor. Desteksiz bağlı bloklar birlikte düşüyor. Bir hücrelik düşüşte sağlam kalıyorlar. İki hücre ve üzeri düşüş normal blokları parçalayabiliyor ve alttakileri ezebiliyor. Yapı durana kadar hesap tekrarlanıyor. Özel blokların kuralları da bu modelin üzerine ekleniyor.
Editör ve kontrol aracı aynı ızgara modelini kullanıyor. Bölümler, sıralı katalogdaki ayrı veri dosyalarında duruyor. Arayüz Toolkit ile yazdığım editörde işlemleri geri alabiliyorum. Sürükleyerek boyadığım alan tek adım sayılıyor. Çizimden kısa bir süre sonra kontrol yeniden çalışıyor. Oyun derlenmeden önce eksik veya çözümsüz bölümler de taranıyor.
Remote Config ve sınırları
Remote Config ile genel olarak 0–2 hamle eklenebiliyor. Bölüm bütçesi ve test grubu değiştirilebiliyor, değerlendirme istemi açılıp kapatılabiliyor. Bütçe tasarlanan değerin altına inmiyor ve beş hamleyi geçmiyor. Öğretim bölümleri kendi bütçelerini koruyor. Eksik ayarda varsayılan değer kullanılıyor. Yeni ayar, sonraki bölüm açılırken uygulanıyor. Bu sınırlar sıfır hedefli butonu tek başına önlemiyor. Her aday bölüm kontrolünden de geçmeli.
Telefon bütçesi içinde çöküş efekti
Blender’da bloğun beş parçaya ayrılan bir kopyasını hazırladım. Enkaz için aynı parçaları bir havuzdan yeniden kullanıyorum. Telefonda aynı anda en fazla 100 parça etkin. Sınır dolunca yeni kırılmalarda toz efekti çıkıyor. Parçalar birbirine çarpmıyor. Böylece efektin maliyetini sınırladım. Bütün cihazlarda ölçülmüş bir FPS sonucu henüz yok.
Ekran sarsıntısı blok kütlesine ve düşme yüksekliğine göre değişiyor. Altı veya daha fazla blok çarptığında 0,05 saniyelik duraklama var. Son çöküş yarım saniye boyunca %35 hızda oynuyor. Android ve iOS’ta titreşim de darbeyi destekliyor. Bu efektlerle hamlenin sonucunu belirginleştirmek istedim.
Test kayıtlarının oyuncu analitiğine karışmaması
Botlar yerelde çalışıyor ve Firebase’e bağlanmıyor. Editör ve ölçüm modlarında analitik gönderimi kapalı. Ölçüm modunda Remote Config ve değerlendirme istemi de uygulanmıyor. Çökme raporlarına bölüm bilgisi ekleniyor. Böylece bot koşuları oyuncu oturumu olarak sayılmıyor.
Arayüz ve görseller
Arayüzü Figma’da, blokları Blender’da tasarladım. Butonlar ve blokların görünüşü, bölüm tasarımını da etkiledi. Oyuncunun ekrandan okuyabildiği bilgiye göre yapıları ve seçenekleri kurdum.
Üç buton, 81 ihtimal
Arayüzü Figma’da 1170 × 2532 boyutunda bir telefon ekranında çizdim. Altta her zaman üç buton var. Her biri ekranın dörtte biri genişliğinde ve başparmakla erişilebilecek alanda. Üzerlerinde yalnızca renk ve büyük bir sayı kullandım.
Üç buton, çözüm alanının boyutunu da belirliyor. Her hamlede üç seçenek var ve kullanılanın yerine sıradaki geliyor. İki hamlede en fazla 9, üç hamlede 27, dört hamlede 81 sıra oluşuyor. Zorluk puanını bu sıralardan kaçının kazandırdığına göre hesaplıyorum.
Butondaki sayı, o anda kaç bloğa vuracağını gösteriyor. Yapı değişince sayı da güncelleniyor. İlk dokunuşta hedefleri ayrıca işaretliyorum. Bu bilgiyi korumak için kontrol aracına iki kural ekledim: sıfır hedefli buton olmamalı ve görünen iki buton aynı blokları hedeflememeli. Editör ikisini de hata olarak gösteriyor. Güncel 50 bölümde bu hatalar bulunmadı.
Ekrandaki parçalar
Figma’da az sayıda parça çizdim ve farklı ekranlarda yeniden kullandım. Hamle butonları, blok renklerinin açık tonlarında. Koyu alt kenarları basılabilir bir kalınlık veriyor. Yeşil ana eylemleri, beyaz ikincil seçenekleri gösteriyor. Sol üstteki turuncu noktalar kalan hamleler. Harcanan hamle boş ve soluk bir daireye dönüyor. Beyaz hap biçimli görseli uzatıp renklendirerek bölüm etiketi, harita patikası ve ipucu balonu yaptım. Kart başlıklarında sarı şerit kullanıyorum.
Kırmızı buton
Mavi buton
Sarı buton
Ana buton
İkincil buton
Menü
Hap
Başlık şeridi
Kart
Kalan hamle
Kullanılan hamle
Tutorial eli
Kırmızı #FF4D3A Blok ve buton
Mavi #2B7CFF Blok ve buton
Sarı #FFC41F Blok ve buton
Yeşil #35A358 Zemin
Çelik #8C949E Çelik blok çerçevesi
Gece mavisi #143A63 Menü arka planı
Yapıyı kullanılabilir ekrana sığdırmak
Kamera yapıyı üst çubukla alttaki butonlar arasına sığdırıyor. Güvenli alanı ve geniş ekran kenar boşluklarını hesaba katıyor. Geniş köprülerle küçük kuleler böylece aynı oyun alanında gösterilebiliyor. Küçük ekranları ve uzun çevirileri yine gerçek cihazda kontrol etmek gerekiyor.
Şekli kuralını anlatan bloklar
Blokları Blender’da modelledim. Oyuncunun görünüşlerinden kurallarına dair bir ipucu almasını istedim. Her özel blokta farklı bir özellik kullandım:
Çelik blok metal bir çerçeveyle sarılı: düşünce kırılmıyor.
Bukalemun bloğun üstünde üç renkli bir çark var: her hamleden sonra son
basılan butonun rengine dönüyor.
Çapa blok çelik bir kelepçeyle tutturulmuş: altı boşalsa da düşmüyor.
Çift renkli blok ortadan ikiye ayrılmış: kırmak için iki vuruş gerekiyor,
her renge bir tane.
Oyun alanında çok az yazı kullandım. Butonlarda yalnızca renk ve sayı var. Dokuz dilde menü ve ipuçları değişiyor, bulmacanın kuralları aynı kalıyor. Yeni blokları iki kısa bölümde tanıtmayı hedefledim. Görsel işaretlerin bu öğretimi ne kadar desteklediğini oyuncu gözleminde kontrol etmek istiyorum.
Bloğun kırılan hali de Blender’da modellendi: blok önceden parçalara bölündü, oyunda kırıldığında
bu parçalar etrafa saçılıyor. Parçaların nasıl savrulduğunu ve telefonu yormamak için nasıl
sınırlandığını yukarıda, Teknik ayrıntılar kısmında anlattım.
Blender’da tek blok ve kırılınca onun yerine geçen parçalı hali.
Uygulama simgesi: 31 deneme
Uygulama simgesi için Blender’da 31 görsel denedim. Önce kırılmayı tek küple anlattım: köşesi kopmuş, çatlamış veya parçalanmış bloklar yaptım. Sonra üç oyun rengini taşıyan bir küp yığınına geçtim. Dizilişleri ve arka plan tonlarını değiştirdim. Seçtiğim görselde üst küp hafifçe kayık duruyor. Yığının çökebilecekmiş gibi görünmesini istedim. Siyah siluette de kontrol ettim. Renk olmadan üç küp hâlâ seçilebiliyor. Yazı logosunda da aynı renk ailesini kullandım.
Bölüm seçimi bir patika: her bölüm bir durak, sıradaki bölüm kilitli duruyor. Bütün
bölümler bittiğinde patikanın sonunda bir “Yakında” kutusu çıkıyor, bitiş ekranı da
“Yeni bölümler çok yakında!” diyor.
Patika, katalogdaki bölüm sayısına göre oluşuyor. Yeni bir grup eklediğimde bölümleri editörden kataloğa koymam yeterli. Bölüm seçimi ekranını yeniden düzenlemem gerekmiyor.
Sıradaki adımlar
Gerçek oyunculara ulaşıp üç butonla nasıl plan yaptıklarını, destek ilişkilerini ve özel blok kurallarını nasıl yorumladıklarını oynanış testlerinde gözlemlemem gerekiyor.