Bölüm 4 · Sunum 4
İki boyutlu dizi, fare tıklaması ve durum makinesi tek bir oyunda buluşuyor.
Tıklayarak başlayın; sırayla X ve O koyun. Dolu bir kareye tıklamayı deneyin. Oyun bitince tuvale tıklayıp R’ye basın.
| Kural | Açıklama |
|---|---|
| Tahta | 3 satır × 3 sütun = 9 hücre |
| Sıra | Oyuncular sırayla oynar; X başlar |
| Geçerli hamle | Boş bir hücreye tıklamak |
| Geçersiz hamle | Dolu hücre ya da tahta dışı: yok sayılır |
| Kazanma | Aynı işaretle üç hücre: 8 olası hat |
| Beraberlik | 9 hücre dolu, kazanan yok |
Dokuz ayrı değişken mi? Dokuz elemanlı tek bir dizi mi? “Orta satırın sağ hücresi” dediğimizde hangisine bakacağız?
Dış dizinin üç elemanı var; her biri üç elemanlı bir dizi, yani bir satır.
| İfade | Anlamı |
|---|---|
tahta[0] | İlk satır (üç elemanlı dizi) |
tahta[1][2] | 2. satır, 3. sütun |
"" | Boş hücre |
"X" / "O" | Dolu hücre: o karedeki taş |
Erişim hep aynı sırayla: tahta[satir][sutun]. Önce satır, sonra sütun.
tahta[1] bütün bir satırı, tahta[1][2] o satırdaki tek bir hücreyi verir.
draw() fonksiyonunun bir kez çalışması. Oyun döngüsünün bir turu.tahta.length satır sayısını (3), tahta[0].length sütun sayısını verir. XOX hep 3 × 3 olduğu için döngülerde 0–2 aralığı yeter.“2. satır, 3. sütun” hangi indeks? Peki hemen altındaki hücre?
Düz dizide her seferinde bir formül gerekir: satir * 3 + sutun. Izgara büyüdükçe hata ve okuma yükü artar.
tahta[satir][sutun]“Burada ne var?” sorusunu doğrudan sorar.satir ± 1, sutun ± 1.Hepsi aynı indeks diline oturur. Birçok oyun dünyası bir satır-sütun ızgarasıdır: her hücre tek bir yanıt tutar.
Sıra hep aynı: önce tahtayı diziyle modelle, sonra çiz, sonra kuralları uygula. XOX bu sıranın en küçük tam projesi.
katman[z][y][x] ile Minecraft tarzı blok dünyası gibi. Ayrı bir sihir değil; ızgara fikrinin doğal uzantısı. Çoğu iki boyutlu oyun tek bir matris ve birkaç yardımcı diziyle ilerler.| Değişken | Görevi |
|---|---|
oyunDurumu | Menü, oyun ya da bitiş |
tahta | 3 × 3 hücre verisi |
sira | Sıradaki oyuncunun işareti |
sonuc | Bitiş ekranında gösterilecek sonuç |
createCanvas(300, 300) ve HUCRE = 100: üç hücre tuvali tam kaplar. oyunuSifirla() tahtayı boşaltır, sırayı X’e verir.
| Fonksiyon | Sorumluluğu |
|---|---|
cizTahtaCizgileri() | Arka plan ve ızgara çizgileri |
taslariCiz() | Dolu hücreleri dolaşır, her biri için tasCiz’i çağırır |
tasCiz(x, y, boyut, deger) | Tek bir hücreye X ya da O yazar |
cizOyunEkrani() | Tahta + taşlar + sıra yazısı |
Tanıdık bir yapı: Bölüm 2’deki tahtaCiz ve hucreCiz. O zaman “ileride XOX’ta kullanacağız” demiştik.
Dört line: iki dikey, iki yatay. Taş, hücrenin ortasına textAlign(CENTER, CENTER) ile yazılan bir harf; X kırmızı, O mavi.
Veri ile görüntü ayrı: çizim her frame dizinin o anki hâlini yansıtır. Kodu kopyalayıp dizideki bir "" yerine "O" yazın; çizim kendiliğinden değişir.
Fare bize piksel veriyor; dizimiz ise satır ve sütun istiyor. Hücreler 100 piksel. Pikselden indekse nasıl geçeriz?
| Adım | Kontrol | Sonuç |
|---|---|---|
| 1 | Menüde miyiz? | Evetse oyunuSifirla(), oyuna geç ve çık |
| 2 | Oyun durumunda mıyız? | Değilse return |
| 3 | satir ve sutun 0–2 aralığında mı? | Değilse return |
| 4 | Hücre boş mu? | Doluysa return |
| 5 | Hamleyi yaz | tahta[satir][sutun] = sira |
| 6 | Kazanan ya da beraberlik var mı? | Varsa bitişe geç |
| 7 | Sırayı diğer oyuncuya ver | X ↔ O |
İlk dört adım birer kapı bekçisi: geçersiz her tıklama erken return ile elenir. Asıl iş tek satır.
mousePressed (1/2): bekçiler ve hamledraw yeni taşı kendisi çizecek.mousePressed (2/2): sonuç ve sırareturn ile çıkılır.if / else ile X ve O arasında değişir.Yatay, dikey, çapraz… Hepsini sayın. Program bunların hepsine tek tek bakmak zorunda mı?
Kazanma koşulu: üç hücrede aynı işaret ve o hücrelerin boş olmaması.
kazananKontrol: iki döngü, iki ifkazananKontrol nasıl okunur?forÜç yatay satır: tahta[i][0], [i][1], [i][2].forÜç dikey sütun: tahta[0][j], [1][j], [2][j].ifİki çapraz. Kazanan yoksa "" döner.Fonksiyon kazananın işaretini ("X" ya da "O") döndürür. İlk bulduğu üçlüde return ile çıkar; geri kalan hatlara bakmaz.
i satırı, j sütunu gezdiği için üç yatay ve üç dikey hat ikişer satıra sığıyor.!== "" kısmını silersek ne olur?Oyunun en başında tahta nasıl görünüyor?
"" olduğu için “kazanan yok” gibi görünür. Fakat fonksiyon ilk satırda çıktığı için diğer hatlara hiç bakmaz. Üst satır boşken alt satırdaki gerçek üçlü görülmez.Tek bir boş hücre bulunca false döner ve aramayı bırakır. Tahta dolu ve kazanan yoksa beraberlik. Bitiş ekranı sonuc’a bakıp mesajı seçer.
| Mevcut durum | Olay / koşul | Yeni durum | Ek işlem |
|---|---|---|---|
DURUM_MENU | SPACE ya da tıklama | DURUM_OYUN | oyunuSifirla() |
DURUM_OYUN | Geçerli tıklama, kazanan var | DURUM_BITIS | sonuc = kazanan |
DURUM_OYUN | Geçerli tıklama, tahta dolu | DURUM_BITIS | sonuc = "beraberlik" |
DURUM_OYUN | Geçerli tıklama, oyun sürüyor | DURUM_OYUN | Sıra X ↔ O |
DURUM_OYUN | Geçersiz tıklama | DURUM_OYUN | — |
DURUM_BITIS | R basıldı | DURUM_MENU | — |
Omurga Kaç-Kaç Top ile aynı. X ve O sırası ayrı birer durum değil; oyun durumunun içinde sira değişkeninde tutulan alt bilgi.
setup ve yönlendirici drawMenüden oyuna hem SPACE hem tıklama ile geçilir; ikisi de oyunuSifirla()’yı çağırır. Hamleler fareyle, menü geçişleri klavyeyle.
text, if / else, mousePressed, return.for, modüler çizim fonksiyonları, oyun döngüsü.floor, keyPressed.tahta[satir][sutun] iskeletiyle bilgisayar rakibi (Minimax), Connect Four, Yılan ve Mayın Tarlası. Onlar İleri Teknikler kitabının konusu.sira ve taş metinleri, tasCiz, kazananKontrol, createCanvas ve HUCRE, bitiş mesajı.| Seçenek | Ne değişir? | Zorluk |
|---|---|---|
| A · Sembol | X ve O yerine A / B, ★ / ● ya da iki kısa kelime. Menü ve bitiş yazıları uyumlu. | Kolay |
| B · Ters XOX | Üçlü yapan kaybeder. Bitiş yazısı ve sonuc mantığı tersine döner. | Orta |
| C · 4 × 4 | Tahta 4 × 4; yine üç aynı işaret kazandırır. HUCRE ve döngü sınırları büyür. | Orta–zor |
| D · Serbest işaret | Oyuncu önce taşı seçer (1 → X, 2 → O), sonra boş hücreye tıklar. | Orta–zor |
kazananKontrol aynı mı kalır? Bitişte ne yazmalı?tahta[satir][sutun] doğrudan işe yarar?kazananKontrol’e neden hiç dokunmadan çalışıyor?mousePressed ve bitiş dalında neyi tersine çevireceğinizi üç maddeyle planlayın.tahta[2][0]tahta[0][2]tahta[3][0]tahta[0][3]sutun = floor(299 / 100) = 2, satir = floor(0 / 100) = 0. Dizide önce satır yazılır: tahta[0][2], sağ üst köşe.
sira’ya güvenen kod yanlış oyuncuyu gösterir.kazananKontrol tahtaya bakıyor, sira’ya değil; o yüzden kazanan doğru çıkar. Ama “kazanan = sira” diye yazılmış bir sürümde yanlış oyuncu kazanırdı. Sıra, oyun sürüyorsa değişmeli.
tahta[1].length ve tahta.length sırasıyla neyi verir?tahta satırların dizisi: uzunluğu satır sayısı. tahta[1] tek bir satır: uzunluğu o satırdaki hücre sayısı.
tahta[satir][sutun]. Önce satır, sonra sütun.floor(mouseX / HUCRE) ve floor(mouseY / HUCRE).return ile elenir.Kitap 1 tamamlandı
Gri bir kareyle başladık; menüsü, kuralları ve kazananı olan bir oyunla bitirdik.