Ana Başlık 2. Durum Makinesi Kavramı ve Geçişler

Amaç: Oyun durumunu saklama, duruma göre çizim/girdi ve geçiş kurallarıyla durum makinesi modelini kurmak.

Öğrenme Çıktıları:

Anahtar Sözcükler: durum makinesi, state, geçiş, menü, oyunDurumu

Giriş

Çarpışma ve hareket “oyun içi” davranışı kurar; ama bir ürün menü, oynanış ve bitiş ekranı arasında geçiş de ister. Bunları if yığınıyla dağınık yazmak yerine durum makinesi (state machine) modeli kullanılır: sistem her anda tek bir durumda bulunur; olaylar belirli geçişleri tetikler.

Durum bir değişkende saklanır ("menu", "oyun", "bitti"). draw ve girdi işleyicileri duruma göre dallanır. Geçiş kuralları “hangi olay hangi yeni duruma götürür?” sorusunu tablolaştırır. Bu ana başlık modeli ve kuralları kurar; menü–oyun–bitiş’in tam akışlı mini oyunu bir sonraki ana başlıkta tamamlanır. Bundan sonra gelen alt başlıklarda önce veri modeli, sonra hamle kuralı, en sonda çizim ve etkileşim kurulur. Her yeni fonksiyon mümkün olduğunca küçük bir örnekte çalıştırılır; böylece hatanın kaynağı daha kolay bulunur. Anlatımda önce ilgili yapının ne işe yaradığı açıklanır, ardından kod satır satır okunur. Terimler ilk geçtikleri yerde kısa bir tanımla verilir; gerekirse tablo veya görsel ile desteklenir. Örnek sketch’ler tek bir mekaniğe odaklanır; böylece yan konular okumayı dağıtmaz. Parametreleri değiştirip yeniden çalıştırmak, kuralın sınırını görmenin en hızlı yoludur.

2.1. Durum Makinesi Kavramı

Tanım: Durum makinesi (state machine) — Sistemin (oyunun) her an yalnızca bir durumda olduğu; belirli olaylar (tuş, tıklama, süre, çarpışma) ile başka durumlara geçiş yapabildiği yapıdır.

Bu ana başlığın omurgası üç durumludur — menü, oyun, bitiş:

Tablo 1.

Durum Ekranda ne görünür? Girdi ne işe yarar?
Menü Başlık, “Başla” talimatı SPACE → oyunu başlat
Oyun Oyuncu, hedef/top, skor WASD hareket; çarpışma → bitiş
Bitiş Skor, “Tekrar dene” R → menüye dön

Durum = oyunun aşaması. Geçiş (transition) = bir olay gerçekleşince durum değişkeninin güncellenmesi (oyunDurumu = DURUM_BITIS gibi).

Görsel 1. Durum makinesi — menü, oyun, bitiş geçişleri (SPACE, çarpışma, R)
Görsel 1. Durum makinesi — menü, oyun, bitiş geçişleri (SPACE, çarpışma, R)

Görsel 1, üç durumun birbirine nasıl bağlandığını özetler: menüden SPACE ile oyuna, çarpışma ile bitişe, R ile tekrar menüye. Menüde WASD veya bitişte SPACE yok sayılır — olay yalnızca o durum için tanımlıysa geçiş olur.

Ayrı boolean'ların riski küçük bir örnekle netleşir: menuAcik = true ve oyunAcik = true aynı anda olursa draw() aynı frame'de hem menüyü hem sahneyi çizebilir; girdi hangi bloğa gideceği belirsizleşir. Tek oyunDurumu değişkeninde ise her an yalnızca bir değer vardır; geçiş tek atama satırıdır.

Önceki bölümlerdeki oyunBitti boolean'ı aslında iki durumlu mini bir makinedir: oynuyor / bitti. Üç veya daha fazla aşama için string veya sabit kullanmak okunabilirliği artırır:

Tablo 2.

Yaklaşım Örnek Ne zaman yeterli?
Tek boolean oyunBitti Yalnızca devam / bitti
String durum "menu", "oyun", "bitis" Birkaç aşamalı akış
Ayrı boolean'lar menuAcik, oyunAcik Önerilmez — çakışma riski

Bilgi — bilgisayar biliminde yeri: Durum makinesi yalnızca oyun deseni değildir. Bilgisayar biliminde sonlu durum makinesi (finite state machine, FSM) biçimsel bir modeldir: sınırlı sayıda durum, olaylarla tanımlı geçişler. Derleyiciler, ağ protokolleri, arayüz ekranları ve gömülü sistemler aynı fikri kullanır. Bu kitapta otomat teorisinin matematiğine girilmez; menü–oyun–bitiş diyagramı ile aynı aileye ait pratik sürüm yeterlidir.

Bilgi: Robert Nystrom'un Game Programming Patterns kitabındaki State bölümü, durum makinesini oyun mimarisinde ayrıntılı ele alır: https://gameprogrammingpatterns.com/state.html — bu kitapta yalnızca string tabanlı basit sürüm kullanılacaktır.

Bilgi — nesne yönelimli tasarımla ilişkisi: Durum makinesi, nesne yönelimli tasarıma (OOP) çok uygundur. Durum sayısı arttıkça draw() içindeki if / else if zinciri uzar; OOP yaklaşımında her durum ayrı bir sınıf olur, kendi guncelle() ve ciz() metotlarını taşır, geçiş ise aktif durum nesnesini değiştirmeye indirgenir. Nystrom'un anlattığı State deseni budur. Sınıflar ve kalıtım İleri Teknikler kitabında işlendiğinde durum diyagramı konusuna bu açıdan yeniden dönülecektir; şimdilik string sabitli sürüm hem yeterli hem de okunması kolaydır.

Günlük hayattan basit örnekler

Durum makinesi kavramı oyun programlamasına özgü değildir; aşağıdaki üç örnek de üç durumlu iskelet gösterir — tıpkı menü/oyun/bitiş gibi. Trafik ışığında kırmızıdan yeşile doğrudan geçilmez; önce sarı, sonra yeşil, ardından yine sarı, yeniden kırmızı gelir. Turnikede kart okutulunca önce doğrulama beklenir; kart geçersizse veya kimse geçmeden 5 sn dolarsa sistem Kilitli'ye döner. Medya oynatıcıda play ile Çalıyor, pause ile Duraklatıldı'ya geçilir; stop veya şarkı bitince Durduruldu'ya dönülür. Ortak nokta: sistem bir anda tek durumdadır ve yalnızca somut bir olay olunca başka duruma geçer.

Bu üç örneğin diyagramları biraz aşağıda, Mermaid anlatıldıktan hemen sonra gelir.

Durum diyagramını kendiniz çizmek

Diyagramda kutular = durumlar, oklar = geçişler, ok yazısı = olay (SPACE, çarpışma, R…). Kâğıt yeterlidir; dijital için de ücretsiz araçlar vardır.

Mermaid, diyagramı düz metin satırlarıyla tanımlamanızı sağlayan bir notasyondur. Metni Mermaid Live Editor adresine yapıştırdığınızda şekil otomatik oluşur; kaynak metin dosyada saklanabildiği için Git gibi sürüm kontrolüne de uygundur. Yapay zekâya geçiş tablonuzu verip “bunu stateDiagram-v2 olarak yaz” demek yaygındır; çıkan metni mutlaka Live Editor’da açıp okları kontrol edin (YZ bazen hatalı sözdizimi üretir). Ok veya kutu renkleri gibi görünüm isteklerini de YZ’ye sorabilirsiniz — bunun için aşağıdaki Mermaid YZ etkinliğindeki makyaj adımına bakın.

Kod bloğu: Basit durum diyagramı (Mermaid) — menü / oyun / bitiş.

Kod 1.

text
stateDiagram-v2  [*] --> menu  menu --> oyun : SPACE  oyun --> bitis : carpisma  bitis --> menu : R

Satır satır mantık:

Tablo 3.

Satır Anlam
stateDiagram-v2 Bu bir durum diyagramıdır (Mermaid sözdizimi sürümü)
[*] --> menu Siyah nokta ([*]) = başlangıç; sketch açılınca ilk durum menu
menu --> oyun : SPACE menu iken SPACE olayı → oyun durumuna geç
oyun --> bitis : carpisma oyun iken çarpışma → bitis
bitis --> menu : R bitis iken R → yeniden menu

A --> B : olay kalıbında sol durum, sağ durum, iki nokta sonrası ok etiketidir. Bu metin, p5.js’teki oyunDurumu = DURUM_OYUN atamalarının görsel özetidir; diyagram kod yazmaz, yalnızca geçiş kurallarını resmeder.

Görsel 2. Mermaid stateDiagram — kaynak metin ve üretilen diyagram
Görsel 2. Mermaid stateDiagram — kaynak metin ve üretilen diyagram

Görsel 2 solda aynı Mermaid kodunu, sağda canlı editörde oluşacak çıktıya benzer bir diyagramı gösterir. Resmi sözdizimi: State diagrams — Mermaid.

Diğer çevrimiçi araçlar (sürükle-bırak):

Tablo 4.

Araç Adres Not
diagrams.net (draw.io) https://app.diagrams.net Genel diyagram; durum kutusu + ok
Excalidraw https://excalidraw.com El çizimi hissi; hızlı taslak
Mermaid Live https://mermaid.live Metinden otomatik şekil

Bilgi: Ödev veya defter için önce Mermaid veya kâğıtta üç kutu + üç ok yeterlidir. Amaç sanat değil; “hangi olay hangi duruma götürür?” sorusunu tek bakışta yanıtlamaktır. Kod yazarken bu diyagram, keyPressed() ve draw() dallarının kontrol listesi olur.

Yukarıdaki günlük hayat örneklerinin Mermaid karşılıkları (her birinde önce kod, sonra diyagram):

Kod bloğu: Trafik ışığı (Mermaid).

Kod 2.

text
stateDiagram-v2  direction LR  [*] --> kirmizi  kirmizi: Kırmızı  sari: Sarı  yesil: Yeşil  kirmizi --> sari : 20 sn bekle  sari --> yesil : 3 sn bekle  yesil --> sari : 25 sn bekle  sari --> kirmizi : 3 sn bekle

Görsel 3. Trafik ışığı durum diyagramı (Mermaid)
Görsel 3. Trafik ışığı durum diyagramı (Mermaid)

Görsel 3, üç renkli döngüdür: Kırmızı → Sarı → Yeşil → Sarı → Kırmızı. Kırmızıdan yeşile doğrudan ok yok; sarı hem yeşile hazırlık hem kırmızıya uyarı rolündedir. Geçişler süre dolmasıyla olur (ör. 20 / 3 / 25 / 3 sn).

Kod bloğu: Turnike / geçiş kapısı (Mermaid).

Kod 3.

text
stateDiagram-v2  direction LR  [*] --> kilitli  kilitli: Kilitli  dogrulaniyor: Doğrulanıyor  acik: Açık  kilitli --> dogrulaniyor : kart okutuldu  dogrulaniyor --> acik : kart geçerli  dogrulaniyor --> kilitli : kart geçersiz  acik --> kilitli : geçildi  acik --> kilitli : 5 sn içinde geçilmedi

Görsel 4. Turnike durum diyagramı (Mermaid)
Görsel 4. Turnike durum diyagramı (Mermaid)

Görsel 4, turnike örneğidir: kart okutuldu → doğrulanıyor → geçerliyse Açık; geçersizse veya süre dolarsa doğrudan Kilitli'ye döner. Turnikeye itmek başlı başına bir olay değildir — Kilitli iken hiçbir geçiş tanımlı olmadığı için sistem olduğu yerde kalır; menüde WASD'ın hiçbir şey yapmamasıyla aynı mantık.

Kod bloğu: Medya oynatıcı (Mermaid).

Kod 4.

text
stateDiagram-v2  direction LR  [*] --> durduruldu  durduruldu: Durduruldu  calisiyor: Çalıyor  duraklatildi: Duraklatıldı  durduruldu --> calisiyor : play tıklandı  calisiyor --> duraklatildi : pause tıklandı  duraklatildi --> calisiyor : play tıklandı  calisiyor --> durduruldu : stop / şarkı bitti  duraklatildi --> durduruldu : stop tıklandı

Görsel 5. Medya oynatıcı durum diyagramı (Mermaid)
Görsel 5. Medya oynatıcı durum diyagramı (Mermaid)

Görsel 5, üç durumludur: Durduruldu ↔ Çalıyor ↔ Duraklatıldı. Menü / oyun / bitiş iskeletine doğrudan oturur; DURUM_DURAKLAT eklemek istediğinizde de aynı kalıp kullanılır — yeni sabit, yeni geçiş satırları.

Başka oyunlardan örnekler

Aynı omurga başka türlerde de görülür. Geçiş sütununda durum adları aynen kullanılır: “Şu durum iken şu olursa → bu durum”.

Tablo 5.

Örnek Durumlar (o anda ne olur?) Geçişler
Satranç (sıra tabanlı) Beyazın sırası: yalnızca beyaz taş oynanır. Siyahın sırası: yalnızca siyah. Oyun bitti: mat/pat; hamle kabul edilmez. • Beyazın sırası iken hamle oyunu bitirmiyorsa → Siyahın sırası
• Beyazın sırası iken hamle mat veya pat üretirse → Oyun bitti
• Siyahın sırası iken hamle oyunu bitirmiyorsa → Beyazın sırası
• Siyahın sırası iken hamle mat veya pat üretirse → Oyun bitti
Hafıza kartları İlk kart: bir kapalı kart açılır; ikinci seçim beklenir. İkinci kart: başka bir kapalı kart açılır; iki yüz görünür. Eşleşme kontrolü: kısa bekleme; eşleşirse açık kalır, değilse kapanır. Bitti: tüm çiftler bulundu. • İlk kart iken kart açılırsa → İkinci kart
• İkinci kart iken kart açılırsa → Eşleşme kontrolü
• Eşleşme kontrolü iken kartlar eşleşmezse → İlk kart
• Eşleşme kontrolü iken eşleşme olur ama kapalı çift kalmışsa → İlk kart
• Eşleşme kontrolü iken son çift de eşleşirse → Bitti
Bilgi yarışması Soru: bir sorunun metni + şıklar + süre (10 veya 50 soruda da aynı durum). Cevap kontrolü: o sorunun doğru/yanlış geri bildirimi; şıklar kilitli. Sonuç: tüm sorular bitince toplam puan. • Soru iken şık seçilirse veya süre dolarsa → Cevap kontrolü
• Cevap kontrolü iken sonraki soru varsa → Soru
• Cevap kontrolü iken soru kalmadıysa → Sonuç
Tetris Parça düşüyor: oklarla hareket/döndürme. Satır temizleme: dolu satırlar silinirken kontrol kapalı. Oyun bitti: yeni parça doğduğu yere sığmaz (tepe dolmuştur). • Parça düşüyor iken parça yere oturur ve satır doluysa → Satır temizleme
• Satır temizleme iken animasyon biterse → Parça düşüyor
• Parça düşüyor iken parça yere oturur ve dolu satır yoksa → Parça düşüyor (yeni parça)
• Parça düşüyor iken yeni parça yerleştirilemezse → Oyun bitti
XOX (bir sonraki ana başlık) Menü: kurallar. X'in sırası: yalnızca X boş hücreye konur. O'nun sırası: yalnızca O konur. Bitiş: üçlü veya berabere. • Menü iken SPACE basılırsa → X'in sırası
• X'in sırası iken hamle oyunu bitirmiyorsa → O'nun sırası
• X'in sırası iken hamle üçlü yapar veya tahtayı doldurursa → Bitiş
• O'nun sırası iken hamle oyunu bitirmiyorsa → X'in sırası
• O'nun sırası iken hamle üçlü yapar veya tahtayı doldurursa → Bitiş
• Bitiş iken R basılırsa → Menü

XOX’ta X/O sırası kavramsal olarak ayrı durumdur; bir sonraki ana başlıkta bunlar tek DURUM_OYUN içinde sira = "X" / "O" değişkeniyle tutulur — menü/oyun/bitiş omurgası aynı kalır, sıra ise oyun içi alt bilgidir. Aşağıda ilk dört örneğin Mermaid diyagramları vardır.

Kod bloğu: Satranç (Mermaid).

Kod 5.

text
stateDiagram-v2  direction LR  [*] --> beyaz  beyaz: Beyazın sırası  siyah: Siyahın sırası  bitti: Oyun bitti  beyaz --> siyah : hamle (oyun sürüyor)  siyah --> beyaz : hamle (oyun sürüyor)  beyaz --> bitti : hamle mat veya pat  siyah --> bitti : hamle mat veya pat

Görsel 6. Satranç durum diyagramı (Mermaid)
Görsel 6. Satranç durum diyagramı (Mermaid)

Kod bloğu: Hafıza kartları (Mermaid).

Kod 6.

text
stateDiagram-v2  direction LR  [*] --> ilk  ilk: İlk kart  ikinci: İkinci kart  kontrol: Eşleşme kontrolü  bitti: Bitti  ilk --> ikinci : kart açıldı  ikinci --> kontrol : kart açıldı  kontrol --> ilk : eşleşmedi  kontrol --> ilk : eşleşti (çift kaldı)  kontrol --> bitti : tüm çiftler bulundu

Görsel 7. Hafıza kartları durum diyagramı (Mermaid)
Görsel 7. Hafıza kartları durum diyagramı (Mermaid)

Kod bloğu: Bilgi yarışması (Mermaid).

Kod 7.

text
stateDiagram-v2  direction LR  [*] --> soru  soru: Soru  kontrol: Cevap kontrolü  sonuc: Sonuç  soru --> kontrol : şık seçildi / süre doldu  kontrol --> soru : sonraki soru  kontrol --> sonuc : sorular bitti

Görsel 8. Bilgi yarışması durum diyagramı (Mermaid)
Görsel 8. Bilgi yarışması durum diyagramı (Mermaid)

Kod bloğu: Tetris (Mermaid).

Kod 8.

text
stateDiagram-v2  direction LR  [*] --> dusuyor  dusuyor: Parça düşüyor  temizle: Satır temizleme  bitti: Oyun bitti  dusuyor --> temizle : yere oturdu (satır dolu)  temizle --> dusuyor : animasyon bitti  dusuyor --> dusuyor : yere oturdu (satır yok)  dusuyor --> bitti : tepe doldu

Görsel 9. Tetris durum diyagramı (Mermaid)
Görsel 9. Tetris durum diyagramı (Mermaid)

Oyun döngüsünde (draw()) tipik akış:

  1. Mevcut durumu oku (oyunDurumu).
  2. Duruma göre güncelle (yalnızca "oyun" iken hareket, çarpışma).
  3. Duruma göre çiz (menü metni veya oyun sahnesi).
  4. Olay fonksiyonlarında (keyPressed) duruma göre geçiş uygula.

2.2. Oyun Durumunu Saklama

Durum değerleri genelde metin (string) olarak tutulur; yazım hatasını azaltmak için const sabitleri tanımlanır (önceki bölümlerde const HEDEF_SKOR örfü).

Kod 9.

javascript
const DURUM_MENU = "menu";const DURUM_OYUN = "oyun";const DURUM_BITIS = "bitis"; let oyunDurumu = DURUM_MENU;

Tablo 6.

Sabit Anlam
DURUM_MENU Başlangıç / ana menü
DURUM_OYUN Aktif oyun
DURUM_BITIS Oyun bitti ekranı

oyunDurumu değişkeni sketch boyunca güncellenir; setup() içinde başlangıç değeri atanır. Karşılaştırmalarda === kullanılır:

Kod 10.

javascript
if (oyunDurumu === DURUM_OYUN) {  // yalnızca oyun aşamasında çalışır}

Dikkat: Durum string'lerini doğrudan "menu" yazmak da mümkündür; sabitler aynı kelimenin farklı yerlerde tutarlı yazılmasını sağlar. "menü" ile "menu" farklı string'lerdir — karşılaştırma başarısız olur.

Bu tür bir yazım hatası, çalışma zamanında görünür bir hata mesajı üretmez; JavaScript, tanımsız bir string'i sessizce kabul eder ve karşılaştırma yalnızca false döner. Sonuç, oyunun beklenen durumdan çıkmaması ve nedeni belirsiz bir "hiçbir şey olmuyor" davranışıdır — örneğin SPACE tuşuna basıldığında oyun başlamaz, çünkü oyunDurumu === DURUM_MENU koşulu, DURUM_MENU sabiti yanlış yazıldığı için hiçbir zaman doğru olmaz. Sabit kullanmanın asıl kazancı budur: yazım hatası yapıldığında JavaScript, tanımsız bir değişken adı için (sabit tanımlanmamışsa) hata verir; bu da sorunu doğrudan işaret eder ve serbest metin string'lerinde olduğu gibi sessiz kalmaz.

Oyun verileri (skor, oyuncu konumu, top hızı) durumdan bağımsız değişkenlerde tutulabilir; yalnızca hangi kodun çalışacağı duruma bağlanır. Oyun başlarken konumları sıfırlamak için yardımcı fonksiyon kullanılabilir (önceki bölümler, fonksiyonlar):

Kod 11.

javascript
function oyunuSifirla() {  skor = 0;  oyuncuX = width / 2;  oyuncuY = height / 2;  topX = random(50, width - 50);  topY = 40;  hizX = random(-120, 120);  hizY = 80;}

random() önceki bölümlerde tanıtılmıştır; başlangıç top konumu ve hızı her turda farklı olabilir.

2.3. Duruma Göre Çizim ve Girdi

draw() içinde durum dallanması yaygın örüntüdür: her durum için ayrı çizim bloğu veya yardımcı fonksiyon.

Kod bloğu: Duruma göre draw() — iskelet.

Kod 12.

javascript
function draw() {  if (oyunDurumu === DURUM_MENU) {    cizMenu();  } else if (oyunDurumu === DURUM_OYUN) {    guncelleOyun();    cizOyun();  } else if (oyunDurumu === DURUM_BITIS) {    cizBitis();  }}

Tablo 7.

Fonksiyon Görev
cizMenu() Arka plan, başlık, talimat metni
guncelleOyun() Hareket, çarpışma, skor (yalnızca oyun aşaması)
cizOyun() Oyuncu, top, arayüz
cizBitis() Son skor, yeniden başlatma talimatı

Duruma göre hangi fonksiyonların çalıştığı özet tablo:

Tablo 8.

Durum draw() içinde keyPressed() Sürekli girdi (keyIsDown)
DURUM_MENU cizMenu() SPACE → oyuna geç Yok sayılır
DURUM_OYUN guncelleOyun() + cizOyun() — WASD / ok tuşları
DURUM_BITIS cizBitis() R → menüye dön Yok sayılır

Görsel 10. draw() — duruma göre dallanma ve ekran önizlemeleri
Görsel 10. draw() — duruma göre dallanma ve ekran önizlemeleri

Görsel 10, draw() içindeki if / else if zincirinin her durumda farklı çizim ve güncelleme fonksiyonlarına yönlendiğini gösterir.

Girdi de duruma bağlı olmalıdır. Örneğin WASD yalnızca DURUM_OYUN iken oyuncuyu hareket ettirmeli; menüde aynı tuşlar farklı iş yapabilir veya yok sayılabilir.

Kod bloğu: keyPressed() — duruma göre geçiş.

Kod 13.

javascript
function keyPressed() {  if (oyunDurumu === DURUM_MENU && key === " ") {    oyunuSifirla();    oyunDurumu = DURUM_OYUN;  }  if (oyunDurumu === DURUM_BITIS && (key === "r" || key === "R")) {    oyunDurumu = DURUM_MENU;  }}

keyPressed() tek seferlik olaydır; menüde SPACE ve bitişte R için uygundur (Bölüm 3 Ana Başlık 4). Oyun içi sürekli hareket keyIsDown() ile guncelleOyun() içinde kalır.

Dikkat: mousePressed() içinde de if (oyunDurumu === DURUM_MENU) ile yalnızca menüde tıklama işlenmelidir; aksi halde bitiş ekranında tıklama oyun mantığını tetikleyebilir. XOX'ta hamle yalnızca oyun durumundayken kabul edilecektir.

2.4. Geçiş Kuralları

Geçiş kuralları tablo halinde yazıldığında tasarım netleşir; kod bu tabloya karşılık gelir.

Mini oyun (Kaç-Kaç top) geçiş tablosu:

Tablo 9.

Mevcut durum Olay / koşul Yeni durum Ek işlem
DURUM_MENU SPACE basıldı DURUM_OYUN oyunuSifirla()
DURUM_OYUN Oyuncu–hedef teması DURUM_OYUN (değişmez) skor artar, hedefYerlestir()
DURUM_OYUN Oyuncu–top çarpışması DURUM_BITIS —
DURUM_BITIS R basıldı DURUM_MENU —

İkinci satır, her olayın durum değiştirmediğini gösterir: hedef toplamak skoru artırır ama oyun DURUM_OYUN içinde kalır. Durum değişikliği yalnızca tabloda yeni durum yazan satırlarda olur.

Her iki temas da önceki ana başlıktaki daire testiyle bulunur: oyuncu merkezi (oyuncuX + BOYUT/2, oyuncuY + BOYUT/2) ile top veya hedef merkezi arası dist(); toplam yarıçaptan küçükse temas vardır.

Geçersiz geçişler bilinçli olarak yok sayılır: menüdeyken WASD oyuncuyu hareket ettirmemeli (guncelleOyun() yalnızca oyun durumunda çağrılır). Bu, durum makinesinin “her aşamada ne mümkün?” sorusuna yanıt vermesidir.

Bilgi: İleride duraklatma (DURUM_DURAKLAT) eklenecekse geçiş tablosuna yeni satırlar eklenir; mevcut üç durumlu iskelet genişlemeye uygundur.

Geçiş tablosunun kâğıt üzerinde önce yazılması, kodlamadan önce bir tasarım adımı olarak değerli bir alışkanlıktır. Tablo doldurulurken her satır için "bu olay gerçekleştiğinde oyuncu ekranda ne görmeli, hangi tuşlar anlamlı olmalı?" sorusu sorulur. Bu sorular yanıtlanmadan doğrudan kod yazılırsa, genellikle unutulan bir geçiş (örneğin bitiş ekranında yanlışlıkla SPACE'in de menüye dönmesi) ortaya çıkar ve hata ayıklaması, kodun her yerine dağılmış if koşulları arasında zaman alır. Tablo hazır olduğunda ise draw() ve keyPressed() gövdeleri, tablodaki satırların doğrudan çevirisinden ibaret hâle gelir.

XOX için aynı oyunDurumu menü/oyun/bitiş akışına ek olarak tahta verisi (tahta dizisi), sıra ("X" / "O") ayrı değişkenlerde tutulacak; oyun aşaması ile tahta mantığı birbirinden ayrılacaktır.

Yapay Zekâ Etkileşimi: Durum Diyagramı Tahmini süre: 15–20 dakika.

Amaç: Menü–oyun–bitiş geçişlerini kodlamadan önce tasarlamak.

Adım 1: Üç durum ve en az dört geçişi kâğıda çizin. Adım 2: Yapay zekâdan aynı diyagramı metinle isteyin; eksik geçiş var mı bakın. Adım 3: “Pause” eklemek isterseniz hangi yeni durum ve geçişlerin gerekeceğini sorun.

Özet

Durum makinesi, sistemin her an yalnızca bir durumda bulunduğu ve tuş, tıklama, süre veya çarpışma gibi belirli olaylarla başka duruma geçtiği bir modeldir; oyun bağlamında omurga çoğunlukla menü, oyun ve bitiş üçlüsüdür. Aşamaları ayrı boolean değişkenlerle izlemek risklidir, çünkü iki bayrağın aynı anda doğru olması hem çizimi hem girdinin hangi bloğa gideceğini belirsizleştirir. Tek bir oyunDurumu değişkeninde ise her an tek bir değer bulunur ve geçiş tek satırlık bir atamaya iner. Durum değerleri metin olarak tutulur; const sabitleri tanımlamak sessizce başarısız olan yazım hatalarını önler, karşılaştırmalar ise === ile yapılır.

draw gövdesi duruma göre dallanır: menüde yalnızca menü çizimi, oyun aşamasında güncelleme ile sahne çizimi, bitişte sonuç ekranı çalışır. Girdi de aynı biçimde bölünür; menüde SPACE oyunu başlatırken sürekli hareket tuşları yalnızca oyun aşamasında okunur, bitiş ekranında R menüye döndürür. Böylece aynı tuş farklı aşamalarda farklı iş yapabilir veya bilinçli olarak yok sayılır.

Geçişler rastgele değil kurala bağlıdır ve mevcut durum, olay, yeni durum sütunlarıyla tabloya dökülebilir; her olay durumu değiştirmez, örneğin hedefe temas skoru artırır ama oyun aşamasında kalınır. Diyagram veya tablo, koddan önce tasarımı netleştirir; menü–oyun–bitiş akışının tam sketch’i bir sonraki ana başlıkta tamamlanır.

Neler Öğrendik?

Soru 1 Durum makinesinde sistem aynı anda kaç durumda olmalıdır?

A) Sınırsız

B) Tipik olarak tek ana durumda

C) Zorunlu sıfır

D) Yalnızca CSS’te

E) Yalnızca sunucuda

Soru 2 oyunDurumu değişkeninin rolü nedir?

A) Aktif ekran / aşamayı saklamak

B) Tuval DPI’sini silmek

C) Git remote eklemek

D) Yazıcı seçmek

E) DNS yenilemek

Soru 3 Duruma göre girdi ayırmanın gerekçesi nedir?

A) Aynı tuşun menü ve oyunda farklı iş yapabilmesi

B) Matematiği kaldırmak

C) Renkleri yasaklamak

D) setup’ı çoğaltmak

E) EPUB zorunluluğu

Soru 4 Geçiş kuralı neyi tanımlar?

A) Hangi olayın hangi yeni duruma götüreceğini

B) Yalnızca font boyutunu

C) Yalnızca dosya adını

D) Yalnızca batarya seviyesini

E) Yalnızca Wi-Fi şifresini

Neler Öğrendik Yanıt Anahtarı

Soru 1: Doğru Cevap: B

Soru 2: Doğru Cevap: A

Soru 3: Doğru Cevap: A

Soru 4: Doğru Cevap: A

Yararlanılan Kaynaklar

Bu içerik aşağıdaki kaynaklardan derlenerek hazırlanmıştır: