<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-24T18:05:46+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Akış Durumu: Oyunlarda Zorluk ve Eğlence Dengesi Nasıl Kurulur?</title><link href="https://program.sonsuz.us/posts/akis-durumu-oyunlarda-zorluk-ve-eglence-dengesi-nasil-kurulur/" rel="alternate" type="text/html" title="Akış Durumu: Oyunlarda Zorluk ve Eğlence Dengesi Nasıl Kurulur?" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akis-durumu-oyunlarda-zorluk-ve-eglence-dengesi-nasil-kurulur</id><content type="html" xml:base="https://program.sonsuz.us/posts/akis-durumu-oyunlarda-zorluk-ve-eglence-dengesi-nasil-kurulur/"><![CDATA[<p>Bir oyunda “Son bir bölüm daha!” dedirten görünmez kuvvet nedir? Çoğu zaman cevap; parlak ödüller, etkileyici grafikler veya destansı müziklerden önce, oyuncunun becerileriyle karşılaştığı zorluk arasındaki hassas dengedir. Psikolog Mihaly Csikszentmihalyi’nin tanımladığı <strong>akış durumu</strong>, kişinin yaptığı işe tamamen dalması, zaman algısını kaybetmesi ve eylemin kendisinden keyif almasıdır.
``</p>

<h2 id="akış-durumu-nedir">Akış durumu nedir?</h2>

<p>Akış sırasında oyuncunun dikkati tek bir hedefe yönelir. Kontroller düşünülmeden uygulanır, kararlar hızlı alınır ve başarısızlık bile oyunu bırakma isteği yerine yeniden deneme dürtüsü yaratır. Ancak bu deneyim, yalnızca oyunu “eğlenceli” yapmakla oluşmaz. Oyuncuya açık hedefler, hızlı geri bildirim ve becerisine uygun mücadele sunulmalıdır.</p>

<p>Temel ilişki basitçe şöyle modellenebilir:</p>

\[F \approx 1 - \frac{\vert C-S\vert }{\max(C,S)}\]

<p>Burada $F$ akış potansiyelini, $C$ oyunun sunduğu zorluğu, $S$ ise oyuncunun beceri seviyesini temsil eder. $C$ ile $S$ birbirine yaklaştıkça akış ihtimali yükselir. Bu, kesin bir psikoloji yasası değil, tasarım mantığını görünür kılan pratik bir modeldir.</p>

<table>
  <thead>
    <tr>
      <th>Zorluk ve beceri ilişkisi</th>
      <th>Psikolojik sonuç</th>
      <th>Oyuncu davranışı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$C \ll S$</td>
      <td>Sıkılma</td>
      <td>Dikkat dağılır, oyun bırakılır</td>
    </tr>
    <tr>
      <td>$C \approx S$</td>
      <td>Akış</td>
      <td>Odaklanma ve devam etme isteği artar</td>
    </tr>
    <tr>
      <td>$C \gg S$</td>
      <td>Kaygı ve çaresizlik</td>
      <td>Öfkelenme veya vazgeçme görülür</td>
    </tr>
    <tr>
      <td>Zorluk belirsiz</td>
      <td>Kontrol kaybı</td>
      <td>Başarısızlık adaletsiz algılanır</td>
    </tr>
  </tbody>
</table>

<h2 id="zorluk-neden-sürekli-artmamalı">Zorluk neden sürekli artmamalı?</h2>

<p>Oyuncu geliştikçe zorluk da artmalıdır; fakat bu artış dümdüz bir rampa olmamalıdır. Aralıksız yükselen baskı zihinsel yorgunluk yaratır. İyi oyunlar genellikle <strong>gerilim ve rahatlama döngüsü</strong> kurar: zor bir çatışmanın ardından güvenli alan, bulmacanın ardından keşif veya bölüm sonu canavarından sonra ödül ekranı gelir.</p>

<p>Bu yapı egzersize benzer. Kaslar dinlenmeden sürekli çalıştırılırsa performans düşer; oyuncunun dikkat kapasitesi de aynı şekilde molaya ihtiyaç duyar. Dolayısıyla akış, kesintisiz stres değil, kontrollü yoğunluktur.</p>

<h2 id="dinamik-zorluk-ayarlaması">Dinamik zorluk ayarlaması</h2>

<p>Her oyuncunun refleksi, deneyimi ve öğrenme hızı farklıdır. Dinamik zorluk sistemleri performansı gözlemleyerek düşman dayanıklılığı, kaynak miktarı veya ipucu sıklığı gibi değişkenleri ayarlayabilir. Basit bir yaklaşım şöyle yazılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">zorluk_hesapla</span><span class="p">(</span><span class="n">basari_orani</span><span class="p">,</span> <span class="n">mevcut_zorluk</span><span class="p">):</span>
    <span class="n">hedef</span> <span class="o">=</span> <span class="mf">0.70</span>  <span class="c1"># Oyuncunun yaklaşık %70 başarı göstermesi amaçlanıyor
</span>    <span class="n">fark</span> <span class="o">=</span> <span class="n">basari_orani</span> <span class="o">-</span> <span class="n">hedef</span>

    <span class="c1"># Küçük adımlar, değişimin yapay ve cezalandırıcı hissedilmesini önler.
</span>    <span class="n">yeni_zorluk</span> <span class="o">=</span> <span class="n">mevcut_zorluk</span> <span class="o">+</span> <span class="n">fark</span> <span class="o">*</span> <span class="mf">0.15</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="nf">min</span><span class="p">(</span><span class="n">yeni_zorluk</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod, oyuncu hedeflenen başarı oranının üzerindeyse zorluğu biraz artırır; altındaysa azaltır. <code class="language-plaintext highlighter-rouge">min</code> ve <code class="language-plaintext highlighter-rouge">max</code> kullanımı değeri güvenli sınırlar içinde tutar. Yine de sistem gizli çalışırken dikkatli olunmalıdır. Oyuncu, oyun tarafından kasıtlı olarak engellendiğini fark ederse başarı duygusu zedelenebilir.</p>

<h2 id="adalet-öğrenme-ve-geri-bildirim">Adalet, öğrenme ve geri bildirim</h2>

<p>Zor bir oyun mutlaka bunaltıcı değildir. Oyuncu neden kaybettiğini anlayabiliyor ve bir sonraki denemede farklı davranabiliyorsa başarısızlık, öğrenme aracına dönüşür. Tehlikeden önce verilen ses, düşmanın okunabilir animasyonu veya doğru anda gösterilen kısa ipucu, adalet algısını güçlendirir.</p>

<table>
  <thead>
    <tr>
      <th>Adil zorluk</th>
      <th>Yapay zorluk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hata oyuncuya açıklanabilir</td>
      <td>Sonuç rastgele görünür</td>
    </tr>
    <tr>
      <td>Kurallar tutarlıdır</td>
      <td>Kurallar habersiz değişir</td>
    </tr>
    <tr>
      <td>Denemeler ilerleme sağlar</td>
      <td>Oyuncu aynı hataya zorlanır</td>
    </tr>
    <tr>
      <td>Başarı beceriyle ilişkilidir</td>
      <td>Başarı şansa bağımlıdır</td>
    </tr>
  </tbody>
</table>

<p>Sonuç olarak iyi zorluk tasarımı, oyuncuyu sürekli yenmek değil, onu gelişebileceğine ikna etmektir. Akışın sihri tam burada ortaya çıkar: Oyun ne çocuk oyuncağıdır ne de klavyeyi pencereden attıracak kadar acımasızdır. Her yeni engel, oyuncuya sessizce “Bunu henüz yapamıyorsun, ama birazdan yapabilirsin” der.</p>

<p><img src="/img/akis-durumu-oyunlarda-83.svg" alt="akis-durumu-oyunlarda-83" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun tasarımı" /><category term="akış durumu" /><category term="oyun psikolojisi" /><category term="zorluk dengesi" /><category term="game design" /><category term="oyuncu deneyimi" /><summary type="html"><![CDATA[Bir oyunda “Son bir bölüm daha!” dedirten görünmez kuvvet nedir? Çoğu zaman cevap; parlak ödüller, etkileyici grafikler veya destansı müziklerden önce, oyuncunun becerileriyle karşılaştığı zorluk arasındaki hassas dengedir. Psikolog Mihaly Csikszentmihalyi’nin tanımladığı akış durumu, kişinin yaptığı işe tamamen dalması, zaman algısını kaybetmesi ve eylemin kendisinden keyif almasıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akis-durumu-oyunlarda-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akis-durumu-oyunlarda-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Anonim Arenanın Karanlık Yüzü: Multiplayer Oyunlarda Toksisite ve Sosyal Mühendislik</title><link href="https://program.sonsuz.us/posts/anonim-arenanin-karanlik-yuzu-multiplayer-oyunlarda-toksisite-ve-sosyal-muhendislik/" rel="alternate" type="text/html" title="Anonim Arenanın Karanlık Yüzü: Multiplayer Oyunlarda Toksisite ve Sosyal Mühendislik" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/anonim-arenanin-karanlik-yuzu-multiplayer-oyunlarda-toksisite-ve-sosyal-muhendislik</id><content type="html" xml:base="https://program.sonsuz.us/posts/anonim-arenanin-karanlik-yuzu-multiplayer-oyunlarda-toksisite-ve-sosyal-muhendislik/"><![CDATA[<p><img src="/img/anonim-arenanin-karanlik-33.svg" alt="anonim-arenanin-karanlik-33" /></p>

<p>Bir multiplayer maçına giriyorsunuz: Takım arkadaşınız yanlış koridora gidiyor, biri mikrofonu sonuna kadar açıyor ve henüz ikinci dakika dolmadan sohbet kutusunda küçük çaplı bir iç savaş başlıyor. Bu davranışlar yalnızca “kötü oyunculuk kültürü” değildir. Anonimlik, rekabet, grup kimliği ve sosyal mühendislik aynı dijital arenada buluştuğunda insanların yüz yüze ortamda sergilemeyeceği davranışlar ortaya çıkabilir.
``</p>
<h2 id="anonimlik-neden-freni-gevşetir">Anonimlik neden freni gevşetir?</h2>

<p>Sosyal psikolojide <strong>çevrimiçi disinhibisyon etkisi</strong>, kişinin dijital ortamda daha dürtüsel davranmasını açıklar. Oyuncu gerçek adını, yüzünü ve sosyal çevresini göstermediğinde davranışlarının kişisel itibarına zarar verme ihtimali azalır. “Ben” yerine geçici bir kullanıcı adı öne çıkar.</p>

<p>Bu durumu basitleştirilmiş bir davranış modeliyle gösterebiliriz:</p>

\[T = \frac{A \times R \times G}{H + C}\]

<p>Burada $T$ toksik davranış olasılığını, $A$ anonimlik düzeyini, $R$ rekabet baskısını, $G$ grup kutuplaşmasını, $H$ hesap verebilirliği ve $C$ davranışın algılanan maliyetini temsil eder. Bu bilimsel bir teşhis formülü değil, ilişkileri anlamayı kolaylaştıran kavramsal bir modeldir. Anonimlik ve rekabet yükselirken yaptırım ihtimali düşerse toksisite için elverişli bir ortam oluşur.</p>

<table>
  <thead>
    <tr>
      <th>Etken</th>
      <th>Yüz yüze ortam</th>
      <th>Anonim oyun ortamı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kimlik</td>
      <td>Genellikle görünür</td>
      <td>Takma adla gizlenebilir</td>
    </tr>
    <tr>
      <td>Sosyal bedel</td>
      <td>Hızlı ve doğrudan</td>
      <td>Gecikmeli veya belirsiz</td>
    </tr>
    <tr>
      <td>Empati</td>
      <td>Ses, mimik ve beden dili güçlü</td>
      <td>İpuçları sınırlı</td>
    </tr>
    <tr>
      <td>Rekabet</td>
      <td>Sosyal kurallarla dengelenir</td>
      <td>Sıralama ve ödüllerle büyütülebilir</td>
    </tr>
    <tr>
      <td>Sorumluluk</td>
      <td>Bireye kolayca atanır</td>
      <td>Takıma veya sisteme yüklenebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="rekabet-grup-kimliği-ve-günah-keçileri">Rekabet, grup kimliği ve günah keçileri</h2>

<p>Dereceli maçlarda puan kaybetmek, yalnızca sanal bir sayı kaybı gibi görünmeyebilir. Oyuncunun beceri algısı ve grup içindeki statüsü de tehdit edilir. İnsanlar böyle anlarda başarısızlığı kendi kararları yerine takım arkadaşlarına bağlamaya eğilimlidir. Bu, <strong>kendine hizmet eden yanlılık</strong> olarak bilinir.</p>

<p>Takımlar ayrıca hızlı biçimde “biz” ve “onlar” ayrımı üretir. Rakip insan olmaktan çıkıp engel gibi algılandığında empati azalabilir. Takım içinde çoğunluğun bir oyuncuyu suçlaması ise sorumluluğun dağılmasına yol açar: Herkes hakarete katıldığı için kimse kendisini asıl fail olarak görmez.</p>

<h2 id="sosyal-mühendislik-oyuna-nasıl-sızar">Sosyal mühendislik oyuna nasıl sızar?</h2>

<p>Sosyal mühendislik, teknik açık yerine güven, korku, merak veya otorite algısını hedefler. Saldırgan; takım arkadaşı, turnuva yöneticisi ya da destek görevlisi gibi davranarak bağlantıya tıklatmaya, hesap bilgisini almaya veya oyuncuyu başka platforma taşımaya çalışabilir. “Hemen doğrulamazsan hesabın kapanacak” mesajı, zaman baskısıyla eleştirel düşünmeyi devre dışı bırakmayı amaçlar.</p>

<p>Toksik atmosfer saldırgana avantaj sağlar. Öfkeli veya panik hâlindeki oyuncu, normalde sorgulayacağı bir isteğe daha hızlı tepki verebilir. Bu nedenle güvenliğin ilk kuralı basittir: Şifre, doğrulama kodu ve kurtarma anahtarı sohbet üzerinden paylaşılmaz.</p>

<h2 id="yazılımla-erken-uyarı-mümkün-mü">Yazılımla erken uyarı mümkün mü?</h2>

<p>Moderasyon sistemleri mesajları yalnızca yasaklı kelimelerle değil; tekrar, tehdit, büyük harf kullanımı ve rapor geçmişi gibi sinyallerle değerlendirebilir. Aşağıdaki örnek, açıklanabilir basit bir risk puanı üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">risk_puani</span><span class="p">(</span><span class="n">mesaj</span><span class="p">,</span> <span class="n">tekrar</span><span class="p">,</span> <span class="n">gecmis_rapor</span><span class="p">):</span>
    <span class="n">tehditler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">hesabını kapatırım</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">adresini bulurum</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">puan</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">ifade</span> <span class="ow">in</span> <span class="n">mesaj</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">ifade</span> <span class="ow">in</span> <span class="n">tehditler</span><span class="p">)</span> <span class="o">*</span> <span class="mi">3</span>
    <span class="n">puan</span> <span class="o">+=</span> <span class="nf">min</span><span class="p">(</span><span class="n">tekrar</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
    <span class="n">puan</span> <span class="o">+=</span> <span class="nf">min</span><span class="p">(</span><span class="n">gecmis_rapor</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span>
    <span class="n">puan</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">mesaj</span><span class="p">.</span><span class="nf">isupper</span><span class="p">()</span> <span class="ow">and</span> <span class="nf">len</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">12</span> <span class="k">else</span> <span class="mi">0</span>
    <span class="k">return</span> <span class="n">puan</span>
</code></pre></div></div>

<p>Bu kod otomatik ceza vermek yerine inceleme sırası oluşturabilir. Dil, mizah ve bağlam değiştiği için insan denetimi gereklidir; aksi hâlde yanlış pozitifler ve kültürel önyargılar oluşabilir.</p>

<h2 id="daha-sağlıklı-bir-arena">Daha sağlıklı bir arena</h2>

<p>Etkili çözüm yalnızca oyuncuları susturmak değildir. Hızlı raporlama, davranış geri bildirimi, kademeli yaptırım, pozitif takım ödülleri ve iki faktörlü kimlik doğrulama birlikte kullanılmalıdır. Oyuncular da öfkeliyken yanıt vermemeli, şüpheli bağlantıları açmamalı ve saldırganı engelleyip kanıtları platforma iletmelidir. İyi tasarlanmış sistemler insan doğasını değiştirmez; fakat kötü davranışın ödülünü azaltıp iş birliğini daha görünür ve değerli hâle getirebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sosyal mühendislik" /><category term="oyun güvenliği" /><category term="toksisite" /><category term="siber psikoloji" /><category term="multiplayer" /><category term="moderasyon" /><summary type="html"><![CDATA[Bir multiplayer maçına giriyorsunuz: Takım arkadaşınız yanlış koridora gidiyor, biri mikrofonu sonuna kadar açıyor ve henüz ikinci dakika dolmadan sohbet kutusunda küçük çaplı bir iç savaş başlıyor. Bu davranışlar yalnızca “kötü oyunculuk kültürü” değildir. Anonimlik, rekabet, grup kimliği ve sosyal mühendislik aynı dijital arenada buluştuğunda insanların yüz yüze ortamda sergilemeyeceği davranışlar ortaya çıkabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/anonim-arenanin-karanlik-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/anonim-arenanin-karanlik-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Generic Programming: Fonksiyon ve Sınıf Şablonlarının Tasarım Sınırları</title><link href="https://program.sonsuz.us/posts/c-generic-programming-fonksiyon-ve-sinif-sablonlarinin-tasarim-sinirlari/" rel="alternate" type="text/html" title="C++ Generic Programming: Fonksiyon ve Sınıf Şablonlarının Tasarım Sınırları" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-generic-programming-fonksiyon-ve-sinif-sablonlarinin-tasarim-sinirlari</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-generic-programming-fonksiyon-ve-sinif-sablonlarinin-tasarim-sinirlari/"><![CDATA[<p>C++ şablonları, aynı algoritmayı veya veri yapısını farklı türlerle çalıştırmanın güçlü bir yoludur. Ancak fonksiyon şablonları ile sınıf şablonları aynı sözdizimsel aileden gelseler de tür çıkarımı, özelleştirme ve hata yönetimi bakımından farklı tasarım kısıtlarına sahiptir. Kısacası biri çoğunlukla “Bu işlemi hangi türlerle yapabilirim?”, diğeri ise “Bu tür ailesinin durumunu ve davranışını nasıl modellemeliyim?” sorusuna odaklanır.</p>

<p>``</p>

<h2 id="ortak-teorik-temel">Ortak teorik temel</h2>

<p>Bir şablonu, türleri parametre olarak alan bir üretim kuralı gibi düşünebiliriz. $T$ bir tür ve $G$ bir şablon olsun. Derleyici uygun kullanım gördüğünde somut bir örnek üretir:</p>

\[G(T) \rightarrow G_T\]

<p>Bu süreç <strong>örnekleme</strong> olarak adlandırılır. Fakat bir şablonun gerçekten kullanılabilir olması için gövdesindeki işlemlerin seçilen tür üzerinde geçerli olması gerekir. Örneğin <code class="language-plaintext highlighter-rouge">a + b</code> ifadesi kullanılıyorsa $T$ türü toplama işlemini desteklemelidir. Modern C++’ta bu gereksinimler <code class="language-plaintext highlighter-rouge">concept</code> ile açıkça belirtilebilir.</p>

<table>
  <thead>
    <tr>
      <th>Tasarım özelliği</th>
      <th>Fonksiyon şablonu</th>
      <th>Sınıf şablonu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tür çıkarımı</td>
      <td>Genellikle argümanlardan otomatik</td>
      <td>C++17 CTAD dışında çoğunlukla açık</td>
    </tr>
    <tr>
      <td>Kısmi özelleştirme</td>
      <td>Desteklenmez</td>
      <td>Desteklenir</td>
    </tr>
    <tr>
      <td>Aşırı yükleme</td>
      <td>Doğal ve yaygın</td>
      <td>Üye fonksiyonlar üzerinden</td>
    </tr>
    <tr>
      <td>Durum saklama</td>
      <td>Genellikle yok</td>
      <td>Temel amaçlardan biri</td>
    </tr>
    <tr>
      <td>Arayüz kısıtları</td>
      <td>Çağrı anında belirginleşir</td>
      <td>Sınıf örneği ve üyeler düzeyinde görülür</td>
    </tr>
  </tbody>
</table>

<h2 id="fonksiyon-şablonlarının-temel-kısıtları">Fonksiyon şablonlarının temel kısıtları</h2>

<p>Fonksiyon şablonlarının en büyük avantajı, tür çıkarımıdır. Derleyici parametrelerden <code class="language-plaintext highlighter-rouge">T</code> türünü bulabilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;concepts&gt;</span><span class="cp">
</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">requires</span> <span class="n">std</span><span class="o">::</span><span class="n">totally_ordered</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span>
<span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">buyuk</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span> <span class="o">?</span> <span class="n">b</span> <span class="o">:</span> <span class="n">a</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">requires</code>, fonksiyonun yalnızca tam sıralama ilişkisi sunan türlerle kullanılacağını anlatır. Böylece anlamsız kullanımlar, şablon gövdesindeki karmaşık hatalar yerine arayüz seviyesinde reddedilir.</p>

<p>Bununla birlikte çıkarım, dönüş türünden yapılmaz. <code class="language-plaintext highlighter-rouge">T sonuc = uret();</code> ifadesindeki hedef tür, klasik fonksiyon şablonu çıkarımını tek başına yönlendiremez. Ayrıca fonksiyon şablonlarında kısmi özelleştirme bulunmaz. Belirli bir tür ailesine farklı davranış vermek için aşırı yükleme, <code class="language-plaintext highlighter-rouge">if constexpr</code>, yardımcı sınıf şablonu veya concept tabanlı overload kullanmak gerekir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// Genel davranış</span>
<span class="p">}</span>

<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="n">T</span><span class="o">*</span> <span class="n">adres</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// İşaretçiler için overload</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İkinci fonksiyon kısmi özelleştirme değil, ayrı bir aşırı yüklemedir. Bu ayrım overload çözümleme kurallarını etkilediği için önemlidir.</p>

<h2 id="sınıf-şablonlarının-temel-kısıtları">Sınıf şablonlarının temel kısıtları</h2>

<p>Sınıf şablonları veri üyeleriyle birlikte tür politikası, sahiplik ve yaşam süresi tasarlamaya uygundur:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;cstddef&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">N</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">SabitTampon</span> <span class="p">{</span>
    <span class="n">T</span> <span class="n">veri</span><span class="p">[</span><span class="n">N</span><span class="p">]{};</span>

<span class="k">public</span><span class="o">:</span>
    <span class="n">T</span><span class="o">&amp;</span> <span class="n">getir</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;=</span> <span class="n">N</span><span class="p">)</span> <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">out_of_range</span><span class="p">(</span><span class="s">"indeks"</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">veri</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Burada hem tür hem de derleme zamanı kapasitesi sınıf kimliğinin parçasıdır. Dolayısıyla <code class="language-plaintext highlighter-rouge">SabitTampon&lt;int, 8&gt;</code> ile <code class="language-plaintext highlighter-rouge">SabitTampon&lt;int, 16&gt;</code> tamamen farklı türlerdir. Genel olarak iki örnek ancak tüm şablon argümanları aynıysa aynı türdür:</p>

\[C&lt;T, N&gt; = C&lt;U, M&gt; \iff T=U \land N=M\]

<p>Sınıf şablonlarının önemli üstünlüğü kısmi özelleştirmedir. Örneğin <code class="language-plaintext highlighter-rouge">Depo&lt;T*&gt;</code>, bütün işaretçi türleri için farklı sahiplik kuralları uygulayabilir. Ancak bu güç, tekrar eden kod ve özelleştirmeler arasında tutarsız arayüz riski doğurur. Genel sürümde bulunan bir üyenin özelleştirilmiş sürümde unutulması şaşırtıcı derleme hatalarına yol açabilir.</p>

<h2 id="hangisini-ne-zaman-seçmeli">Hangisini ne zaman seçmeli?</h2>

<p>Tek bir işlem, argümanlardan çıkarılabilen türler ve doğal overload davranışı gerekiyorsa fonksiyon şablonu seçilmelidir. Durum saklama, politika birleştirme, tür ailesi oluşturma veya kısmi özelleştirme gerekiyorsa sınıf şablonu daha uygundur. İyi bir generic tasarım yalnızca “her türle çalışmak” değildir; desteklenen işlemleri mümkün olduğunca erken, açık ve anlaşılır biçimde sınırlandırmaktır. <code class="language-plaintext highlighter-rouge">concept</code> kullanımı da bu sınırların üzerindeki nazik ama kararlı güvenlik görevlisidir.</p>

<p><img src="/img/c-generic-programming-66.svg" alt="c-generic-programming-66" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="generic-programming" /><category term="templates" /><category term="fonksiyon-şablonları" /><category term="sınıf-şablonları" /><category term="concepts" /><summary type="html"><![CDATA[C++ şablonları, aynı algoritmayı veya veri yapısını farklı türlerle çalıştırmanın güçlü bir yoludur. Ancak fonksiyon şablonları ile sınıf şablonları aynı sözdizimsel aileden gelseler de tür çıkarımı, özelleştirme ve hata yönetimi bakımından farklı tasarım kısıtlarına sahiptir. Kısacası biri çoğunlukla “Bu işlemi hangi türlerle yapabilirim?”, diğeri ise “Bu tür ailesinin durumunu ve davranışını nasıl modellemeliyim?” sorusuna odaklanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-generic-programming-66.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-generic-programming-66.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C# Operatör Aşırı Yükleme: Nesnelerin Matematikle Dansı</title><link href="https://program.sonsuz.us/posts/c-operator-asiri-yukleme-nesnelerin-matematikle-dansi/" rel="alternate" type="text/html" title="C# Operatör Aşırı Yükleme: Nesnelerin Matematikle Dansı" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-operator-asiri-yukleme-nesnelerin-matematikle-dansi</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-operator-asiri-yukleme-nesnelerin-matematikle-dansi/"><![CDATA[<p><img src="/img/c-operator-asiri-55.svg" alt="c-operator-asiri-55" /></p>

<p>C# ile geliştirdiğimiz özel sınıflar, varsayılan olarak <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">==</code> gibi operatörlerin ne anlama geldiğini bilmez. Örneğin iki vektörü <code class="language-plaintext highlighter-rouge">vektor1 + vektor2</code> biçiminde toplamak istersek derleyici doğal olarak şaşırır. Operatör aşırı yükleme, bu sembollere kendi nesnelerimiz için anlam kazandırmamızı sağlar. Böylece kod hem matematiksel gösterime yaklaşır hem de daha okunabilir hâle gelir.</p>

<p>``</p>

<h2 id="operatör-aşırı-yükleme-nedir">Operatör aşırı yükleme nedir?</h2>

<p>Operatör aşırı yükleme, mevcut bir operatörün özel bir tür üzerindeki davranışını tanımlamaktır. Burada yeni bir operatör icat etmeyiz; C# tarafından desteklenen operatörlerden birini yeniden anlamlandırırız.</p>

<p>Örneğin iki boyutlu bir vektörümüz şu şekilde gösterilsin:</p>

\[\vec{v} = (x, y)\]

<p>İki vektörün toplamı ise bileşenlerin ayrı ayrı toplanmasıyla bulunur:</p>

\[(x_1, y_1) + (x_2, y_2) = (x_1+x_2, y_1+y_2)\]

<p>Bu matematiksel kuralı C# sınıfına taşıyarak <code class="language-plaintext highlighter-rouge">+</code> operatörünü programlayabiliriz.</p>

<h2 id="temel-söz-dizimi">Temel söz dizimi</h2>

<p>Aşırı yüklenen operatörler <code class="language-plaintext highlighter-rouge">public</code> ve <code class="language-plaintext highlighter-rouge">static</code> olarak tanımlanmalıdır. Metot adı yerine <code class="language-plaintext highlighter-rouge">operator</code> anahtar sözcüğü ve ilgili sembol kullanılır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Vektor</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">X</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Y</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">Vektor</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="kt">double</span> <span class="n">y</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">X</span> <span class="p">=</span> <span class="n">x</span><span class="p">;</span>
        <span class="n">Y</span> <span class="p">=</span> <span class="n">y</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="n">Vektor</span> <span class="k">operator</span> <span class="p">+(</span><span class="n">Vektor</span> <span class="n">sol</span><span class="p">,</span> <span class="n">Vektor</span> <span class="n">sag</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="k">new</span> <span class="nf">Vektor</span><span class="p">(</span><span class="n">sol</span><span class="p">.</span><span class="n">X</span> <span class="p">+</span> <span class="n">sag</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">sol</span><span class="p">.</span><span class="n">Y</span> <span class="p">+</span> <span class="n">sag</span><span class="p">.</span><span class="n">Y</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">ToString</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">$"(</span><span class="p">{</span><span class="n">X</span><span class="p">}</span><span class="s">, </span><span class="p">{</span><span class="n">Y</span><span class="p">}</span><span class="s">)"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu metot iki <code class="language-plaintext highlighter-rouge">Vektor</code> nesnesini alır ve toplamı temsil eden yeni bir nesne döndürür. Mevcut nesneleri değiştirmemek, özellikle matematiksel değer türlerinde daha güvenli ve tahmin edilebilir bir tasarımdır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vektor</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vektor</span><span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">toplam</span> <span class="p">=</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">toplam</span><span class="p">);</span> <span class="c1">// (6, 4)</span>
</code></pre></div></div>

<p>Normalde <code class="language-plaintext highlighter-rouge">Vektor.Topla(a, b)</code> gibi bir metot yazılabilirdi. Ancak <code class="language-plaintext highlighter-rouge">a + b</code>, işlemin niyetini çok daha hızlı anlatır.</p>

<p>\vert  Yaklaşım \vert  Kullanım \vert  Okunabilirlik \vert  Matematiksel uyum \vert 
\vert —\vert —\vert —:\vert —:\vert 
\vert  Normal metot \vert  <code class="language-plaintext highlighter-rouge">Vektor.Topla(a, b)</code> \vert  Orta \vert  Düşük \vert 
\vert  Operatör \vert  <code class="language-plaintext highlighter-rouge">a + b</code> \vert  Yüksek \vert  Yüksek \vert 
\vert  Elle hesaplama \vert  <code class="language-plaintext highlighter-rouge">new Vektor(a.X+b.X, a.Y+b.Y)</code> \vert  Düşük \vert  Orta \vert</p>

<h2 id="i̇lişkisel-operatörleri-yüklemek">İlişkisel operatörleri yüklemek</h2>

<p>Vektörleri büyüklüklerine göre karşılaştırabiliriz. Bir vektörün uzunluğu Pisagor bağıntısıyla hesaplanır:</p>

\[\vert \vec{v}\vert  = \sqrt{x^2+y^2}\]

<p>Karşılaştırma sırasında karekök almaya gerek yoktur. Çünkü pozitif değerlerde $a^2 &gt; b^2$ ise $a &gt; b$ olur.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">double</span> <span class="n">UzunlukKaresi</span> <span class="p">=&gt;</span> <span class="n">X</span> <span class="p">*</span> <span class="n">X</span> <span class="p">+</span> <span class="n">Y</span> <span class="p">*</span> <span class="n">Y</span><span class="p">;</span>

<span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;(</span><span class="n">Vektor</span> <span class="n">sol</span><span class="p">,</span> <span class="n">Vektor</span> <span class="n">sag</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">sol</span><span class="p">.</span><span class="n">UzunlukKaresi</span> <span class="p">&gt;</span> <span class="n">sag</span><span class="p">.</span><span class="n">UzunlukKaresi</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;(</span><span class="n">Vektor</span> <span class="n">sol</span><span class="p">,</span> <span class="n">Vektor</span> <span class="n">sag</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">sol</span><span class="p">.</span><span class="n">UzunlukKaresi</span> <span class="p">&lt;</span> <span class="n">sag</span><span class="p">.</span><span class="n">UzunlukKaresi</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>C# bazı operatörlerin çiftler hâlinde tanımlanmasını ister. <code class="language-plaintext highlighter-rouge">&lt;</code> ekleniyorsa <code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;=</code> ekleniyorsa <code class="language-plaintext highlighter-rouge">&gt;=</code>, <code class="language-plaintext highlighter-rouge">==</code> ekleniyorsa <code class="language-plaintext highlighter-rouge">!=</code> de tanımlanmalıdır. Derleyici bu konuda “Birini çağırdıysan arkadaşını da getir!” yaklaşımındadır.</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>Zorunlu eşi</th>
      <th>Örnek anlam</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">==</code></td>
      <td><code class="language-plaintext highlighter-rouge">!=</code></td>
      <td>Değer eşitliği</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">&gt;</code></td>
      <td>Büyüklük karşılaştırması</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;=</code></td>
      <td><code class="language-plaintext highlighter-rouge">&gt;=</code></td>
      <td>Sıralama ve eşitlik</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">true</code></td>
      <td><code class="language-plaintext highlighter-rouge">false</code></td>
      <td>Mantıksal değerlendirme</td>
    </tr>
  </tbody>
</table>

<h2 id="eşitlikte-dikkat-edilmesi-gerekenler">Eşitlikte dikkat edilmesi gerekenler</h2>

<p><code class="language-plaintext highlighter-rouge">==</code> operatörü yüklendiğinde <code class="language-plaintext highlighter-rouge">Equals</code> ve <code class="language-plaintext highlighter-rouge">GetHashCode</code> metotları da uyumlu biçimde ezilmelidir. Aksi hâlde operatöre göre eşit olan iki nesne, bir <code class="language-plaintext highlighter-rouge">Dictionary</code> veya <code class="language-plaintext highlighter-rouge">HashSet</code> içinde farklı kabul edilebilir. Eşitlik tanımı uygulamanın her noktasında aynı mantığı izlemelidir.</p>

<p>Operatör aşırı yükleme güçlüdür; fakat yalnızca operatörün anlamı kullanıcı için doğal olduğunda tercih edilmelidir. Bir <code class="language-plaintext highlighter-rouge">Musteri</code> nesnesini başka bir müşteriyle toplamak belirsizken, para, tarih aralığı, karmaşık sayı veya vektörleri toplamak oldukça anlaşılırdır. Ayrıca operatörün önceliği ve operand sayısı değiştirilemez. Doğru kullanıldığında bu özellik, C++’taki benzer yaklaşım gibi özel nesneleri dilin doğal parçalarıymış gibi kullanmamızı sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="csharp" /><category term="operatör-aşırı-yükleme" /><category term="nesne-yönelimli-programlama" /><category term="dotnet" /><category term="operator-overloading" /><summary type="html"><![CDATA[C# ile geliştirdiğimiz özel sınıflar, varsayılan olarak +, -, &gt;, == gibi operatörlerin ne anlama geldiğini bilmez. Örneğin iki vektörü vektor1 + vektor2 biçiminde toplamak istersek derleyici doğal olarak şaşırır. Operatör aşırı yükleme, bu sembollere kendi nesnelerimiz için anlam kazandırmamızı sağlar. Böylece kod hem matematiksel gösterime yaklaşır hem de daha okunabilir hâle gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-operator-asiri-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-operator-asiri-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Küplerden Sonsuz Dünyalara: Voksel Tabanlı Dünya Temsili</title><link href="https://program.sonsuz.us/posts/kuplerden-sonsuz-dunyalara-voksel-tabanli-dunya-temsili/" rel="alternate" type="text/html" title="Küplerden Sonsuz Dünyalara: Voksel Tabanlı Dünya Temsili" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kuplerden-sonsuz-dunyalara-voksel-tabanli-dunya-temsili</id><content type="html" xml:base="https://program.sonsuz.us/posts/kuplerden-sonsuz-dunyalara-voksel-tabanli-dunya-temsili/"><![CDATA[<p><img src="/img/kuplerden-sonsuz-dunyalara-19.svg" alt="kuplerden-sonsuz-dunyalara-19" /></p>

<p>Minecraft dünyasına uzaktan bakınca dağlar, mağaralar ve ormanlar görürüz; motorun gözünden bakınca ise devasa bir üç boyutlu tablo vardır. Bu tablonun her hücresi, belirli bir konumdaki bloğun türünü saklar. İşte hacimsel piksel anlamına gelen <strong>voksel</strong>, küplerle kurulan bu dijital evrenin temel yapı taşıdır.
``</p>

<h2 id="voksel-tam-olarak-nedir">Voksel tam olarak nedir?</h2>

<p>İki boyutlu bir görüntüde piksel, $(x, y)$ koordinatındaki rengi temsil eder. Voksel ise buna derinlik ekleyerek $(x, y, z)$ konumundaki hacimsel bilgiyi temsil eder. Bir voksel yalnızca “dolu” veya “boş” olmak zorunda değildir; taş, su, cam ya da toprak gibi bir blok kimliği de taşıyabilir.</p>

<p>Boyutları $W$, $H$ ve $D$ olan yoğun bir dünyanın toplam hücre sayısı:</p>

\[N = W × H × D\]

<p>Örneğin $1024^3$ hücre, bir milyardan fazla voksel demektir. Her voksel yalnızca 2 bayt kullansa bile yaklaşık 2 GB bellek gerekir. Üstelik blok ışığı, nem ve biyom gibi ek veriler bu miktarı büyütür. Bu nedenle oyunlar bütün dünyayı tek parça hâlinde belleğe yüklemez.</p>

<table>
  <thead>
    <tr>
      <th>Temsil yöntemi</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yoğun 3B dizi</td>
      <td>Hızlı ve doğrudan erişim</td>
      <td>Boş alanlarda bellek israfı</td>
    </tr>
    <tr>
      <td>Seyrek yapı</td>
      <td>Boş dünyalarda verimli</td>
      <td>Erişim ve güncelleme daha karmaşık</td>
    </tr>
    <tr>
      <td>Chunk sistemi</td>
      <td>Yükleme ve kayıt kolaylığı</td>
      <td>Sınır yönetimi gerekir</td>
    </tr>
    <tr>
      <td>Octree</td>
      <td>Farklı ayrıntı seviyeleri</td>
      <td>Uygulaması zor olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="dünyayı-parçalara-ayırmak-chunk-sistemi">Dünyayı parçalara ayırmak: Chunk sistemi</h2>

<p>Minecraft benzeri oyunlar dünyayı <strong>chunk</strong> adı verilen bölgelere böler. Oyuncuya yakın chunk’lar belleğe alınır; uzaktakiler kaydedilip kaldırılır. Böylece teorik olarak sınırsız bir dünya, sınırlı RAM ile gezilebilir.</p>

<p>Bir chunk’ın $16 × 256 × 16$ bloktan oluştuğunu varsayarsak:</p>

\[16 × 256 × 16 = 65\,536\]

<p>hücre elde edilir. Oyuncu hareket ettiğinde yalnızca görüş mesafesine giren yeni chunk’lar üretilir veya diskten okunur. Bu yaklaşım hem prosedürel dünya üretimini hem de paralel işlemeyi kolaylaştırır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Chunk</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">Width</span> <span class="p">=</span> <span class="m">16</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">Height</span> <span class="p">=</span> <span class="m">256</span><span class="p">;</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="kt">ushort</span><span class="p">[,,]</span> <span class="n">blocks</span> <span class="p">=</span>
        <span class="k">new</span> <span class="kt">ushort</span><span class="p">[</span><span class="n">Width</span><span class="p">,</span> <span class="n">Height</span><span class="p">,</span> <span class="n">Width</span><span class="p">];</span>

    <span class="k">public</span> <span class="kt">ushort</span> <span class="nf">GetBlock</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span> <span class="n">z</span><span class="p">)</span>
        <span class="p">=&gt;</span> <span class="n">blocks</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">];</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">SetBlock</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span> <span class="n">z</span><span class="p">,</span> <span class="kt">ushort</span> <span class="n">blockId</span><span class="p">)</span>
        <span class="p">=&gt;</span> <span class="n">blocks</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">]</span> <span class="p">=</span> <span class="n">blockId</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu orta düzey C# örneği, blok kimliklerini bir chunk içinde saklar. <code class="language-plaintext highlighter-rouge">ushort</code>, 65.536 farklı blok durumunu temsil edebilir. Gerçek bir motorda sınır kontrolleri, ışık verisi ve değiştirilmiş blokların diske kaydı da eklenir.</p>

<h2 id="her-küpü-çizmek-neden-kötü-bir-fikir">Her küpü çizmek neden kötü bir fikir?</h2>

<p>Bir küpün 6 yüzü ve genellikle 12 üçgeni vardır. Bir milyon bloğu ayrı ayrı çizmek, görünmeyen iç yüzler yüzünden ekran kartını gereksiz yere yorar. Çözüm, yalnızca havaya komşu yüzleri mesh’e eklemektir. İki katı blok yan yana geldiğinde aralarındaki yüzler görünmez ve üretilmez.</p>

<table>
  <thead>
    <tr>
      <th>Optimizasyon</th>
      <th>Etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yüz eleme</td>
      <td>Kapalı yüzleri çizmez</td>
    </tr>
    <tr>
      <td>Greedy meshing</td>
      <td>Bitişik yüzleri büyük dörtgenlerde birleştirir</td>
    </tr>
    <tr>
      <td>Frustum culling</td>
      <td>Kamera dışında kalan chunk’ları atlar</td>
    </tr>
    <tr>
      <td>Occlusion culling</td>
      <td>Başka nesnelerin arkasındakileri atlar</td>
    </tr>
    <tr>
      <td>LOD</td>
      <td>Uzaktaki bölgeleri daha basit gösterir</td>
    </tr>
  </tbody>
</table>

<p>Greedy meshing özellikle değerlidir: Yan yana duran 100 aynı çim yüzü, 100 ayrı dörtgen yerine tek bir büyük dörtgene dönüşebilir. Böylece üçgen sayısı ve çizim maliyeti ciddi biçimde azalır.</p>

<h2 id="değiştirilebilir-dünyanın-bedeli">Değiştirilebilir dünyanın bedeli</h2>

<p>Voksellerin en büyük avantajı, dünyayı düzenlemeyi doğal hâle getirmesidir. Bir blok kırıldığında ilgili hücre “hava” yapılır. Ancak değişiklik chunk mesh’inin yeniden oluşturulmasını gerektirir. Blok chunk sınırındaysa komşu chunk da etkilenebilir.</p>

<p>Bu yüzden iyi bir motor; mesh üretimini arka plan iş parçacıklarında yapar, yalnızca değişen chunk’ları günceller ve GPU’ya gönderilen veriyi sınırlar. Sonuç olarak voksel dünyalar basit küplerden oluşsa da performanslı çalışmaları; veri sıkıştırma, görünürlük hesaplama, paralel üretim ve akıllı mesh tekniklerinin uyumuna bağlıdır. Küpler masum görünür, fakat milyonlarcası bir araya geldiğinde motor geliştiricisini gerçek bir optimizasyon madencisine dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="voksel" /><category term="minecraft" /><category term="oyun geliştirme" /><category term="grafik programlama" /><category term="performans" /><category term="prosedürel üretim" /><summary type="html"><![CDATA[Minecraft dünyasına uzaktan bakınca dağlar, mağaralar ve ormanlar görürüz; motorun gözünden bakınca ise devasa bir üç boyutlu tablo vardır. Bu tablonun her hücresi, belirli bir konumdaki bloğun türünü saklar. İşte hacimsel piksel anlamına gelen voksel, küplerle kurulan bu dijital evrenin temel yapı taşıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kuplerden-sonsuz-dunyalara-19.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kuplerden-sonsuz-dunyalara-19.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Küpün ve Kontrolcünün Ritmi: Speedcubing ile Video Oyun Optimizasyonu</title><link href="https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu/" rel="alternate" type="text/html" title="Küpün ve Kontrolcünün Ritmi: Speedcubing ile Video Oyun Optimizasyonu" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu/"><![CDATA[<p>Bir Rubik küpünü saniyeler içinde çözmek ile bir video oyununda kusursuz hareket dizileri uygulamak ilk bakışta farklı beceriler gibi görünür. Oysa speedcuber’ın algoritma çalışmasıyla oyuncunun hareket, nişan veya kaynak yönetimi pratiği aynı zihinsel dönüşüme dayanır: Yavaş ve bilinçli kararlar, tekrar sayesinde hızlı ve otomatik motor kalıplara dönüşür.</p>

<p><img src="/img/kupun-ve-kontrolcunun-82.svg" alt="kupun-ve-kontrolcunun-82" /></p>

<p>``</p>

<h2 id="bilinçli-hareketten-otomatik-tepkiye">Bilinçli hareketten otomatik tepkiye</h2>

<p>Yeni başlayan bir speedcuber, karşısındaki deseni tanımaya ve uygun algoritmayı hatırlamaya çalışır. Deneyimli biri ise deseni gördüğü anda ellerini harekete geçirir. Benzer biçimde acemi bir oyuncu hangi tuşa basacağını düşünürken deneyimli oyuncu saldırıdan kaçıp karşı hamle yapabilir.</p>

<p>Bu gelişim <strong>motor hafızası</strong> olarak adlandırılır. Ancak kasların kendi başına bilgi depoladığı düşünülmemelidir. Öğrenme; beyin, sinir sistemi, görsel algı ve kas koordinasyonu arasında kurulan bağlantıların güçlenmesidir. Bir hareket dizisi tekrarlandıkça karar verme maliyeti azalır ve işlem otomatikleşir.</p>

<p>Basitleştirilmiş bir öğrenme modeli şöyle gösterilebilir:</p>

\[T(n) = T_{min} + (T_0 - T_{min})e^{-kn}\]

<p>Burada $T(n)$, $n$ tekrar sonrasındaki uygulama süresi; $T_0$ başlangıç süresi; $T_{min}$ ulaşılabilecek yaklaşık alt sınır; $k$ ise öğrenme hızıdır. İlk tekrarlar büyük gelişmeler sağlarken ilerleyen aşamalarda her küçük iyileştirme daha fazla emek ister. Yani 60 saniyeden 30 saniyeye düşmek, 12 saniyeden 11 saniyeye düşmekten çoğu zaman daha kolaydır.</p>

<h2 id="i̇ki-dünyanın-ortak-mekanikleri">İki dünyanın ortak mekanikleri</h2>

<table>
  <thead>
    <tr>
      <th>Zihinsel süreç</th>
      <th>Speedcubing örneği</th>
      <th>Video oyunu örneği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Desen tanıma</td>
      <td>F2L çiftini fark etmek</td>
      <td>Rakibin saldırı animasyonunu okumak</td>
    </tr>
    <tr>
      <td>Parçalama</td>
      <td>Algoritmayı kısa tetiklere ayırmak</td>
      <td>Komboyu küçük giriş dizilerine bölmek</td>
    </tr>
    <tr>
      <td>Motor hafıza</td>
      <td>Parmak hareketlerini otomatikleştirmek</td>
      <td>Tuş, fare veya kontrolcü hareketini otomatikleştirmek</td>
    </tr>
    <tr>
      <td>İleri planlama</td>
      <td>Sonraki çifti çözüm sırasında aramak</td>
      <td>Sonraki rota veya hamleyi önceden seçmek</td>
    </tr>
    <tr>
      <td>Hata analizi</td>
      <td>Küp rotasyonlarını incelemek</td>
      <td>Kayıt veya tekrar görüntüsünü izlemek</td>
    </tr>
  </tbody>
</table>

<p>Her iki alanda da uzmanlık yalnızca “daha hızlı hareket etmek” değildir. Asıl kazanç, gereksiz kararları ve hareketleri ortadan kaldırmaktır. Speedcubing’de buna düşük hamle sayısı, akıcı dönüşler ve iyi look-ahead eşlik eder. Oyunlarda ise doğru rota, uygun zamanlama ve minimum girdiyle maksimum sonuç önem kazanır.</p>

<h2 id="tekrar-var-tekrar-var">Tekrar var, tekrar var</h2>

<p>Aynı diziyi düşünmeden yüz kez yapmak her zaman verimli değildir. Hatalı hareket tekrarlandığında beyin o hatayı da otomatikleştirebilir. Bu nedenle <strong>bilinçli pratik</strong>, rastgele tekrardan daha değerlidir.</p>

<table>
  <thead>
    <tr>
      <th>Verimsiz tekrar</th>
      <th>Bilinçli pratik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sürekli tam çözüm veya tam maç yapmak</td>
      <td>Tek bir zayıf beceriyi izole etmek</td>
    </tr>
    <tr>
      <td>Yalnızca sonucu ölçmek</td>
      <td>Süreç, hata ve tutarlılığı ölçmek</td>
    </tr>
    <tr>
      <td>Hız uğruna tekniği bozmak</td>
      <td>Önce doğru, sonra hızlı uygulamak</td>
    </tr>
    <tr>
      <td>Yorulana kadar devam etmek</td>
      <td>Kısa çalışma ve dinlenme döngüleri kullanmak</td>
    </tr>
  </tbody>
</table>

<p>Örneğin bir speedcuber yalnızca zorlandığı algoritmayı çalışabilir. Bir oyuncu da tüm bölümü yeniden oynamak yerine problemli sıçramayı, komboyu veya nişan geçişini ayrı bir antrenman ortamında tekrarlayabilir.</p>

<h2 id="gelişimi-veriye-dönüştürmek">Gelişimi veriye dönüştürmek</h2>

<p>Aşağıdaki küçük Python kodu, pratik sürelerinin ortalamasını ve tutarlılığını ölçer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">statistics</span> <span class="kn">import</span> <span class="n">mean</span><span class="p">,</span> <span class="n">pstdev</span>

<span class="n">sureler</span> <span class="o">=</span> <span class="p">[</span><span class="mf">18.4</span><span class="p">,</span> <span class="mf">17.9</span><span class="p">,</span> <span class="mf">18.1</span><span class="p">,</span> <span class="mf">17.6</span><span class="p">,</span> <span class="mf">17.8</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Ortalama:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="nf">mean</span><span class="p">(</span><span class="n">sureler</span><span class="p">),</span> <span class="mi">2</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Sapma:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="nf">pstdev</span><span class="p">(</span><span class="n">sureler</span><span class="p">),</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>Ortalama süre genel performansı, standart sapma ise denemeler arasındaki değişkenliği gösterir. Daha düşük ortalama hızlanmayı; daha düşük sapma ise becerinin güvenilir biçimde otomatikleştiğini anlatır. Aynı yaklaşım küp çözme sürelerine, bölüm tamamlama kayıtlarına veya hedef vurma testlerine uygulanabilir.</p>

<h2 id="sonuç-hız-düşünmemek-değil-doğru-düşünmektir">Sonuç: Hız, düşünmemek değil doğru düşünmektir</h2>

<p>Speedcubing ve oyun optimizasyonunda ustalık, zihni tamamen devre dışı bırakmak anlamına gelmez. Temel hareketler motor hafızasına aktarılınca bilinçli dikkat daha üst düzey problemlere ayrılır. Eller mevcut hamleyi tamamlarken zihin bir sonraki deseni, rotayı veya riski değerlendirebilir. Gerçek hız böyle doğar: doğru hareketi öğrenmek, onu parçalara ayırmak, kontrollü biçimde tekrarlamak ve sonunda akışın doğal bir parçasına dönüştürmek.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="speedcubing" /><category term="video oyunları" /><category term="motor hafıza" /><category term="optimizasyon" /><category term="bilinçli pratik" /><category term="bilişsel bilim" /><summary type="html"><![CDATA[Bir Rubik küpünü saniyeler içinde çözmek ile bir video oyununda kusursuz hareket dizileri uygulamak ilk bakışta farklı beceriler gibi görünür. Oysa speedcuber’ın algoritma çalışmasıyla oyuncunun hareket, nişan veya kaynak yönetimi pratiği aynı zihinsel dönüşüme dayanır: Yavaş ve bilinçli kararlar, tekrar sayesinde hızlı ve otomatik motor kalıplara dönüşür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kupun-ve-kontrolcunun-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kupun-ve-kontrolcunun-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mars Rover’larında Otonom Karar Verme: Gecikmeye Rağmen Güvenli Keşif</title><link href="https://program.sonsuz.us/posts/mars-roverlarinda-otonom-karar-verme-gecikmeye-ragmen-guvenli-kesif/" rel="alternate" type="text/html" title="Mars Rover’larında Otonom Karar Verme: Gecikmeye Rağmen Güvenli Keşif" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mars-roverlarinda-otonom-karar-verme-gecikmeye-ragmen-guvenli-kesif</id><content type="html" xml:base="https://program.sonsuz.us/posts/mars-roverlarinda-otonom-karar-verme-gecikmeye-ragmen-guvenli-kesif/"><![CDATA[<p>Mars yüzeyinde ilerleyen bir rover, Dünya’dan verilen her komutu anında uygulayan uzaktan kumandalı bir araba değildir. Gezegenlerin konumuna bağlı olarak tek yönlü iletişim yaklaşık 4–24 dakika sürebilir. Rover bir kayaya yaklaşırken operatörün “Sola dön!” komutunu bekleseydi cevap gelene kadar çoktan kuma saplanmış olabilirdi. Bu nedenle araç; çevresini algılayan, riskleri hesaplayan ve güvenli rotayı kendi başına seçen küçük bir robot kâşif gibi davranır.
``</p>

<h2 id="neden-otonomi-gerekli">Neden otonomi gerekli?</h2>

<p>Bir komutun Dünya’dan Mars’a gidip sonucunun geri dönmesi için gereken yaklaşık süre şöyle düşünülebilir:</p>

\[T_{toplam} = 2 \times \frac{d}{c} + T_{işleme}\]

<p>Burada $d$ gezegenler arasındaki mesafe, $c$ ışık hızı ve $T_{işleme}$ görev merkezindeki değerlendirme süresidir. Radyo sinyalleri ışık hızında ilerlese bile mesafe ortadan kalkmaz. Üstelik bant genişliği sınırlıdır; rover sürekli yüksek çözünürlüklü görüntü gönderemez.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dünya’dan doğrudan kontrol</td>
      <td>İnsan uzmanlığı yüksektir</td>
      <td>Gecikme nedeniyle anlık tepki veremez</td>
    </tr>
    <tr>
      <td>Tam otonom hareket</td>
      <td>Hızlı karar alır</td>
      <td>Hatalı algılama riski taşır</td>
    </tr>
    <tr>
      <td>Karma yaklaşım</td>
      <td>Güvenlik ve esnekliği dengeler</td>
      <td>Karmaşık yazılım ve test gerektirir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/mars-roverlarinda-otonom-71.svg" alt="mars-roverlarinda-otonom-71" /></p>

<p>Güncel görevlerde çoğunlukla karma yaklaşım kullanılır. Bilim insanları hedef bölgeyi belirler; rover ise birkaç metrelik hareket sırasında taşlardan, çukurlardan ve tehlikeli eğimlerden kaçınır.</p>

<h2 id="rover-çevresini-nasıl-görüyor">Rover çevresini nasıl görüyor?</h2>

<p>Otonom sürüşün ilk aşaması <strong>algılama</strong>dır. Stereo kameralar aynı sahneyi iki farklı noktadan görüntüler. İnsan gözlerindeki derinlik algısına benzeyen bu yöntemle pikseller arasındaki kayma, yani disparity, ölçülür. Basitleştirilmiş derinlik bağıntısı şöyledir:</p>

\[Z = \frac{fB}{\Delta x}\]

<p>$Z$ engele olan uzaklığı, $f$ kameranın odak uzaklığını, $B$ iki kamera arasındaki mesafeyi ve $\Delta x$ görüntülerdeki piksel farkını gösterir. Rover bu verilerden üç boyutlu bir nokta bulutu ve yerel arazi haritası üretir.</p>

<p>Her arazi parçasına bir maliyet atanabilir:</p>

\[C = w_1E + w_2S + w_3R + w_4D\]

<p>Burada $E$ eğim, $S$ zeminin gevşekliği, $R$ kaya riski ve $D$ hedefe olan uzaklıktır. Ağırlıklar görev önceliklerine göre ayarlanır. Böylece en kısa rota yerine en güvenli ve enerji açısından uygun rota seçilebilir.</p>

<h2 id="rota-planlama-nasıl-çalışıyor">Rota planlama nasıl çalışıyor?</h2>

<p>Harita hücrelere veya düğümlere ayrıldıktan sonra A<em>, Dijkstra ya da örnekleme tabanlı algoritmalar kullanılabilir. A</em> algoritmasının temel değerlendirmesi şöyledir:</p>

\[f(n) = g(n) + h(n)\]

<p>$g(n)$ başlangıçtan mevcut noktaya kadar gerçek maliyeti, $h(n)$ ise hedefe kalan tahmini maliyeti temsil eder.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">heapq</span> <span class="kn">import</span> <span class="n">heappush</span><span class="p">,</span> <span class="n">heappop</span>

<span class="k">def</span> <span class="nf">guvenli_adimlar</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="n">hedef</span><span class="p">,</span> <span class="n">komsular</span><span class="p">):</span>
    <span class="n">kuyruk</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="n">baslangic</span><span class="p">,</span> <span class="p">[])]</span>
    <span class="n">ziyaret</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>

    <span class="k">while</span> <span class="n">kuyruk</span><span class="p">:</span>
        <span class="n">maliyet</span><span class="p">,</span> <span class="n">konum</span><span class="p">,</span> <span class="n">yol</span> <span class="o">=</span> <span class="nf">heappop</span><span class="p">(</span><span class="n">kuyruk</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">konum</span> <span class="o">==</span> <span class="n">hedef</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">yol</span> <span class="o">+</span> <span class="p">[</span><span class="n">konum</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">konum</span> <span class="ow">in</span> <span class="n">ziyaret</span><span class="p">:</span>
            <span class="k">continue</span>

        <span class="n">ziyaret</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">konum</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">yeni</span><span class="p">,</span> <span class="n">arazi_riski</span> <span class="ow">in</span> <span class="nf">komsular</span><span class="p">(</span><span class="n">konum</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">yeni</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ziyaret</span><span class="p">:</span>
                <span class="nf">heappush</span><span class="p">(</span><span class="n">kuyruk</span><span class="p">,</span> <span class="p">(</span>
                    <span class="n">maliyet</span> <span class="o">+</span> <span class="n">arazi_riski</span><span class="p">,</span>
                    <span class="n">yeni</span><span class="p">,</span>
                    <span class="n">yol</span> <span class="o">+</span> <span class="p">[</span><span class="n">konum</span><span class="p">]</span>
                <span class="p">))</span>
    <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<p>Bu sade örnek, komşu konumları arazi riskine göre kuyruğa ekler. Gerçek rover yazılımı tekerlek kaymasını, enerji tüketimini, gövde yüksekliğini ve iletişim fırsatlarını da hesaba katar.</p>

<h2 id="karar-vermek-yalnızca-ilerlemek-değildir">Karar vermek yalnızca ilerlemek değildir</h2>

<p>Rover risk yükseldiğinde durabilir, yeni fotoğraflar çekebilir veya farklı bir rota hesaplayabilir. Tekerleklerin dönüşüyle beklenen hareket karşılaştırılarak kayma tahmin edilir. Motorlar çalıştığı hâlde konum değişmiyorsa sistem gevşek kum ihtimalini fark eder.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Otonom tepki</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Büyük kaya</td>
      <td>Yanal kaçış rotası oluşturma</td>
    </tr>
    <tr>
      <td>Dik eğim</td>
      <td>Maliyeti artırma veya rotayı reddetme</td>
    </tr>
    <tr>
      <td>Tekerlek kayması</td>
      <td>Hızı azaltma ve yeniden planlama</td>
    </tr>
    <tr>
      <td>Belirsiz görüntü</td>
      <td>Durup ek görüntü toplama</td>
    </tr>
    <tr>
      <td>Kritik hata</td>
      <td>Güvenli moda geçme</td>
    </tr>
  </tbody>
</table>

<p>Mars’ta başarılı otonomi, rover’ın “zekice cesur” değil, ölçülü biçimde temkinli olmasıdır. Çünkü milyonlarca kilometre uzaktaki bir robot için en iyi karar bazen yeni bir keşfe koşmak değil, durup Dünya’daki ekibin talimatını beklemektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="mars" /><category term="otonom sistemler" /><category term="yapay zeka" /><category term="rota planlama" /><category term="robotik" /><category term="bilgisayarlı görü" /><summary type="html"><![CDATA[Mars yüzeyinde ilerleyen bir rover, Dünya’dan verilen her komutu anında uygulayan uzaktan kumandalı bir araba değildir. Gezegenlerin konumuna bağlı olarak tek yönlü iletişim yaklaşık 4–24 dakika sürebilir. Rover bir kayaya yaklaşırken operatörün “Sola dön!” komutunu bekleseydi cevap gelene kadar çoktan kuma saplanmış olabilirdi. Bu nedenle araç; çevresini algılayan, riskleri hesaplayan ve güvenli rotayı kendi başına seçen küçük bir robot kâşif gibi davranır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mars-roverlarinda-otonom-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mars-roverlarinda-otonom-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">N-Cisim Problemi: Python ile Kütle Çekimi Simülasyonu</title><link href="https://program.sonsuz.us/posts/n-cisim-problemi-python-ile-kutle-cekimi-simulasyonu/" rel="alternate" type="text/html" title="N-Cisim Problemi: Python ile Kütle Çekimi Simülasyonu" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/n-cisim-problemi-python-ile-kutle-cekimi-simulasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/n-cisim-problemi-python-ile-kutle-cekimi-simulasyonu/"><![CDATA[<p><img src="/img/n-cisim-problemi-71.svg" alt="n-cisim-problemi-71" /></p>

<p>Gökyüzündeki hareketler ilk bakışta kusursuz bir saat mekanizması gibi görünür. Ancak sisteme üçüncü bir gök cismi eklendiğinde işler hızla kozmik bir bilardo masasına dönüşür! N-cisim problemi; yıldızların, gezegenlerin veya galaksilerin karşılıklı kütle çekimi altında nasıl hareket ettiğini bulmayı amaçlar. Genel bir analitik çözümü bulunmadığından bilgisayarlarla küçük zaman adımları hâlinde yaklaşık sonuçlar hesaplarız.</p>

<p>``</p>

<h2 id="newtondan-simülasyona">Newton’dan simülasyona</h2>

<p>İki cismin arasındaki çekim kuvveti Newton yasasıyla hesaplanır:</p>

\[F = G\frac{m_1m_2}{r^2}\]

<p>Burada $G$ kütle çekim sabiti, $m_1$ ve $m_2$ kütleler, $r$ ise cisimler arasındaki uzaklıktır. Fakat yönü de hesaba katmak için vektörel ifadeye ihtiyacımız vardır. $i$ cisminin $j$ nedeniyle kazandığı ivme şöyledir:</p>

\[\vec{a}_{ij}=Gm_j\frac{\vec{r}_j-\vec{r}_i}{(\vert \vec{r}_j-\vec{r}_i\vert ^2+\epsilon^2)^{3/2}}\]

<p>Toplam ivme, diğer bütün cisimlerin katkılarının toplamıdır:</p>

\[\vec{a}_i=\sum_{j\ne i}\vec{a}_{ij}\]

<p>Formüldeki $\epsilon$, iki cisim aşırı yaklaştığında ivmenin sonsuza gitmesini engelleyen <strong>yumuşatma parametresidir</strong>. Bu değer fiziksel bir yasa değil, sayısal simülasyonu kararlı tutan küçük bir emniyet yastığıdır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Fiziksel anlamı</th>
      <th>Simülasyondaki görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Konum</td>
      <td>Cismin uzaydaki yeri</td>
      <td>Uzaklık ve yön hesabı</td>
    </tr>
    <tr>
      <td>Hız</td>
      <td>Konumun değişim oranı</td>
      <td>Yeni konumu belirleme</td>
    </tr>
    <tr>
      <td>İvme</td>
      <td>Hızın değişim oranı</td>
      <td>Kütle çekimini uygulama</td>
    </tr>
    <tr>
      <td>Zaman adımı</td>
      <td>İki hesap arasındaki süre</td>
      <td>Hassasiyet ve performans dengesi</td>
    </tr>
    <tr>
      <td>Yumuşatma</td>
      <td>Yakın geçiş düzeltmesi</td>
      <td>Sayısal patlamayı önleme</td>
    </tr>
  </tbody>
</table>

<h2 id="neden-adım-adım-hesaplıyoruz">Neden adım adım hesaplıyoruz?</h2>

<p>İvme sürekli değiştiği için gelecekteki konumu tek hamlede bulamayız. Zamanı $\Delta t$ büyüklüğünde dilimlere ayırır, her dilimde ivme, hız ve konumu güncelleriz. Basit Euler yöntemi kolaydır fakat uzun simülasyonlarda enerji hatası biriktirir. <strong>Leapfrog</strong> yöntemi ise hız ve konumu birbirinin arasına yerleştirerek daha kararlı sonuç verir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th style="text-align: right">Kolaylık</th>
      <th style="text-align: right">Kararlılık</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Euler</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Düşük</td>
      <td>Eğitim ve hızlı prototip</td>
    </tr>
    <tr>
      <td>Leapfrog</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Yüksek</td>
      <td>Yörünge simülasyonları</td>
    </tr>
    <tr>
      <td>Runge-Kutta 4</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Yüksek</td>
      <td>Hassas kısa süreli hesaplar</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-temel-uygulama">Python ile temel uygulama</h2>

<p>Aşağıdaki kod, iki boyutlu bir sistemde bütün cisimlerin ivmelerini hesaplar ve Leapfrog adımı uygular:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">G</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="n">EPS</span> <span class="o">=</span> <span class="mf">0.01</span>
<span class="n">DT</span> <span class="o">=</span> <span class="mf">0.001</span>

<span class="k">def</span> <span class="nf">accelerations</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">mass</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">mass</span><span class="p">)</span>
    <span class="n">acc</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros_like</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">j</span><span class="p">:</span>
                <span class="k">continue</span>

            <span class="n">delta</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">pos</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">distance2</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">dot</span><span class="p">(</span><span class="n">delta</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="n">EPS</span><span class="o">**</span><span class="mi">2</span>
            <span class="n">acc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">G</span> <span class="o">*</span> <span class="n">mass</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">delta</span> <span class="o">/</span> <span class="n">distance2</span><span class="o">**</span><span class="mf">1.5</span>

    <span class="k">return</span> <span class="n">acc</span>

<span class="k">def</span> <span class="nf">leapfrog_step</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">vel</span><span class="p">,</span> <span class="n">mass</span><span class="p">):</span>
    <span class="c1"># Hızı yarım adım ilerlet.
</span>    <span class="n">acc</span> <span class="o">=</span> <span class="nf">accelerations</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">mass</span><span class="p">)</span>
    <span class="n">vel</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">DT</span> <span class="o">*</span> <span class="n">acc</span>

    <span class="c1"># Yeni hızla konumu tam adım ilerlet.
</span>    <span class="n">pos</span> <span class="o">+=</span> <span class="n">DT</span> <span class="o">*</span> <span class="n">vel</span>

    <span class="c1"># Yeni konumdaki ivmeyle hız adımını tamamla.
</span>    <span class="n">acc</span> <span class="o">=</span> <span class="nf">accelerations</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">mass</span><span class="p">)</span>
    <span class="n">vel</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">DT</span> <span class="o">*</span> <span class="n">acc</span>
    <span class="k">return</span> <span class="n">pos</span><span class="p">,</span> <span class="n">vel</span>

<span class="n">mass</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">1000.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">])</span>
<span class="n">pos</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="o">-</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">]])</span>
<span class="n">vel</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">31.6</span><span class="p">],</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">25.8</span><span class="p">]])</span>

<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
    <span class="n">pos</span><span class="p">,</span> <span class="n">vel</span> <span class="o">=</span> <span class="nf">leapfrog_step</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">vel</span><span class="p">,</span> <span class="n">mass</span><span class="p">)</span>
</code></pre></div></div>

<p>İç içe döngüler nedeniyle hesaplama maliyeti $O(N^2)$ olur: cisim sayısı iki katına çıktığında etkileşim sayısı yaklaşık dört kat artar. Binlerce cisim için Barnes–Hut algoritması, uzaktaki cisimleri gruplandırarak maliyeti yaklaşık $O(N\log N)$ seviyesine indirebilir.</p>

<p>Sonuçları değerlendirirken yalnızca güzel yörüngelere bakmak yeterli değildir. Toplam enerji ve momentum yaklaşık korunmalıdır. Enerji sürekli artıyor veya azalıyorsa zaman adımı fazla büyük olabilir. İşte N-cisim simülasyonunun temel sırrı budur: doğru fizik kadar, hatayı kontrol eden doğru sayısal yöntem de gerekir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="n-cisim" /><category term="python" /><category term="fizik" /><category term="simülasyon" /><category term="kütle-çekimi" /><category term="sayısal-analiz" /><summary type="html"><![CDATA[Gökyüzündeki hareketler ilk bakışta kusursuz bir saat mekanizması gibi görünür. Ancak sisteme üçüncü bir gök cismi eklendiğinde işler hızla kozmik bir bilardo masasına dönüşür! N-cisim problemi; yıldızların, gezegenlerin veya galaksilerin karşılıklı kütle çekimi altında nasıl hareket ettiğini bulmayı amaçlar. Genel bir analitik çözümü bulunmadığından bilgisayarlarla küçük zaman adımları hâlinde yaklaşık sonuçlar hesaplarız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/n-cisim-problemi-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/n-cisim-problemi-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Oyun Ekonomilerinin Karanlık Yüzü: Botlar ve Gölge Piyasalar</title><link href="https://program.sonsuz.us/posts/oyun-ekonomilerinin-karanlik-yuzu-botlar-ve-golge-piyasalar/" rel="alternate" type="text/html" title="Oyun Ekonomilerinin Karanlık Yüzü: Botlar ve Gölge Piyasalar" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/oyun-ekonomilerinin-karanlik-yuzu-botlar-ve-golge-piyasalar</id><content type="html" xml:base="https://program.sonsuz.us/posts/oyun-ekonomilerinin-karanlik-yuzu-botlar-ve-golge-piyasalar/"><![CDATA[<p>Bir oyunda saatlerce uğraşıp kazandığınız kılıcın gerçek dünyada bir akşam yemeğinden daha pahalı olduğunu düşünün. Kulağa eğlenceli gelse de sanal eşyaların gerçek para karşılığında satılması; botlardan dolandırıcılığa, enflasyondan hesap hırsızlığına uzanan paralel bir ekonomi oluşturuyor. Üstelik bu ekonomide merkez bankasının yerini oyun geliştiricileri, fabrikaların yerini ise hiç yorulmadan çalışan yazılımlar alıyor.
``</p>

<h2 id="sanal-ekonomi-nasıl-gerçek-değere-dönüşür">Sanal ekonomi nasıl gerçek değere dönüşür?</h2>

<p>Bir oyun eşyasının fiyatı yalnızca görünüşünden doğmaz. Nadirlik, üretim maliyeti, oyuncu talebi, kullanım gücü ve transfer edilebilirlik değeri birlikte belirler. Basitleştirilmiş bir fiyat modeli şöyle kurulabilir:</p>

\[P = D \times R \times U - S\]

<p>Burada $P$ tahmini fiyatı, $D$ talebi, $R$ nadirlik katsayısını, $U$ kullanım faydasını ve $S$ piyasadaki arzı temsil eder. Eşya ne kadar nadir ve kullanışlıysa fiyat yükselir; botlar arzı artırdığında ise fiyat düşme eğilimine girer.</p>

<p>Gerçek para ticareti ya da yaygın adıyla <strong>RMT</strong>, oyuncuların altın, hesap, kozmetik eşya veya güçlendirme hizmetlerini oyun dışındaki kanallarda alıp satmasıdır. Bazı oyunlar bunu resmî pazarlarla denetlerken bazıları tamamen yasaklar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Resmî pazar</th>
      <th>Gölge piyasa</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Denetim</td>
      <td>Geliştirici tarafından yapılır</td>
      <td>Genellikle yoktur</td>
    </tr>
    <tr>
      <td>Ödeme güvenliği</td>
      <td>Görece yüksektir</td>
      <td>Ters ibraz ve dolandırıcılık riski taşır</td>
    </tr>
    <tr>
      <td>Fiyat şeffaflığı</td>
      <td>İşlem geçmişi bulunabilir</td>
      <td>Manipülasyona açıktır</td>
    </tr>
    <tr>
      <td>Hesap riski</td>
      <td>Kurallara bağlıdır</td>
      <td>Uzaklaştırma ihtimali yüksektir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/oyun-ekonomilerinin-karanlik-55.svg" alt="oyun-ekonomilerinin-karanlik-55" /></p>

<h2 id="ekonomi-botları-ne-yapar">Ekonomi botları ne yapar?</h2>

<p>Ekonomi botları; kaynak toplama, üretim yapma, açık artırma tarama veya tekrar eden görevleri tamamlama gibi işlemleri otomatikleştirir. İnsan oyuncu günde iki saat çalışırken botun günün büyük bölümünde etkin kalması dengesiz bir üretim avantajı doğurur.</p>

<p>Bir oyuncunun saatlik üretimi $g$, çalışma süresi $t$ ve hesap sayısı $n$ olsun. Toplam üretim yaklaşık olarak:</p>

\[G = g \times t \times n\]

<p>şeklinde hesaplanabilir. Normal oyuncuda $t=2$ ve $n=1$ olabilirken bir bot ağı çok daha yüksek değerlere ulaşabilir. Sonuç; para arzının büyümesi, temel ürünlerin pahalanması ve emeğin değersizleşmesidir. Yani ejderhadan kaçarken enflasyona yakalanabilirsiniz.</p>

<h2 id="şüpheli-davranış-nasıl-incelenir">Şüpheli davranış nasıl incelenir?</h2>

<p>Geliştiriciler tek bir ölçüte bakarak karar vermemelidir. Kesintisiz çalışma süresi, kusursuz tekrar aralıkları, olağan dışı transferler ve aynı rotanın yüzlerce kez izlenmesi birlikte değerlendirilir. Aşağıdaki Python örneği yalnızca eğitim amaçlı basit bir risk puanı üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">risk_puani</span><span class="p">(</span><span class="n">aktif_saat</span><span class="p">,</span> <span class="n">tekrar_orani</span><span class="p">,</span> <span class="n">transfer_miktari</span><span class="p">):</span>
    <span class="n">puan</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">if</span> <span class="n">aktif_saat</span> <span class="o">&gt;</span> <span class="mi">16</span><span class="p">:</span>
        <span class="n">puan</span> <span class="o">+=</span> <span class="mi">35</span>  <span class="c1"># İnsan dışı çalışma süresi ihtimali
</span>    <span class="k">if</span> <span class="n">tekrar_orani</span> <span class="o">&gt;</span> <span class="mf">0.95</span><span class="p">:</span>
        <span class="n">puan</span> <span class="o">+=</span> <span class="mi">40</span>  <span class="c1"># Aşırı düzenli hareket örüntüsü
</span>    <span class="k">if</span> <span class="n">transfer_miktari</span> <span class="o">&gt;</span> <span class="mi">100_000</span><span class="p">:</span>
        <span class="n">puan</span> <span class="o">+=</span> <span class="mi">25</span>  <span class="c1"># Olağan dışı ekonomik hareket
</span>
    <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="n">puan</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">risk_puani</span><span class="p">(</span><span class="mi">19</span><span class="p">,</span> <span class="mf">0.98</span><span class="p">,</span> <span class="mi">150_000</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu yaklaşım doğrudan ceza vermek için yeterli değildir. Erişilebilirlik araçları kullanan veya uzun süre oyun oynayan gerçek kişiler yanlışlıkla işaretlenebilir. Bu nedenle davranış analizi, insan incelemesi ve itiraz mekanizması birlikte kullanılmalıdır.</p>

<h2 id="gölge-piyasaların-görünmeyen-bedeli">Gölge piyasaların görünmeyen bedeli</h2>

<p>Kayıt dışı satışlar yalnızca oyun dengesini bozmaz. Çalınmış hesaplar, sahte ödeme bağlantıları, zararlı yazılımlar ve ödeme iptalleri oyuncuları gerçek maddi kayıplarla karşılaştırabilir. Ayrıca satıcıların elde ettiği sanal varlıkların kaynağı belirsiz olduğundan para aklama ve vergi sorunları da gündeme gelebilir.</p>

<p>Sağlıklı bir oyun ekonomisi için geliştiriciler işlem günlüklerini analiz etmeli, para muslukları ile para yutaklarını dengelemeli ve güvenli ticaret seçenekleri sunmalıdır. Oyuncular ise platform dışı tekliflere, özellikle de piyasanın çok altındaki fiyatlara şüpheyle yaklaşmalıdır. Sanal bir kılıç piksellerden oluşabilir; fakat çevresinde kurulan ekonomi son derece gerçektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun ekonomisi" /><category term="ekonomi botları" /><category term="sanal eşyalar" /><category term="gölge piyasa" /><category term="siber güvenlik" /><category term="oyun geliştirme" /><summary type="html"><![CDATA[Bir oyunda saatlerce uğraşıp kazandığınız kılıcın gerçek dünyada bir akşam yemeğinden daha pahalı olduğunu düşünün. Kulağa eğlenceli gelse de sanal eşyaların gerçek para karşılığında satılması; botlardan dolandırıcılığa, enflasyondan hesap hırsızlığına uzanan paralel bir ekonomi oluşturuyor. Üstelik bu ekonomide merkez bankasının yerini oyun geliştiricileri, fabrikaların yerini ise hiç yorulmadan çalışan yazılımlar alıyor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/oyun-ekonomilerinin-karanlik-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/oyun-ekonomilerinin-karanlik-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Oyun Fiziğinde Clipping: Nesneler Duvarlardan Neden Geçer?</title><link href="https://program.sonsuz.us/posts/oyun-fiziginde-clipping-nesneler-duvarlardan-neden-gecer/" rel="alternate" type="text/html" title="Oyun Fiziğinde Clipping: Nesneler Duvarlardan Neden Geçer?" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/oyun-fiziginde-clipping-nesneler-duvarlardan-neden-gecer</id><content type="html" xml:base="https://program.sonsuz.us/posts/oyun-fiziginde-clipping-nesneler-duvarlardan-neden-gecer/"><![CDATA[<p>Bir merminin duvara çarpması gerekirken öbür tarafta belirmesi, karakterin zemine gömülmesi veya kutuların üst üste binerek titremesi yalnızca görsel birer aksilik değildir. Bu davranışlar, gerçek dünyadaki sürekli hareketin bilgisayarda ayrık zaman adımlarıyla taklit edilmesinden kaynaklanır. Fizik motoru kusursuz bir kâhin değil; nesnelerin geleceğini küçük aralıklarla hesaplayan, bazen de aradaki önemli olayları kaçıran çalışkan bir muhasebecidir.
``</p>

<h2 id="simülasyon-neden-sürekli-değildir">Simülasyon neden sürekli değildir?</h2>

<p>Gerçek dünyada bir nesnenin konumu zamanla kesintisiz değişir. Oyunlarda ise fizik motoru konumu belirli aralıklarla günceller. Basit Euler integrasyonunda yeni konum yaklaşık olarak şöyle hesaplanır:</p>

\[x_{yeni} = x_{eski} + v · Δt\]

<p>Burada $v$ hız, $Δt$ ise fizik adımının süresidir. Hızı 100 m/s olan bir mermi, $Δt = 0.02$ saniyelik adımda tek güncellemede 2 metre ilerler. Duvar yalnızca 20 santimetre kalınlığındaysa mermi bir karede duvarın önünde, sonraki karede arkasında olabilir. Motor sadece iki konumu kontrol ediyorsa çarpışmayı hiç görmez. Bu olaya genellikle <strong>tunneling</strong>, sonucunda oluşan görsel probleme ise <strong>clipping</strong> denir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Çalışma biçimi</th>
      <th>Avantajı</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ayrık çarpışma</td>
      <td>Yalnızca mevcut konumdaki örtüşmeyi test eder</td>
      <td>Hızlıdır</td>
      <td>Hızlı nesneleri kaçırabilir</td>
    </tr>
    <tr>
      <td>Sürekli çarpışma</td>
      <td>Önceki ve yeni konum arasını tarar</td>
      <td>Tunneling azalır</td>
      <td>Daha pahalıdır</td>
    </tr>
    <tr>
      <td>Alt adımlama</td>
      <td>Bir fizik adımını küçük parçalara böler</td>
      <td>Simülasyonu kararlı kılar</td>
      <td>CPU maliyetini artırır</td>
    </tr>
    <tr>
      <td>Işın veya şekil taraması</td>
      <td>Hareket yolu boyunca engel arar</td>
      <td>Mermiler için etkilidir</td>
      <td>Ek uygulama mantığı ister</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/oyun-fiziginde-clipping-42.svg" alt="oyun-fiziginde-clipping-42" /></p>

<h2 id="tek-suçlu-yüksek-hız-değil">Tek suçlu yüksek hız değil</h2>

<p>Clipping hatalarının birkaç suç ortağı vardır:</p>

<ul>
  <li><strong>Büyük zaman adımı:</strong> $Δt$ büyüdükçe nesnenin tek adımda aldığı mesafe artar.</li>
  <li><strong>İnce collider:</strong> Duvarın çarpışma hacmi ne kadar inceyse atlanması o kadar kolaydır.</li>
  <li><strong>Yetersiz çözücü iterasyonu:</strong> Üst üste giren gövdeleri ayıran solver yeterince çalışmazsa nesneler gömülü kalabilir.</li>
  <li><strong>Doğrudan Transform değiştirmek:</strong> Fizik gövdesini motorun hareket API’si yerine ışınlanmış gibi taşımak, hız ve temas hesaplarını bozar.</li>
  <li><strong>Kayan nokta hassasiyeti:</strong> Dünya merkezinden çok uzakta küçük konum farkları duyarlılığını kaybeder.</li>
  <li><strong>Aşırı kütle farkı:</strong> Çok hafif ve çok ağır cisimlerin teması çözücüyü zorlayabilir.</li>
</ul>

<p>Sayısal kararlılık açısından önemli oran, nesnenin bir adımda aldığı mesafenin engel kalınlığına oranıdır:</p>

\[r = (\vert v\vert  · Δt) / d\]

<p>$d$ engel kalınlığıdır. $r &gt; 1$ olduğunda nesne tek adımda engelin tamamını aşabilir. Bu kesin bir hata garantisi değildir ancak parlak bir alarm lambasıdır.</p>

<h2 id="unity-ile-hareket-yolunu-taramak">Unity ile hareket yolunu taramak</h2>

<p>Aşağıdaki örnek, hızlı bir küreyi taşımadan önce gideceği yönde <code class="language-plaintext highlighter-rouge">SphereCast</code> uygular. Böylece yalnızca hedef konum değil, iki konum arasındaki yol da denetlenir:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">UnityEngine</span><span class="p">;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">SafeProjectile</span> <span class="p">:</span> <span class="n">MonoBehaviour</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">speed</span> <span class="p">=</span> <span class="m">80f</span><span class="p">;</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">radius</span> <span class="p">=</span> <span class="m">0.1f</span><span class="p">;</span>

    <span class="k">void</span> <span class="nf">FixedUpdate</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Vector3</span> <span class="n">direction</span> <span class="p">=</span> <span class="n">transform</span><span class="p">.</span><span class="n">forward</span><span class="p">;</span>
        <span class="kt">float</span> <span class="n">distance</span> <span class="p">=</span> <span class="n">speed</span> <span class="p">*</span> <span class="n">Time</span><span class="p">.</span><span class="n">fixedDeltaTime</span><span class="p">;</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">Physics</span><span class="p">.</span><span class="nf">SphereCast</span><span class="p">(</span><span class="n">transform</span><span class="p">.</span><span class="n">position</span><span class="p">,</span> <span class="n">radius</span><span class="p">,</span> <span class="n">direction</span><span class="p">,</span>
                               <span class="k">out</span> <span class="n">RaycastHit</span> <span class="n">hit</span><span class="p">,</span> <span class="n">distance</span><span class="p">))</span>
        <span class="p">{</span>
            <span class="n">transform</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="n">hit</span><span class="p">.</span><span class="n">point</span> <span class="p">-</span> <span class="n">direction</span> <span class="p">*</span> <span class="n">radius</span><span class="p">;</span>
            <span class="n">Debug</span><span class="p">.</span><span class="nf">Log</span><span class="p">(</span><span class="s">"Çarpılan nesne: "</span> <span class="p">+</span> <span class="n">hit</span><span class="p">.</span><span class="n">collider</span><span class="p">.</span><span class="n">name</span><span class="p">);</span>
            <span class="nf">Destroy</span><span class="p">(</span><span class="n">gameObject</span><span class="p">);</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">transform</span><span class="p">.</span><span class="n">position</span> <span class="p">+=</span> <span class="n">direction</span> <span class="p">*</span> <span class="n">distance</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Raycast</code> yerine <code class="language-plaintext highlighter-rouge">SphereCast</code> kullanılması, hacmi olan merminin kenardan temaslarını daha güvenilir yakalar. Fizik tabanlı bir gövde kullanılıyorsa doğrudan <code class="language-plaintext highlighter-rouge">Transform</code> taşımak yerine <code class="language-plaintext highlighter-rouge">Rigidbody.MovePosition</code>, hız veya kuvvet yöntemleri tercih edilmelidir. Motorun sunduğu <strong>Continuous Dynamic</strong> gibi sürekli çarpışma seçenekleri de hızlı gövdelerde etkinleştirilebilir.</p>

<h2 id="dengeli-çözüm-nasıl-seçilir">Dengeli çözüm nasıl seçilir?</h2>

<p>Her nesneye en pahalı çarpışma modunu vermek doğru değildir. Yavaş dekor kutularında ayrık algılama yeterliyken mermiler, hızlı araçlar ve oyuncu karakterleri daha dikkatli ele alınmalıdır. Sabit fizik adımını küçültmek doğruluğu artırır fakat saniyedeki hesap sayısını yükseltir. Bu nedenle kritik nesnelerde sürekli algılama, çok hızlı mühimmatta şekil taraması ve büyük dünyalarda kayan başlangıç noktası yaklaşımı kullanılabilir.</p>

<p>Kısacası clipping, fizik motorunun “duvarları sevmemesi” değil, zaman ve konumu örnekleme biçiminin doğal sonucudur. Hız, zaman adımı, collider kalınlığı ve çözücü ayarları birlikte değerlendirildiğinde hayalet mermiler azalır; duvarlar da yeniden duvar gibi davranmaya başlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun fiziği" /><category term="clipping" /><category term="çarpışma algılama" /><category term="unity" /><category term="simülasyon" /><category term="kararlılık" /><summary type="html"><![CDATA[Bir merminin duvara çarpması gerekirken öbür tarafta belirmesi, karakterin zemine gömülmesi veya kutuların üst üste binerek titremesi yalnızca görsel birer aksilik değildir. Bu davranışlar, gerçek dünyadaki sürekli hareketin bilgisayarda ayrık zaman adımlarıyla taklit edilmesinden kaynaklanır. Fizik motoru kusursuz bir kâhin değil; nesnelerin geleceğini küçük aralıklarla hesaplayan, bazen de aradaki önemli olayları kaçıran çalışkan bir muhasebecidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/oyun-fiziginde-clipping-42.png" /><media:content medium="image" url="https://program.sonsuz.us/img/oyun-fiziginde-clipping-42.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>