Sitemap
Nazciftci

Nazciftci

Küçük Bir Döngü Manipülasyonu: Sonsuz Oyun

3 min readAug 13, 2025

Çok tanıdık yapıya sahip iki fonksiyon arasında küçük ama etkili bir fark sayesinde, elimizdeki bir oyunu nasıl sonsuz bir döngüye sokabileceğimizi ve bu farkı oluşturmak için neleri gözden geçirdiğimi sizinle paylaşacağım. Öncelikle yılan oyunumuzun akışını diyagram üzerinden inceleyelim:

Press enter or click to view image in full size
  1. Başlangıç:
  • Zaman tabanlı random sayı üreticisi başlatılır.
  • Para konumlandırılır. (put_money())
  • Oyun alanı ekrana çizdirilir. (output())
  • Oyun döngüsü başlar.
  • Oyun Döngüsü:
  • Oyun durumu kontrol edilir. (game == 0 ise oyun biter)
  • Kullanıcıdan klavye girişi beklenir.
  • Girişe göre yılan hareket ettirilir:
  • ‘w’: Yukarı (direction=1)
  • ‘s’: Aşağı (direction=2)
  • 'a': Sol (yön=3)
  • ‘d’: Sağ (direction=4)
  • Eğer yılan yiyecek yediyse (eaten == 1) yeni yiyecek konumlandırılır.
  • Oyun alanı yeniden çizdirilir.
  • Döngü devam eder.

Oyun Sonu:

  • gamedeğişkeni 0 olduğunda oyun biter.
  • gameover()fonksiyonu çağrılır.
  • Program sonlanır.
Press enter or click to view image in full size

Durumumuz neredeyse birebir aynı olan assembly kod parçalarını ele almakla başlıyor. Kodumuzda main() fonksiyonundan bir karakter girdisi alarak (“w” , “a” , “s” ,”d“), snakeMove() fonksiyonlarını çağırıyor. Ancak iki kodun davranışında bir farklılık var: Biri oyun bittiğinde çıkıyor ve “Game Over” şeklinde bir çıktımız oluyor. Diğeri ise kendine de çarpsa veya duvara da çarpsa sonsuz bir döngüye giriyor. Öyleyse bunu sağlayan birkaç byte’ı kapsayan değişikliği inceleyelim.

Get Nazciftci’s stories in your inbox

Join Medium for free to get updates from this writer.

Asıl fark döngü devamının şartlarını kontrol ettiğimiz satırda başlıyor:

0010127a 0f 85 4b ff ff ff → JNZ LAB_001011cb
Press enter or click to view image in full size

Buradaki klasik kontrol mekanizması game değişkeni sıfır değilse (JNZ), döngü devam ediyor, ancak sıfıra eşit ise gameover() fonksiyonu çağrılıyor ve main fonksiyonu sona eriyor. Yani oyunun son bulması bir şarta bağlı. Düşünme aşamasına gelirsek bu şartı kaldırmam halinde sonsuz döngüye gireceğinden JNZ(bkz.) komutunu değiştirme fikrini hayata geçirdim.

Hali hazırda bulunan assembly komutunu aşağıdaki hale getiriyorum:

0010127  a e9 4 c ff ff ff → JMP LAB_001011cb
Press enter or click to view image in full size

Aradığımız değişikliği tam olarak burada buluyoruz. İlk kod koşullu sıçrama yaparken, ikinci kod bloğunda JMP(bkz.) koşulsuz sıçrama yapılmasını sağlıyoruz.

Press enter or click to view image in full size
Devre dışı bırakılan fonksiyonun flowchart üzerinde gösterilmiş hali

Bu küçük komut değişikliği sayesinde kodun değiştirilmiş versiyonunda game değişkeni değeri ne olursa olsun döngü asla sona ermiyor. Çünkü JMP doğrudan LAB_001011cb etiketine geri dönüyor. Böylece hangi tuşuna basılırsa basılsın game değişkeni ne olursa olsun oyun sonsuz şekilde devam edecek ve yılanımız ölümsüz olmuş olacak.

Press enter or click to view image in full size
Oyunun normal hali ve değiştirilmiş halini bir de oyun oynanırken görelim.

--

--