Teknik Mimari ve Performans Optimizasyonu (Core Web Vitals)
Framework kullanmadığımız için burada aslında avantajlıyız: React/Next.js hydration maliyeti yok. Risk şu — Canvas oyununun kendi JS'i ve asset'leri, sayfanın asıl LCP/CLS bütçesini yiyor. Kural: oyun motoru, sayfa ilk boyandıktan sonra devreye girsin.
Lazy Loading — "Afiş + Oynat" (Facade) Deseni
Canvas'ı ve oyun script'ini sayfa yüklenir yüklenmez başlatmayın. Bunun yerine statik bir önizleme + "Oyna" butonu gösterin; gerçek oyun kodu yalnızca kullanıcı tıkladığında veya IntersectionObserver ile görünüme girdiğinde yüklensin. Bu, YouTube'un lite-embed tekniğinin Canvas karşılığıdır — 2048 sayfamızda bu deseni birebir kullandık.
<div class="game-embed" style="aspect-ratio: 4 / 3;">
<button class="game-play-btn" data-game="2048" aria-label="2048 oyununu başlat">
<img src="/images/2048-poster.webp" alt="2048 oyunu önizleme ekranı"
loading="lazy" width="800" height="600">
<span class="play-icon" aria-hidden="true">▶</span>
</button>
</div>
document.querySelectorAll('.game-play-btn').forEach((btn) => {
btn.addEventListener('click', () => loadGame(btn), { once: true });
});
function loadGame(btn) {
const wrapper = btn.parentElement;
const canvas = document.createElement('canvas');
canvas.width = 800;
canvas.height = 600;
wrapper.replaceChildren(canvas);
const script = document.createElement('script');
script.src = '/games/2048/main.js';
script.defer = true; // parser'ı bloklamaz
document.body.appendChild(script);
}
Sayfada birden çok script varsa: kendi oyun/UI kodunuzu her zaman defer ile, üçüncü parti (reklam, analytics) script'lerini async ile yükleyin. defer DOM sırasını korur, async korumaz — oyun mantığınız DOM'a bağımlıysa mutlaka defer kullanın.
Asset Optimizasyonu
- Sprite'ları tek bir texture atlas (sprite sheet) olarak birleştirin — 20 ayrı PNG isteği yerine 1 istek.
- Görselleri WebP/AVIF olarak sunun, PNG/JPG'yi yalnızca fallback olarak tutun.
- Ses dosyalarını (varsa) kullanıcı etkileşiminden sonra yükleyin — tarayıcılar zaten otomatik sesi engelliyor, önceden yüklemek boşa bant genişliği.
- Oyun script'inizi minify edin; kaynak haritasını (sourcemap) yalnızca geliştirme ortamında tutun.
CLS (Cumulative Layout Shift) Önleme
CLS'nin tek nedeni budur: tarayıcı, içerik gelmeden önce o içeriğin ne kadar yer kaplayacağını bilmiyor. Canvas/görsel için her zaman aspect-ratio + genişlik/yükseklik belirtin — oyun kodu yüklenmeden önce bile alan ayrılmış olur.
.game-embed {
aspect-ratio: 4 / 3;
width: 100%;
max-width: 800px;
background: var(--surface-2); /* canvas gelene kadar iskelet rengi */
border-radius: 12px;
overflow: hidden;
}
.game-embed canvas,
.game-embed img {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
loading="lazy" vermeyin eğer katlanmadan önce (above-the-fold) görünüyorsa — bunun yerine fetchpriority="high" ekleyin ve görseli <link rel="preload" as="image"> ile önceden yükleyin. "lazy" + "LCP elemanı" kombinasyonu LCP'yi doğrudan kötüleştirir.JSON-LD Yapısal Veri (Kopyala-Yapıştır)
Google'ın oyunlara özel bir zengin sonuç türü yoktur, ancak VideoGame + SoftwareApplication tiplerini birlikte kullanmak, arama motorlarına varlık (entity) bağlamı verir ve bazı yazılım/uygulama zengin sonuçlarına uygunluk sağlar.
{
"@context": "https://schema.org",
"@type": ["VideoGame", "SoftwareApplication"],
"name": "2048",
"url": "https://siteniz.com/oyunlar/2048",
"image": "https://siteniz.com/images/2048-kapak.jpg",
"description": "Sayıları birleştirerek 2048 karosuna ulaşmaya çalıştığınız, tarayıcıda ücretsiz oynanan bulmaca oyunu.",
"applicationCategory": "GameApplication",
"operatingSystem": "Any (Web Browser)",
"gamePlatform": "Web Browser",
"genre": "Puzzle",
"playMode": "SinglePlayer",
"inLanguage": "tr",
"isAccessibleForFree": true,
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"author": {
"@type": "Organization",
"name": "Site Adınız"
}
}
aggregateRating alanını yalnızca gerçek kullanıcı puanlarınız varsa ekleyin. Uydurma rating, Google'ın yapısal veri spam politikasını ihlal eder ve manuel işlem riski taşır.Oyun Sayfaları İçin On-Page SEO ve İçerik Şablonu
Sadece bir <canvas> etiketi içeren sayfa, Google için "ince içerik"tir — indekslenir ama sıralanmaz, çünkü metin karşılığı yoktur. Çözüm: oyunun etrafına, arama niyetiyle eşleşen gerçek metin içerik inşa etmek. Aşağıdaki H1–H3 hiyerarşisi her oyun sayfası için tekrar kullanılabilir bir şablondur — 2048 sayfamız tam olarak bunu izliyor.
2048 Oyna — Ücretsiz, İndirmesiz Tarayıcı Bulmacası
2048, sayıları birleştirerek 2048 karosuna ulaşmaya çalıştığınız bağımlılık yapan bir bulmaca oyunudur. Kayıt olmadan, indirmeden, doğrudan tarayıcınızda oynayabilir; mobil veya masaüstünde skorunuzu geliştirmeye çalışabilirsiniz.
2048 Nasıl Oynanır?
Aynı sayıya sahip iki karo yan yana kaydırıldığında birleşir ve değerleri toplanır. Her hamlede yeni bir "2" veya "4" karosu rastgele bir boş hücrede belirir. Amaç, tahtayı doldurmadan 2048 değerine sahip bir karo oluşturmaktır.
Kontroller
| Cihaz | Kontrol | Aksiyon |
|---|---|---|
| Masaüstü | Ok tuşları (↑ ↓ ← →) | Karoları ilgili yöne kaydırır |
| Mobil / Dokunmatik | Kaydırma (swipe) | Karoları ilgili yöne kaydırır |
| Tümü | "Yeniden Başlat" butonu | Tahtayı sıfırlar, skoru kaydeder |
Yüksek Skor İçin Stratejiler
1. Köşe Stratejisi
En büyük karonuzu her zaman sabit bir köşede tutun (örn. sol alt). Bu köşeyi bozacak hamlelerden kaçının — büyük karo köşeden ayrılırsa tahtayı toparlamak zorlaşır.
2. Sıralı (Monotonik) Zincir
Köşeden başlayarak karoları büyükten küçüğe sıralı dizmeye çalışın. Bu düzen, birleşme zincirlerini öngörülebilir kılar ve tahtanın tıkanmasını geciktirir.
3. Erken Birleştirmekten Kaçının
Küçük karoları hemen birleştirmek yerine, 2-3 hamle ileriyi düşünerek büyük bir zincirleme birleşme fırsatı bekleyin.
Sık Sorulan Sorular
2048'i kazanmak mümkün mü? Evet — 2048 karosuna ulaştığınızda oyun "kazandınız" mesajı verir, dilerseniz daha yüksek karolar için devam edebilirsiniz.
En yüksek skorum nasıl kaydediliyor? Skorunuz tarayıcınızda (localStorage) otomatik olarak saklanır, sayfayı kapatıp tekrar açsanız bile kaybolmaz.
Oyun mobilde çalışıyor mu? Evet, dokunmatik kaydırma hareketleriyle tam uyumludur, ek bir uygulama indirmeniz gerekmez.
SSS bölümünü FAQPage şeması ile işaretlemek, arama sonuçlarında açılır soru-cevap zengin sonucu kazandırabilir:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "2048'i kazanmak mümkün mü?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Evet, 2048 karosuna ulaştığınızda oyun kazandınız mesajı verir; dilerseniz daha yüksek karolar için devam edebilirsiniz."
}
},
{
"@type": "Question",
"name": "En yüksek skorum nasıl kaydediliyor?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Skorunuz tarayıcınızda (localStorage) otomatik olarak saklanır ve sayfayı kapatıp tekrar açsanız bile kaybolmaz."
}
}
]
}
Blog ve Oyun Arası İç Linkleme Mimarisi
Site mimarisini bir hub-and-spoke (merkez-uç) yapısı olarak kurun: her oyun kategorisi bir "hub" sayfasıdır; hem tekil oyun sayfalarına hem de o kategoriyle ilgili blog yazılarına bağlanır. Bu yapı hem otorite dağılımını hem de kullanıcı akışını netleştirir. Malt'ta şu an 3 oyun tek bir ana sayfa bölümünde toplanıyor; oyun sayısı arttıkça bu bölümü kategori hub sayfalarına (/oyunlar/bulmaca/, /oyunlar/arcade/ gibi) ayırmayı planlıyoruz.
Blog yazıları ve oyun sayfaları birbirine doğrudan değil, kategori hub'ı üzerinden ve ayrıca en alakalı içerikle doğrudan (ör. 2048 ↔ ilgili blog yazısı) bağlanır — hem crawl derinliği azalır hem dönüşüm artar.
| Kaynak Sayfa | Hedef Sayfa | Anchor Text | Amaç |
|---|---|---|---|
| Blog: "Mola Saatleri İçin 5 Hızlı Oyun" | Oyun: 2048 | "2048'i hemen ücretsiz oyna" | Dönüşüm |
| Blog: "İndirmesiz Basit Oyunlar Rehberi" | Kategori Hub: Bulmaca | "tüm bulmaca oyunlarını keşfedin" | Kategori otoritesi |
| Oyun: 2048 | Blog: "Bulmaca Oyunlarının Zihinsel Faydaları" | "bulmacaların beyne faydaları" | Konu otoritesi + dwell time |
| Oyun: 2048 | Oyun: Sayı Zinciri (benzer) | "benzer bir oyun: Sayı Zinciri'ni dene" | Pogo-sticking önleme |
| Kategori Hub: Bulmaca | Kategori Hub Blog: Bulmaca Rehberleri | "bulmaca oyunları hakkında yazılarımız" | Konu kümesi (topic cluster) bağı |
Hem oyun hem blog sayfalarına BreadcrumbList şeması ekleyin — bu, hiyerarşiyi Google'a açıkça bildirir ve arama sonucunda tam URL yerine kırıntı navigasyonu gösterir:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Anasayfa", "item": "https://siteniz.com/" },
{ "@type": "ListItem", "position": 2, "name": "Bulmaca Oyunları", "item": "https://siteniz.com/oyunlar/bulmaca/" },
{ "@type": "ListItem", "position": 3, "name": "2048", "item": "https://siteniz.com/oyunlar/2048" }
]
}
Kullanıcı Deneyimi (UX) ve SEO Etkileşim Metrikleri
Google sıralama sinyali olarak doğrudan "dwell time" ölçmez, ama pogo-sticking (kullanıcının hemen arama sonucuna dönmesi) dolaylı olarak sıralamayı etkiler. Amaç: kullanıcıyı oyunun bitiminde de sitede tutacak sürtünmesiz mekanizmalar kurmak.
- Skor Kaydetme (localStorage): Kullanıcı en yüksek skorunu geçmeye çalışırken geri gelir — tekrar ziyaret motivasyonu yaratır. 2048, Yılan ve Refleks Testi'nin üçünde de uyguladık.
- Sürtünmesiz "Yeniden Başlat": Oyun bitince sayfa yenilemeden tek tıkla yeniden başlatma; her yeniden yükleme oturum süresini gereksiz kesintiye uğratır.
- Oyun Sonu "Benzer Oyunlar" Kartı: Oyun bittiği an ekranda 2-3 benzer oyun önerisi gösterin — kullanıcı kaybettiğinde Google'a değil bir sonraki oyununuza gitsin.
- Mola Temalı İçerik Köprüsü: Oyun sonu ekranında "5 dakikan bitti mi? Başka rahatlatıcı oyunlarımıza göz at" gibi bir blog CTA'sı — duygusal niyetle (stres, mola) örtüşür.
- Dokunmatik + Klavye Kontrolü: Mobilde kaydırma (swipe), masaüstünde ok tuşları — ilk saniyede sürtünme yaratan her şey terk oranını yükseltir.
function saveHighScore(gameId, score) {
const key = `hs_${gameId}`;
const best = Number(localStorage.getItem(key) || 0);
if (score > best) {
localStorage.setItem(key, String(score));
return { isNewRecord: true, best: score };
}
return { isNewRecord: false, best };
}
// Oyun bitiminde:
const result = saveHighScore('2048', currentScore);
showEndScreen({
score: currentScore,
best: result.best,
isNewRecord: result.isNewRecord,
suggestions: ['sayi-zinciri', 'sudoku-mini'], // benzer oyunlar
});
Arama Niyeti Odaklı Anahtar Kelime ve İçerik Haritası
"Basit web oyunları" gibi geniş kelimelerde büyük sitelerle (Poki, CrazyGames) rekabet imkansız. Bunun yerine niyet bazlı, düşük rekabetli uzun kuyruklu kelimelere odaklanın:
- Bilgilendirici: "2048 nasıl oynanır", "2048 kazanma taktikleri"
- İşlemsel / Navigasyonel: "ücretsiz 2048 oyna online", "indirmeden bulmaca oyunu oyna"
- Duygu/İhtiyaç Odaklı: "stres atmak için oyunlar", "iş molasında oynanacak oyunlar"
- Cihaz/Bağlam Odaklı: "mobilde tek elle oynanan oyunlar", "klavyeyle oynanan bulmaca oyunları"
- Liste/Karşılaştırma: "en iyi ücretsiz tarayıcı oyunları", "2048 alternatifleri"
| Blog Başlığı | Hedef Anahtar Kelime | Arama Niyeti |
|---|---|---|
| Mola Saatleri İçin 5 Hızlı Tarayıcı Oyunu | mola saatinde oynanacak oyunlar | Duygusal / keşif |
| İndirmesiz Basit Oyunlar: 2026'nın En İyi 10 Seçimi | indirmesiz basit oyunlar | Liste / karşılaştırma |
| Stres Atmak İçin En Rahatlatıcı 7 Tarayıcı Oyunu | stres atan oyunlar | Duygusal / problem odaklı |
| 2048 Kazanma Taktikleri: 6 Strateji | 2048 kazanma taktikleri | Derinlemesine bilgi |
| Tek Elle Mobilde Oynanabilecek En İyi Bulmaca Oyunları | tek elle oynanan mobil oyunlar | Cihaz bağlamlı |
| Oyun Kategorisi | Hedef Anahtar Kelime | Arama Niyeti |
|---|---|---|
| Bulmaca Oyunları (2048, sayı oyunları) | online bulmaca oyunları ücretsiz | İşlemsel |
| Refleks / Hız Oyunları | hızlı refleks oyunları tarayıcı | İşlemsel |
| Rahatlatıcı / Ambient Oyunlar | rahatlatıcı basit oyunlar | Duygusal |
| Kart & Masa Oyunları | tarayıcıda kart oyunları oyna | İşlemsel |
| Retro / Klasik Arcade Oyunlar | klasik arcade oyunları online | Nostalji / keşif |
Şu An Oynanabilir Oyunlar
Bu rehberdeki desenlerin (facade lazy-load, H1-H3 içerik şablonu, localStorage skor, JSON-LD) hepsi Malt'ın üç oyununda canlı olarak kullanılıyor: