tetris

Neon Tetris — AI Prompt Studyosu
Prompt Studyosu · 12 Adım

Neon Tetris'i AI ile Üretmek
İçin Prompt Zinciri

Aşağıdaki 12 prompt, sıfırdan tam çalışan bir Neon Tetris üretmek için yapay zekâya (ChatGPT, Claude, Gemini, DeepSeek) adım adım verilecek talimatlardır. Her adım bir öncekinin çıktısı üzerine inşa edilir. Her prompt kartının yanındaki "Prompt Studyosunda Aç" butonu sizi doğrudan /p/yapay-zeka-prompt-studyosu-pro.html sayfasına yönlendirir.

Zero Dependencies Vanilla JS + CSS3 Canvas 2D Web Audio API SRS Rotation 60 FPS RAF

Önerilen Akış

P1 · Rol Tanımı → P2 · İskelet HTML → P3 · Grid Motoru → P4 · SRS Rotasyon → P5 · Scoring → P6 · Ses → P7 · Neon UI → P8 · Mobil → P9 · localStorage → P10 · Optimizasyon → P11 · Debug → P12 · Final

K1 Katman 1 — Temel & İskelet

// Rol tanımı, mimari kararlar, ilk çalışan iskelet

PROMPT 01
Rol & Uzmanlık Tanımı
Rol Tanımı Persona Kısıtlar
Sen Kıdemli Frontend & UI/UX Uzmanı (Vanilla CSS & Modern JavaScript) olarak hareket edeceksin. Bu alandaki en derin teknik bilgiye, analitik düşünme yapısına ve en güncel en iyi pratiklere (best practices) sahipsin. KATI KURALLAR: - Zero Libs: Hiçbir CDN, jQuery, Bootstrap veya dış .js/.css linki KULLANMA. - Self-Contained: Tüm CSS <style> içinde, tüm JS <script> içinde tek dosya. - Modern ES6+ kullan; var yasak, let/const zorunlu. - Her kararının arkasındaki mühendislik gerekçesini kısa yorum satırıyla açıkla. - Kodda placeholder bırakma; eksiksiz üret.
Prompt Studyosunda Aç →
PROMPT 02
Tek Dosya HTML5 İskeleti
HTML5 Semantic Mobile Meta
Blogger yayınında doğrudan çalışacak tek dosya HTML5 iskeleti üret: 1) <!DOCTYPE html>, lang="tr" DEĞİL, lang="en" olsun. 2) Meta: viewport (maximum-scale=1, user-scalable=no, viewport-fit=cover), theme-color="#070a14". 3) Body içinde şu yapı: - <header class="topbar"> → logo, başlık, pause/sound/restart butonları - <main class="stage"> → 3 kolon grid: sol (skor/istatistik), orta (canvas board + overlay), sağ (next/hold preview) - <footer> → kontrol legendı 4) Canvas: id="board", aria-label="Tetris playfield". 5) Overlay: id="overlay", "Start Game" butonlu. 6) <style> bloğu: CSS reset, değişkenler (renk paleti), responsive breakpoint'ler (860px, 640px, 420px). 7) <script> bloğu: IIFE, "use strict". Renk değişkenleri: --bg-0:#070a14; --cyan:#00f0ff; --mag:#ff2bd6; --lime:#b6ff2b; --amber:#ffb02e; --vio:#a06bff; Placeholder YOK. Eksiksiz ve çalışır üret.
Prompt Studyosunda Aç →
PROMPT 03
Grid Motoru & Taş Yapıları
Data Model 7-Bag Collision
Tetris çekirdek veri modelini kur. Aşağıdakileri TAM üret: 1) COLS=10, ROWS=20, HIDDEN_ROWS=2, TOTAL_ROWS=22. 2) PIECES objesi: I, J, L, O, S, T, Z — her biri { color, glow, matrix[][] } içersin. 3) state nesnesi: grid, active, nextType, holdType, canHold, bag, score, high, lines, level, combo, running, paused, over, dropTimer, dropInterval, lockDelay, lockDelayMax, lockResets, particles, shake, flash, clearing, lastTime, softDropping. 4) Fonksiyonlar: - emptyGrid() → TOTAL_ROWS x COLS, hepsi null - newBag() → Fisher-Yates shuffle ile 7 taş - pullFromBag() → bag boşsa newBag(), pop() - makePiece(type) → { type, matrix (kopya), x:0, y:0, rot:0 } - spawnX(piece) → yatay ortalama - collides(piece, dx, dy, matrix?) → boolean (sınır + dolu hücre kontrolü) - rotateMatrix(m, dir) → 90° CW/CCW döndürme Her fonksiyonun üstüne 1 satır JSDoc yorumu ekle. Örnek kullanım: hardDrop içinde while(!collides(p,0,1)) p.y++;
Prompt Studyosunda Aç →

K2 Katman 2 — Mekanik & Oynanış

// SRS, lock delay, scoring, combo, line clear

PROMPT 04
SRS Rotasyon & Wall Kick
SRS Wall Kick Guideline
Super Rotation System (SRS) standartında rotasyon + wall kick uygula. 1) KICKS_JLSTZ ve KICKS_I sabitlerini TAM olarak yaz: - Her biri 8 anahtar içersin: "0>1","1>0","1>2","2>1","2>3","3>2","3>0","0>3" - Her anahtar 5 offset dizisi: [[0,0],[...],[...],[...],[...]] - JLSTZ ve I için FARKLI tablolar (Tetris guideline'a birebir uygun). 2) tryRotate(dir) fonksiyonu: - dir > 0 → CW, dir < 0 → CCW - from = p.rot, to = (p.rot + (dir>0?1:3)) % 4 - rotated = rotateMatrix(p.matrix, dir) - table = p.type === "I" ? KICKS_I : KICKS_JLSTZ - for (const [kx, ky] of kicks): if (!collides(p, kx, -ky, rotated)) { p.matrix = rotated; p.x += kx; p.y -= ky; p.rot = to; if (grounded(p)) resetLockDelay(); return true; } - Hiçbiri geçmezse false döndür. 3) grounded(piece) → collides(piece, 0, 1) 4) resetLockDelay(): - lockResets < 15 ise lockDelay=0, lockResets++ Yorum satırlarında her kick offset'inin ne işe yaradığını belirt (T-spin, L-spin vb.).
Prompt Studyosunda Aç →
PROMPT 05
Lock Delay, Line Clear & Scoring
Scoring Combo Tetris Bonus
Kilitlenme, satır temizleme ve skorlama sistemini TAM kur: 1) lockPiece(): - Aktif taşın matrix'ini grid'e yaz - Audio.lock() çağır - state.canHold = true - Full satırları bul (her hücre doluysa) - full.length > 0 ise: state.clearing = { rows: full, t: 0, duration: 260 } - Değilse: combo = -1, spawnNext() 2) applyLineClear(): - Temizlenen her hücre için spawnParticles(c, r, color) - remaining = grid.filter((_, i) => !rows.includes(i)) - remaining başına boş satır ekle (unshift) → toplam TOTAL_ROWS - base = LINE_SCORES[n]: 1→100, 2→300, 3→500, 4→800 - comboBonus = combo > 0 ? 50 * combo : 0 - state.score += (base * level) + comboBonus - state.lines += n; state.combo++ - newLevel = Math.floor(lines / 10) + 1 → level atlarsa Audio.levelUp() + showToast - n===4 → Audio.tetris() + showToast("TETRIS!", "mag") - n>=2 → showToast(n + "x CLEAR", "mag") - combo>1 → showToast("COMBO x" + combo, "") - flash = n>=4 ? 1.0 : 0.5; shake = n>=4 ? 10 : 5 3) hardDrop(): - while (!collides(p, 0, 1)) { p.y++; d++ } - score += d * HARD_DROP_POINTS (2) - Audio.hardDrop(), shake = min(8, 3 + d*0.25), lockPiece() 4) softDrop(): - collides değilse y++, score += 1 Tüm eşikler Tetris guideline'a uygun olmalı.
Prompt Studyosunda Aç →
PROMPT 06
Web Audio API ile Prosedürel Ses
Web Audio Oscillator Autoplay Policy
Sıfır ses dosyası ile Web Audio API ses motoru kur. 1) IIFE içinde Audio modülü: - ctx = null; master = null; muted = localStorage'dan oku - ensure(): AudioContext lazy init, gain 0.22 ile master'a bağla - resume(): ctx.state === "suspended" ise resume() - tone({ freq, type, dur, gain, slideTo, delay }): * osc = ctx.createOscillator() * g = ctx.createGain() * envelope: 0.0001 → gain (0.008s) → 0.0001 (dur) * slideTo varsa exponentialRampToValueAtTime - chord(freqs, dur, type, gain): freqs.forEach((f,i) => tone({ delay: i*0.035 })) 2) Public API: - move(): 220Hz square, 0.04s - rotate(): 380→520Hz square, 0.05s - lock(): 160→90Hz sawtooth, 0.07s - hold(): 520→700Hz triangle, 0.09s - softDrop(): 300Hz sine, 0.03s - hardDrop(): 140→60Hz sawtooth, 0.12s - lineClear(n): C-E-G-C akoru (523.25, 659.25, 783.99, 1046.50) triangle - tetris(): 5'li akor (yukarıdakiler + 1318.51) sawtooth - levelUp(): 392, 523.25, 659.25, 783.99 square - gameOver(): 330→262→196→131 sawtooth iniş, delay'li - setMuted(v): muted set, localStorage'a yaz, ctx aç - unlock(): ensure() + resume() 3) Autoplay policy: AudioContext sadece ilk kullanıcı etkileşiminde açılır. Start butonu, klavye ilk tuş, canvas ilk dokunuş → Audio.unlock()
Prompt Studyosunda Aç →

K3 Katman 3 — Sunum & Dayanıklılık

// Neon UI, mobil, kalıcılık, optimizasyon, debug

PROMPT 07
Cyberpunk / Neon UI Teması
Neon Glassmorphism Gradient Text
Cyberpunk / Modern Neon UI temasını Canvas + CSS ile uygula. CSS: 1) Body: koyu zemin (#070a14 → #0b1022 radial gradient), grid overlay (mask ile fade). 2) Panel: rgba(18,26,58,0.72) + backdrop-filter: blur(10px) + ince cyan border. 3) Başlık: linear-gradient(90deg, cyan, mag) → background-clip: text. 4) Buton: 1px cyan border, gradient fill, box-shadow neon glow. 5) Kbd tag: cyan border, monospace, glow. 6) Responsive: 860px (tek kolon), 640px (touch controls görünür), 420px (küçük). Canvas: 1) drawCell(ctx, x, y, size, color, glow, alpha): - ctx.shadowColor = glow; ctx.shadowBlur = size * 0.6 - lineer gradient (üst açık → alt koyu) - roundRect (radius = size * 0.16) - inner highlight (beyaz 0.35 opacity) - dış stroke (renk tam) 2) roundRect(ctx, x, y, w, h, r) helper → arcTo ile. 3) shade(hex, amt) → hex'i koyulaştır/aç. 4) drawBoard(): - clearRect → bg #05070f - grid çizgileri (rgba(90,120,255,0.07)) - shake offset (state.shake) → ctx.translate - HIDDEN_ROWS atla, sadece görünen 20 satır - clearing satırlar için alpha = 1 - clearProgress - ghost taş: 0.22 opacity, sadece stroke - aktif taş: tam drawCell - particle: fillRect + shadowBlur - flash: state.flash > 0 ise beyaz overlay Renk paleti: I:#00f0ff J:#2b6bff L:#ffb02e O:#ffe14d S:#b6ff2b T:#a06bff Z:#ff2bd6
Prompt Studyosunda Aç →
PROMPT 08
Mobil Dokunmatik & Girdi Sistemi
Pointer Events DAS/ARR Swipe
Klavye + Pointer + Swipe birleşik girdi sistemi kur. 1) KEY_ACTIONS map: ArrowLeft/KeyA → left; ArrowRight/KeyD → right; ArrowDown/KeyS → softDrop; ArrowUp/KeyW/KeyX → rotateCW; KeyZ → rotateCCW; Space → hardDrop; KeyC/ShiftLeft/ShiftRight → hold; KeyP/Escape → pause; KeyR → restart; KeyM → mute. 2) performAction(action) — TEK dispatcher: - pause/restart/mute özel işlem - running/paused/over kontrolü - clearing aktifse ignore - switch ile move/tryRotate/hardDrop/doHold/softDrop 3) DAS/ARR (horizontal auto-repeat): - DAS = 160ms (ilk tekrar gecikmesi) - ARR = 50ms (sonraki tekrar aralığı) - keydown'da setTimeout(DAS) → setInterval(ARR) - keyup'ta clearTimeout + clearInterval 4) Touch butonlar: .tbtn[data-act] → pointerdown/up - left/right için DAS/ARR - diğerleri tek seferlik 5) Canvas swipe: - touchstart: { x, y, time, moved: false } - touchmove: |dx| > 24 ve |dx|>|dy| → move; dy > 24 → softDrop - touchend: moved=false ve dt<220ms ve |dx|,|dy|<12 → rotateCW - Yukarı swipe (dy < -40) → hardDrop 6) visibilitychange: document.hidden ve running ve !paused → togglePause() e.preventDefault() sadece arrow/space ve touchmove'da.
Prompt Studyosunda Aç →
PROMPT 09
localStorage ile Kalıcılık
localStorage try/catch Versioned Keys
Güvenli localStorage katmanı kur. 1) STORAGE_KEYS: high: "neon_tetris_v1_high" mute: "neon_tetris_v1_mute" 2) safeStorageGet(key, fallback): try { return localStorage.getItem(key) ?? fallback } catch (_) { return fallback } 3) safeStorageSet(key, value): try { localStorage.setItem(key, String(value)) } catch (_) {} 4) state.high başlangıçta: parseInt(safeStorageGet(KEYS.high, "0")) || 0 5) Audio.muted başlangıçta: safeStorageGet(KEYS.mute, "0") === "1" 6) endGame(): - if (score > high) { high = score; safeStorageSet(KEYS.high, high) } - overlay'de final skoru göster 7) toggleMute(): - Audio.setMuted(!Audio.muted) - audio modülü kendi içinde safeStorageSet çağırır - buton aria-pressed ve ikon güncelle Neden try/catch? Private mode ve kurumsal politikalarda SecurityError fırlatır. Versioned key neden? İleride skor formatı değişirse eski veriyi yeni kod bozmasın.
Prompt Studyosunda Aç →
PROMPT 10
60 FPS Optimizasyon & RAF Loop
requestAnimationFrame Fixed Timestep DPR
60 FPS garantili oyun döngüsü ve render optimizasyonu uygula. 1) loop(now): - dt = Math.min(64, now - (state.lastTime || now)) - state.lastTime = now - update(dt) - render() - requestAnimationFrame(loop) 2) update(dt): - shake decay: shake = max(0, shake - dt * 0.02) - flash decay: flash = max(0, flash - dt * 0.004) - particle update: pozisyon += hız * (dt/16), life -= decay * (dt/16) - !running || paused || over → return - clearing aktifse t += dt, süre dolunca applyLineClear() - gravity: interval = softDropping ? min(50, gravityInterval()) : gravityInterval() - dropTimer += dt; dropTimer >= interval → y++ - lock delay: grounded ise lockDelay += dt, max'ta lockPiece() 3) gravityInterval(): - base = 1000; return max(60, base * pow(0.85, level - 1)) 4) resizeBoard(): - dpr = window.devicePixelRatio || 1 - canvas.width = rect.width * dpr - ctx.setTransform(dpr, 0, 0, dpr, 0, 0) - cellSize = boardW / COLS 5) ResizeObserver: board, next, hold canvas'ları izle → otomatik resize 6) Neden 64ms cap? Sekme arka plana atılınca RAF durur; dönünce büyük dt gelir, taş aniden dipte belirir (tunneling). Cap bunu önler. 7) Neden RAF? vsync senkron, arka planda otomatik durur, batarya dostu.
Prompt Studyosunda Aç →
PROMPT 11
Hata Ayıklama & Edge Case Kontrolü
Debug Edge Cases Top-Out
Oyunu üretim öncesi şu edge case'lerle test et ve düzelt: 1) Top-out: spawn anında collides ise endGame() çağrılmalı, sessizce devam etmemeli. 2) Sekme değişimi: visibilitychange → togglePause(), dönüşte lastTime sıfırla. 3) Hızlı rotate spam: 15 lockResets sınırı korunmalı, sonsuz döngü olmamalı. 4) HOLD spam: canHold=false ise doHold() ignore etmeli. 5) Line clear sırasında input: clearing != null ise performAction() return etmeli. 6) Particle overflow: 500+ particle olursa eski olanları sil (array cap). 7) localStorage kapalı: safeStorageGet/Set try/catch ile çökmemeli. 8) AudioContext bloke: ensure() false dönerse sessiz devam etmeli. 9) DPR 3x: 4K ekranda 3x dpr → canvas çok büyür, clamp et (max 2.5). 10) Mobil klavye açılınca: focus kaybı → auto-pause. Her biri için console.warn ile uyarı bırak (production'da silinebilir). Test matrisini bir tablo olarak çıkar: durum → beklenen → gerçek.
Prompt Studyosunda Aç →
PROMPT 12
Final Entegrasyon & Kod İncelemesi
Integration Code Review Production Ready
Tüm parçaları birleştir ve production-ready final sürümü üret. 1) Kontrol Listesi (hepsi ✅ olmalı): - Zero dış bağımlılık (CDN, link, import yok) - Tek dosya HTML5, Blogger uyumlu - Tüm CSS <style>, tüm JS <script> içinde - IIFE + "use strict" - ES6+ (let/const, arrow, template literal) - SRS rotasyon + wall kick TAM - 7-bag randomizer - Lock delay + 15 reset - Ghost piece - Hold mekaniği - Combo & level progression - Web Audio (10 farklı SFX) - localStorage (try/catch, versioned) - RAF + fixed timestep + dt clamp - DPR-aware canvas - ResizeObserver - Pointer + keyboard + swipe - visibilitychange auto-pause - Responsive (860/640/420px) - Overlay (start/pause/game over) - Toast bildirimler 2) Kod incelemesi: - Her fonksiyonun üstüne 1 satır JSDoc - Magic number yok (hepsi sabit) - Sessiz catch yok (en az console.warn) - Global sızıntı yok (IIFE sayesinde) - innerHTML ile dinamik içerik yok (XSS güvenli) - eval / new Function yok 3) Son çıktı: - Tek <!DOCTYPE html> bloğu - Placeholder YOK - "..." YOK - Kodun tamamı çalışır halde 4) Teslim formatı: - Kısa "Teknik Özet" (5 madde) - Tam HTML kodu (tek blok) - "Nasıl Yayınlanır" (Blogger adımları)
Prompt Studyosunda Aç →

ℹ Prompt Zinciri Kullanım Rehberi

Nasıl Kullanılır? Her promptu sırayla yapay zekâya ver. Bir önceki çıktıyı referans olarak ekle ("Önceki kodu koru, sadece şu kısmı ekle/güncelle"). Asla baştan başlatma — bağlam kaybolur.
Hangi AI'lar için uygun? ChatGPT (GPT-4o/5), Claude (Sonnet/Opus), Gemini (Pro/Ultra), DeepSeek (V3/Coder), Grok, Llama 3.1 405B — hepsi bu yapıyı anlar. Uzun kod için Claude veya DeepSeek Coder tercih edilir.
Prompt Studyosu Entegrasyonu: Her prompt kartındaki "Prompt Studyosunda Aç" butonu /p/yapay-zeka-prompt-studyosu-pro.html sayfasına yönlendirir. Orada promptları düzenleyebilir, kaydedebilir, versiyonlayabilirsin. "Promptu Kopyala" butonu ise doğrudan panoya kopyalar.
İleri Seviye İpucu: Prompt 4 (SRS) ve Prompt 5 (Scoring) en kritik adımlardır. Bu ikisini geçtikten sonra oyun "hissedilir" hale gelir. Geri kalan promptlar sunum ve dayanıklılıktır.

Zaman Tahmini

PromptKonuTahmini SüreZorluk
P1-P2Rol + İskelet5 dk⭐
P3Grid motoru10 dk⭐⭐
P4SRS rotasyon15 dk⭐⭐⭐⭐
P5Scoring & line clear12 dk⭐⭐⭐
P6Web Audio10 dk⭐⭐⭐
P7Neon UI15 dk⭐⭐⭐
P8Mobil girdi12 dk⭐⭐⭐
P9localStorage5 dk⭐⭐
P10Optimizasyon8 dk⭐⭐⭐
P11Debug10 dk⭐⭐⭐⭐
P12Final5 dk⭐⭐
TOPLAM~2 saat⭐⭐⭐
NEON TETRIS · AI Prompt Studyosu
12 Prompt · 3 Katman · 1 Tam Oyun
Her prompt bağımsız çalışır, ama sırayla verildiğinde katlanarak güçlenir.
NEON TETRIS — Tasarım Kararları & Sektörel Uygulamalar
Teknik Derin İnceleme

Neon Tetris'in Tasarım Kararları
& Sektörel Uygulama Rehberi

Bu doküman iki katmanlıdır: (1) oyunu neden o şekilde kodladığımı, her kararın arkasındaki mühendislik gerekçesini; (2) bu kodun içindeki desenlerin — canvas render, Web Audio, SRS, RAF loop, state machine, localStorage, pointer events — hangi farklı sektörlerde (e-ticaret, sağlık görüntüleme, fintech, lojistik, eğitim) nasıl davrandığını açıklar.

Zero Dependencies Vanilla JS + CSS3 Web Audio API Canvas 2D 60 FPS RAF SRS Rotation

01 Mimari Temel Kararlar

Neden Tek Dosya (Self-Contained)?

Blogger gibi platformlarda harici .js / .css yüklemek çoğu zaman CSP (Content Security Policy) ve cross-origin kısıtlarına takılır. Tek dosya yaklaşımı:

  • Sıfır ağ gecikmesi: Ek HTTP isteği yok, ilk render daha hızlı.
  • Dağıtım kolaylığı: Kopyala-yapıştır ile her yerde çalışır.
  • Versiyon bütünlüğü: JS ile CSS asla birbiriyle uyumsuz kalmaz.
  • Güvenlik: Harici script enjeksiyon vektörü ortadan kalkar.

Neden Zero-Library?

Kural: Bir kütüphane ancak "yazacağım koddan daha az hata üretiyorsa" değerlidir. Tetris gibi kapalı kapsamlı bir oyunda React/jQuery getirisi sıfır, maliyeti yüksektir: bundle boyutu, breaking change riski, framework öğrenme yükü.
KatmanSeçimGerekçe
RenderCanvas 2DDOM güncellemesi yerine tek paint; 200 hücre aynı anda sorunsuz.
StatePlain ObjectFramework gerekmez; tek state nesnesi tüm oyunu taşır.
LooprequestAnimationFrameTarayıcı vsync ile senkron; arka planda otomatik durur.
SesWeb Audio APIÖrnek dosya yok, osilatörle üretilir → 0 KB ses varlığı.
DepolamalocalStorageSunucu gerekmez, çevrimdışı çalışır, 5 MB yeterli.
GirdiKeyboard + PointerTek aksiyon soyutlaması ile iki farklı kaynağı birleştirir.

Varsayımlar (Assumptions)

  • Modern tarayıcı (Chrome 90+, Safari 14+, Firefox 88+) hedeflenir.
  • Kullanıcı en az bir kez ekrana dokunur/klavye kullanır → AudioContext açılır (autoplay policy).
  • Cihaz dikey veya yatay olabilir; aspect-ratio ile tahta her zaman 1:2 kalır.
  • Retina ekranlar devicePixelRatio ile keskin render alır.

02 Oyun Motoru Prensipleri

2.1 Fixed-Timestep Gravity (Sabit Zaman Adımlı Yerçekimi)

requestAnimationFrame 60 Hz'de çağrılır ama taş düşme hızı zaman bazlıdır. Kare hızı düşse bile oyun aynı hızda akar:

// dt = geçen milisaniye (max 64ms — sekme değişiminde patlamasın)
const dt = Math.min(64, now - state.lastTime);
state.dropTimer += dt;
if (state.dropTimer >= interval) {
  state.dropTimer = 0;
  stepDown();
}
Neden 64 ms cap? Sekme arka plana atıldığında RAF durur; geri dönünce büyük bir dt gelebilir. Cap koymazsan taş aniden dipte belirir (tunneling).

2.2 SRS (Super Rotation System) + Wall Kick

Modern Tetris standardı. Bir taş duvara/dayanağa çarptığında 5 farklı offset denenir; biri boşsa rotasyon başarılı sayılır. J/L/S/T/Z için ayrı, I için ayrı tablo gerekir.

const KICKS_JLSTZ = {
  "0>1": [[0,0],[-1,0],[-1,1],[0,-2],[-1,-2]],
  // ... 8 yön kombinasyonu
};
Sektörel karşılığı: Aynı "wall kick" mantığı CAD modelleme yazılımlarında (Fusion 360, SolidWorks) parça yerleştirme sırasında çarpışma sonrası en yakın geçerli pozisyonu bulmak için kullanılır.

2.3 Lock Delay (Kilit Gecikmesi)

Taş yere değdiğinde anında kilitlenmez; 500 ms bekleme + 15 kez sıfırlama hakkı vardır. Bu, oyuncuya "son anda kaydırma" şansı verir.

Grounded → lockDelay += dt → Başarılı move/rotate? → resetLockDelay() → 500ms doldu? → lockPiece()

2.4 7-Bag Randomizer

Yedi taş karıştırılıp torbaya atılır, hepsi tükenmeden yenisi gelmez. Böylece en kötü senaryo (arka arkaya 13 S/Z) matematiksel olarak imkânsız hale gelir.

2.5 Aksiyon Soyutlaması (Action Abstraction)

Klavye de, ekran tuşu da, swipe da aynı fonksiyonu çağırır:

function performAction(action) {
  switch (action) {
    case "left":       move(-1); break;
    case "rotateCW":   tryRotate(1); break;
    case "hardDrop":   hardDrop(); break;
    // ...
  }
}
Sektörel karşılığı: Bu desen Command Pattern'dir. E-ticarette "sepete ekle" butonu, mobil uygulama jesti, sesli asistan komutu aynı addToCart(productId) fonksiyonuna bağlanır. Aynı ürün farklı kanallardan geldiğinde iş kuralı bir kez yazılır.

03 Görsel Katman & Canvas

3.1 Neden Canvas, DOM Değil?

⚡

Tek Paint

200 hücre için 200 DOM elemanı oluşturmak yerine tek canvas üzerine çizim. Layout/reflow yok.

🎯

Piksel Kontrolü

Neon glow, gradient, ghost outline — CSS'in yapamayacağı efektler doğrudan çizilir.

📱

DPR Uyumu

devicePixelRatio ile ölçekleyerek retina ekranda bulanıklığı sıfırlar.

3.2 Glow Efekti Nasıl Çalışıyor?

ctx.shadowColor = glow;
ctx.shadowBlur  = size * 0.6;   // hücre boyutuna orantılı
ctx.fillStyle   = gradient;
roundRect(ctx, x0, y0, w, h, r);
ctx.fill();
Performans notu: shadowBlur pahalı bir işlemdir. Bu yüzden hücre başına değil, parça grubu başına uygulanır; her karede yeniden hesaplanmaz.

3.3 Ghost Piece (Hayalet Taş)

Aktif taşın düşeceği yeri ghostY() hesaplar; aynı matris alçak opaklıkla alt tarafta çizilir. Bu, oyuncunun hata payını azaltır — kullanılabilirlik kararıdır.

3.4 Particle & Screen Shake

Satır temizlendiğinde her hücreden 6 parçacık fışkırır; shake değeri canvas translate()'ine beslenir. Bunlar juice (oyun hissi) içindir.

04 Ses Mimarisi (Web Audio API)

4.1 Osilatör Tabanlı Ses

Hiçbir .mp3 / .wav yok. Her efekt bir osilatör + gain envelope:

const osc = ctx.createOscillator();
osc.type = "square";
osc.frequency.setValueAtTime(380, t0);
osc.frequency.exponentialRampToValueAtTime(520, t0 + dur);

const g = ctx.createGain();
g.gain.setValueAtTime(0.0001, t0);
g.gain.exponentialRampToValueAtTime(0.20, t0 + 0.008);

4.2 Autoplay Policy Uyumu

Tarayıcılar kullanıcı etkileşimi olmadan sesi bloke eder. Bu yüzden AudioContext lazy initialize edilir — sadece ilk tıklama/dokunuşta açılır.

Sektörel karşılığı: Aynı pattern video konferans uygulamalarında (Zoom Web SDK, Jitsi) mikrofon izni için kullanılır: kullanıcı "Katıl" butonuna basana kadar getUserMedia çağrılmaz.

4.3 Ses Efekti Türleri

OlayDalgaFrekansEtki
Hareketsquare220 HzKısa, klik
Rotasyonsquare (slide)380→520 HzYukarı kayma
Hard Dropsawtooth (slide)140→60 HzAşağı çakılma
Line Cleartriangle chordC-E-GYükselen akor
Tetrissawtooth chordC-E-G-C-EEpik 5'li
Game Oversawtooth iniş330→131 HzDramatik düşüş

05 Girdi Sistemi & Dokunmatik

5.1 DAS / ARR (Delayed Auto Shift / Auto Repeat Rate)

Klavye veya buton basılı tutulduğunda önce DAS (160 ms) beklenir, sonra ARR (50 ms) aralıklarla tekrarlanır. Bu, profesyonel oyunlardaki standarttır.

5.2 Pointer Events (Unified Input)

pointerdown / pointerup hem fare hem dokunmatik hem stylus'u kapsar. touchstart + mousedown ayrı ayrı dinlemeye gerek yok.

5.3 Swipe Algılama

if (Math.abs(dx) > threshold && Math.abs(dx) > Math.abs(dy)) {
  performAction(dx > 0 ? "right" : "left");
} else if (dy > threshold) {
  performAction("softDrop");
}
Sektörel karşılığı: Aynı jest tanıma mantığı e-ticaret mobil uygulamalarında ürün galerisi kaydırma, harita uygulamalarında pinch-zoom, bankacılıkta imza çizimi için kullanılır.

5.4 Passive vs Non-Passive Listeners

Scroll'u bloklamayan olaylar { passive: true } ile dinlenir → tarayıcı scroll thread'ini beklemez, FPS korunur.

06 Durum Yönetimi & Kalıcılık

6.1 Tek State Nesnesi

Tüm oyun state nesnesinde yaşar: grid, aktif taş, skor, seviye, partiküller, animasyon sayaçları. Bu, hata ayıklamayı kolaylaştırır — tek bir yerde bakar her şeyi görürsün.

6.2 Güvenli localStorage

function safeStorageGet(key, fallback) {
  try { return localStorage.getItem(key) ?? fallback; }
  catch (_) { return fallback; }
}
Neden try/catch? Gizli modda (Safari Private, Firefox Private) veya kurumsal politikada localStorage erişimi SecurityError fırlatır. Uygulama çökmemeli, sadece "kayıt yok" gibi davranmalı.

6.3 Versioned Keys

neon_tetris_v1_high gibi versiyonlu anahtarlar, ileride skor tablosu formatı değişirse eski verinin yeni kodu bozmasını engeller.

6.4 visibilitychange ile Auto-Pause

document.addEventListener("visibilitychange", () => {
  if (document.hidden && state.running && !state.paused) {
    togglePause();
  }
});
Sektörel karşılığı: Aynı pattern online sınav uygulamalarında (sekme değiştirince süre dondurma), canlı yayın platformlarında (sekme arka planda video durdurma), oyun uygulamalarında (batarya tasarrufu) kullanılır.

07 E-Ticarette Davranış Modelleri

🛒

E-Ticaret — Tetris Kodundan Öğrenilecek Desenler

Sepet · Fiyatlandırma · Stok · Tavsiye Motoru

7.1 Sepet = Grid (State Machine)

Tetris grid'i 10×20 hücreden oluşur; her hücre null veya { color, glow }. E-ticarette sepet de benzer: her slot boş, ürün, rezerve veya hediye durumundan birinde olur.

TetrisE-TicaretDavranış
grid[r][c] = nullBoş sepet slotuYeni ürün eklenebilir
grid[r][c] = {color}Dolu slot (ürün)Fiyat hesaplanır
clearing (satır animasyonu)Ürün sepete eklenirken skeletonAsync yükleme animasyonu
Satır dolunca silinirSepet ödeme sonrası boşalırTransaction commit
combo sayacıKampanya çarpanı (3 al 2 öde)Fiyat katlanması

7.2 Fiyatlandırma = Scoring Sistemi

Tetris'te score = base × level + comboBonus. E-ticarette: total = sum(itemPrice × qty) − discount + shipping + tax. İkisi de deterministik, test edilebilir, saf fonksiyon olmalıdır.

// Oyun
state.score += (base * level) + comboBonus;

// E-ticaret (aynı iskelet)
order.total = items.reduce(fn) - coupon.value + shipping;

7.3 7-Bag Randomizer = Ürün Öneri Motoru

Tetris'te ardışık aynı taş gelmez. E-ticarette de recommendation engine aynı mantıkla çalışır: kullanıcının son 7 etkileşimine bakıp henüz önerilmemiş kategorilerden ürün seçer → çeşitlilik + tekrar önleme.

7.4 Ghost Piece = "Bunu alırsan ne olur?"

Ghost taş, aktif taşın nereye düşeceğini gösterir. E-ticarette bu:

  • Sepet önizleme: Ürün sepete girince toplam ne olur?
  • Kargo tahmini: Bu ürünü alırsam teslim tarihi ne?
  • Stok rezervasyonu: Şimdi alırsam stok 15 dk tutulur.

7.5 Particle & Toast = Conversion Micro-Feedback

Satır temizlendiğinde partikül patlar, toast çıkar. E-ticarette: "Sepete eklendi ✓" animasyonu, kalp atışı efekti, konfeti. Bunlar dopamin döngüsü yaratır ve satın alma davranışını artırır.

Ölçüm: A/B testlerinde mikro-animasyonlu sepete ekleme butonu %7–12 daha yüksek dönüşüm verir (Baymard Institute verileri).

7.6 localStorage = Sepet Kalıcılığı

Skor localStorage'a yazılır. E-ticarette aynı pattern misafir kullanıcının sepetini tarayıcıda tutar; kullanıcı login olunca sunucuya merge edilir.

08 Sağlık & Röntgen Görüntüleme

🩻

Radyoloji & Tıbbi Görüntüleme — Canvas & State Desenleri

DICOM · Anotasyon · Katman · Geri Alma · Kalite Kontrol

8.1 Canvas Render = DICOM Viewer Temeli

Hastane PACS yazılımları (Orthanc, OHIF Viewer, RadiAnt) tarayıcıda <canvas> kullanır. Bizim grid çizimimiz (cellSize, roundRect, shadowBlur) aynı API ile çalışır.

Tetris KoduRadyoloji KarşılığıNeden Aynı?
resizeBoard() + DPRPencere boyutuna göre DICOM ölçeklemeKeskin görüntü şart
drawCell() gradient + glowWindowing / leveling (pencere ayarı)Kontrast/brightness kontrolü
ghostY()Önceki çekimle overlay (karşılaştırma)Zaman içi değişim takibi
Particle efektiLezyon marker animasyonuDoktor dikkatini çekme
state.flashAnormal bulgu uyarısı (kırmızı flash)Acil müdahale sinyali

8.2 SRS Wall Kick = Anatomik Uyum

Bir taş dönerken çarparsa en yakın geçerli pozisyona kayar. Röntgende bu: otomatik anatomik landmark tespitidir. Yapay zekâ akciğer sınırını bulamazsa 5 farklı hipotez dener, en uygununu seçer.

8.3 Lock Delay = Radyolog Onay Süresi

Tetris'te taş yere değdiğinde 500 ms bekler. Radyolojide de AI bir lezyon tespit ettiğinde anında rapor etmez; radyolog 5–15 saniye içinde onaylar/reddeder. Aynı "buffer" mantığı — hata payı için.

8.4 Web Audio = Alarm & Monitör Sesi

Yoğun bakım monitörleri, MR cihazları belirli frekanslarda bip üretir. Web Audio API ile bu sesler tarayıcıda üretilebilir:

// Kalp monitörü bip'i
tone({ freq: 880, type: "sine", dur: 0.08, gain: 0.3 });
// Kritik alarm (iki tonlu)
tone({ freq: 1200, dur: 0.15 });
tone({ freq: 900,  dur: 0.15, delay: 0.18 });

8.5 visibilitychange = Hasta Mahremiyeti

Sekme arka plana atılınca oyun durur. Radyoloji görüntüleyicide de ekran kilidi aynı pattern ile çalışır: sekme gizlenince hasta bilgisi blur'lanır.

HIPAA / KVKK notu: Bu pattern, tarayıcı sekmesi gizlendiğinde hassas veriyi otomatik maskeleyerek uyumluluk sağlar.

8.6 localStorage = Radyolog Tercihleri

Skor kaydeder gibi, radyolog pencere ayarları (windowing preset), son baktığı hasta ID'si, ekran düzeni localStorage'a yazılır. Sunucu çağrısı gerekmez, anında yüklenir.

8.7 Undo / Redo (Tetris'te Yok Ama Eklenebilir)

SRS rotasyon geçmişi tutulabilir. Röntgende bu: annotasyon geri alma. Her marker bir {x, y, type, timestamp} nesnesidir; stack'e push/pop.

09 Diğer Sektörler

💳

Fintech & Bankacılık

İşlem Onayı · Fraud Detection · Real-time Dashboard
  • Fixed-timestep: Borsa emirleri milisaniye hassasiyetinde işlenir; dt bazlı zamanlama şart.
  • SRS wall kick: Ödeme reddedilirse alternatif rota denenir (3D Secure → SMS → biyometrik).
  • Lock delay: Şüpheli işlem 500 ms–5 sn arası "beklemede" tutulur, müşteri onayı istenir.
  • Particle + toast: Başarılı transfer konfeti animasyonu, güven verir.
  • localStorage: Son işlemler önbelleği, çevrimdışı bakiye gösterimi.
  • visibilitychange: Sekme değişince oturum zaman aşımı sayacı başlar (PCI-DSS gereği).
🚚

Lojistik & Depo Yönetimi

Palet Yerleştirme · Rota Optimizasyonu · Stok Grid'i
  • Grid state: Depo rafları 10×20 değil ama aynı 2D matris mantığı — her hücre dolu/boş/rezerve.
  • Hard drop: Forkliftin en kısa mesafede paleti bırakması = greedy algorithm.
  • Line clear: Sevkiyat tamamlanınca raf boşalır, yer açılır.
  • Combo: Aynı bölgeden 3 sipariş → toplu indirim.
  • Web Audio: Forklift geri vites bip'i, konveyör alarmı.
  • RAF loop: Gerçek zamanlı filo takip haritası, saniyede 60 kez güncellenir.
🎓

Eğitim & Uzaktan Öğrenme

Adaptif Zorluk · İlerleme Kaydı · Gamification
  • Level progression: Tetris'te 10 satırda bir seviye. Eğitimde her 5 derste bir modül.
  • localStorage: Öğrenci ilerlemesi çevrimdışı kaydedilir, bağlantı gelince senkronize edilir.
  • Combo bonus: Ardışık doğru cevaplar → ekstra puan (streak).
  • Toast feedback: "Doğru!", "Tekrar dene" mikro-animasyonları motivasyonu artırır.
  • visibilitychange: Sınav sırasında sekme değişirse uyarı + süre dondurma.
  • Ses efektleri: Doğru cevap akoru (C-E-G), yanlış cevap düşük ton (sawtooth).
🎮

Oyun & Eğlence (Genel)

Bulmaca · Aksiyon · Simülasyon
  • 7-bag: Her bulmaca oyununda rastgelelik + adalet dengesi.
  • Lock delay: Yarış oyunlarında viraj öncesi "son fren" penceresi.
  • Ghost piece: Golf oyunlarında top yörüngesi önizlemesi.
  • Particle + shake: Patlama, çarpışma, kritik vuruş geri bildirimi.
  • Web Audio: Prosedürel müzik (osilatörlerle anlık üretim).
🏭

Endüstriyel Kontrol & IoT

SCADA · Robotik · Gerçek Zamanlı İzleme
  • Canvas render: Sensör verisi grafikleri, fabrika zemin planı üzerinde robot konumları.
  • Fixed-timestep: PLC tarama döngüsü (scan cycle) sabit zamanlıdır.
  • Web Audio: Makine arıza alarmı, üretim hattı bip'i.
  • State machine: Her makine idle/running/fault/maintenance durumlarından birinde.
  • localStorage: Son konfigürasyon yedeği, çevrimdışı log buffer'ı.

10 Kod Parçalarının Genel Kullanım Haritası

Aşağıdaki tablo, Tetris kodundaki her teknik bloğun hangi sektörlerde doğrudan yeniden kullanılabileceğini özetler.

Kod Bloğu Ne Yapar? Kullanılabilecek Sektörler
RAF + dt clamp 60 FPS oyun döngüsü Fintech dashboard, IoT izleme, canlı yayın, simülasyon
SRS wall kick Çarpışma sonrası alternatif pozisyon CAD/CAM, robotik yol planlama, cerrahi navigasyon
7-bag randomizer Adil rastgele sıralama E-ticaret öneri motoru, sınav soru dağıtımı, quiz uygulaması
Lock delay Karar öncesi bekleme Ödeme onayı, AI teşhis onayı, otonom araç fren kararı
Canvas + DPR Keskin piksel render DICOM viewer, harita, veri görselleştirme, grafik editör
Web Audio osilatör Sıfır dosyalı ses Hastane monitörü, fabrika alarmı, e-öğrenme bildirim, oyun
Pointer events Birleşik fare/dokunma Her mobil uygulama, POS terminali, kiosk, imza paneli
localStorage + try/catch Güvenli yerel kayıt Sepet, ilerleme, tercihler, çevrimdışı form, oturum token'ı
visibilitychange Sekme durumu dinleme Video konferans, sınav gözetimi, batarya tasarrufu, PACS
Action abstraction Tek fonksiyon, çok kaynak Çok kanallı e-ticaret, sesli asistan, chat bot, CLI + GUI
Particle & toast Mikro geri bildirim Conversion optimizasyonu, gamification, eğitim, sağlık uyarı
State machine Merkezi durum yönetimi Sipariş akışı, hasta takip, makine durumu, oyun, workflow

Sonuç: Kod Neden Evrensel?

Tetris küçük görünür ama içinde gerçek zamanlı sistemlerin tüm temel problemlerini barındırır:

  • Zaman yönetimi (fixed-timestep, lock delay)
  • Uzaysal çarpışma (grid, wall kick)
  • Kullanıcı girdisi (klavye, pointer, swipe)
  • Durum yönetimi (state machine, persistence)
  • Görsel render (canvas, DPR, glow)
  • Ses (Web Audio, prosedürel)
  • Geri bildirim (particle, toast, shake)
  • Güvenlik & dayanıklılık (try/catch, cap, visibility)

Bu sekiz problem, hangi sektörde olursanız olun yazılımın omurgasıdır. Tetris'i anlamak, bu omurgayı anlamaktır.

NEON TETRIS · Tasarım Kararları & Sektörel Uygulama Rehberi
Vanilla JS · Canvas 2D · Web Audio API · Zero Dependencies
Bu doküman, oyun kodunun her satırının arkasındaki mühendislik gerekçesini ve sektörler arası transfer edilebilirliğini açıklar.