Günlük bulmaca siteleri, dışarıdan bakıldığında basit görünen ancak geliştirme sürecinde son derece ilginç teknik kararlar gerektiren projelerden biri. Wordle’ın milyonlarca dolarlık satış hikayesiyle popülerlik kazanan bu modelde, her oyuncuya aynı günde aynı bulmaca sunuluyor ve geceyarısı otomatik olarak sıfırlanıyor. Peki, bu basit gibi görünen sistemi hayata geçirmek için hangi teknik yöntemler kullanılıyor?
Ben de DailyBrainHub adlı projemde altı farklı oyunu bu modele göre inşa ettim ve karşılaştığım teknik zorluklar tahminimden daha karmaşık çıktı. Bu yazıda, geliştirmem gereken en kritik üç konuyu ve tercihlerimin arkasındaki mantığı paylaşacağım.
Günlük Sıfırlama Problemi: Sunucu mu, Yoksa İstemci Tabanlı Çözüm mü?
Günlük bulmaca sitelerinin temel mekaniği, herkesin aynı günde aynı bulmacayı görmesi gerektiği için aslında oldukça basit bir sistem gibi görünüyor. Ancak bu basitlik, geliştiricilere ilginç tercihler sunuyor:
- Sunucu tarafında üretilen bulmacalar: Backend, her günün bulmacasını belirleyerek API üzerinden sunuyor. Kontrolü elde tutmak kolay olsa da, sunucu maliyetine katlanmak gerekiyor.
- Tarih bazlı deterministik kodlama: Bugünün tarihini bir tohum (seed) olarak kullanarak, her tarih için aynı bulmacanın üretilmesi sağlanıyor. Bu yöntemde sunucuya ihtiyaç duyulmuyor, ancak bulmaca havuzunun yeterince geniş olması gerekiyor.
function getDailyPuzzle(puzzleList) {
const today = new Date();
const seed = today.getFullYear() * 10000 +
(today.getMonth() + 1) * 100 +
today.getDate();
const index = seed % puzzleList.length;
return puzzleList[index];
}Deterministik yöntem, kodun temiz ve basit olması açısından cazip olsa da, bulmaca listesinin yeterince geniş olmaması durumunda oyuncuların yıl içinde aynı bulmacaları tekrar görmeye başlaması riskini taşıyor. Bu nedenle, en az bir yıl boyunca tekrarlanmayacak kadar geniş bir bulmaca havuzu oluşturulması şart.
Hesap Sistemi Olmadan İlerlemeyi Nasıl Kaydedersiniz?
Hesap sistemleri, kullanıcı deneyimini olumsuz etkileyen bir sürtünme unsuru olarak karşımıza çıkıyor. Wordle’ın da hesap gerektirmemesi, bu yaklaşımın ne kadar etkili olduğunu gösteriyor. Peki, ilerlemeyi nasıl kaydediyoruz?
localStorage, hesap sistemi kullanmadan ilerlemeyi kaydetmek için mükemmel bir araç. Her günün tarihini anahtar olarak kullanarak, sadece o günün verilerini saklayabiliyoruz. Böylece, geceyarısı otomatik olarak eski veriler silinmiş oluyor ve yeni güne geçiş gerçekleşiyor.
function saveTodayProgress(gameId, result) {
const today = new Date().toISOString().split('T')[0];
const key = `${gameId}_${today}`;
localStorage.setItem(key, JSON.stringify(result));
}
function getTodayProgress(gameId) {
const today = new Date().toISOString().split('T')[0];
const key = `${gameId}_${today}`;
return JSON.parse(localStorage.getItem(key));
}Bu yöntem, hem veritabanı maliyetinden kurtarıyor hem de kullanıcıların hesap oluşturma zorunluluğunu ortadan kaldırıyor. Teknik detay olarak, tarih bazlı anahtar kullanımı sayesinde eski verilerin otomatik olarak temizlenmesi de sağlanmış oluyor.
Geceyarısı Sıfırlama: Ortada Kalan Oyunculara Ne Olacak?
Geceyarısına denk gelen bir oyunda, oyuncu bulmacayı çözmeye çalışırken sistemin otomatik olarak sıfırlanması, kullanıcı deneyimini olumsuz etkileyebilir. Bu durumda, sayfanın yüklenmesi sırasında ve cevap gönderildiğinde tarih kontrolü yaparak, geceyarısından sonra yeni güne geçildiğini tespit etmek gerekiyor.
function checkDateChange() {
const currentDate = new Date().toISOString().split('T')[0];
const savedDate = localStorage.getItem('lastGameDate');
if (savedDate && savedDate !== currentDate) {
alert('Günün bulmacası yenilendi! Lütfen sayfayı yenileyin.');
localStorage.setItem('lastGameDate', currentDate);
location.reload();
}
}Bu basit kontrol mekanizması, kullanıcıların geceyarısından sonra karşılaşabilecekleri kafa karıştırıcı durumları önlüyor ve sorunsuz bir geçiş sağlıyor.
Backend Gerektirmeden Paylaşılabilir Sonuçlar Oluşturma
Wordle’ın viral başarısının arkasındaki en büyük faktör, kullanıcıların sonuçlarını emoji dizileriyle paylaşabilmesiydi. Bu emoji dizileri, herhangi bir görsel ya da bağlantıya ihtiyaç duymadan, sadece metin olarak paylaşılabiliyor ve merak uyandırıyordu.
function generateShareText(gameId, day, results) {
const emoji = results.map(r => r.correct ? '✅' : '❌').join('');
return `DailyBrainHub ${gameId} - Gün ${day}
${emoji}
}Bu yöntem, kullanıcıların sonuçlarını WhatsApp, Twitter ya da herhangi bir platformda kolayca paylaşmalarını sağlıyor. Elde edilen metin, sadece "bu nedir?" sorusunu uyandırmak için yeterince ilgi çekici olmalı.
Yeniden Başlarken Farklı Bir Yaklaşım Ne Olurdu?
Eğer bugün yeniden başlamam gerekseydi, paylaşım mekanizmasını tüm diğer özelliklerden önce geliştirirdim. Çünkü bir günlük bulmaca sitesinin büyümesi, kullanıcıların sonuçlarını paylaşma isteğine bağlı. Ben oyunları önce, paylaşım düğmesini ise en son ekledim ve bu hata oldu. Paylaşımın kolaylığı ve çekiciliği, kullanıcıların siteye geri dönmesini ve yeni oyuncuları çekmesini sağlıyor. Bu nedenle, geliştirme sürecinde paylaşımın önceliklendirilmesi gerekiyor.
Günlük bulmaca siteleri, teknik olarak basit görünse de, kullanıcı deneyimini optimize etmek ve viral büyümeyi desteklemek için dikkatli planlama gerektiriyor. Doğru teknik yöntemleri seçmek, hem geliştirme sürecini kolaylaştırıyor hem de kullanıcıların sürekli olarak siteye geri dönmesini sağlıyor.
Yapay zeka özeti
Günlük bulmaca siteleri geliştirirken karşılaşılan en iyi teknik yaklaşımlar. localStorage, tarih bazlı kodlama ve paylaşım mekanizması hakkında detaylı rehber.