Bölüm 3 · Sunum 3
Boyutu baştan belli diziler ve birçok nesneyi birlikte yöneten paralel diziler.
Çantada 5 yuva var, altıncı eşyayı alamıyorsunuz. Geçen ders gördüğümüz push ile sınırsız ekleyebiliyorduk. Sınırı kim, nasıl koyuyor?
push / popEleman gelince dizi uzar, gidince kısalır. Eleman yoksa yuva da yoktur. Uzunluk baştan bilinmiyorsa: tahmin geçmişi, kule listesi.Sabit model, belleği ve döngü sınırını öngörülebilir kılar. Tasarım açısından da bir kuraldır: “en fazla 5 eşya”.
Zelda’daki kalpler, Minecraft’ın 9 yuvalı çubuğu, bir silahın şarjörü: hepsinde yuva sayısı sabit, değişen yalnızca doluluk.
MAKS.MAKS uzunluğunda oluştur ve BOS ile doldur.yigin[tepe] = deger; tepe++. push() yok.tepe--; değeri oku; yuvaya yeniden BOS yaz. pop() yok.Yığın mantığı metotlara bağlı değil: “sona ekle, sondan çıkar” davranışı indeks ve atamayla da kurulur. Birçok dilde hazır push / pop zaten yoktur.
tepe: sıradaki boş yuvayı gösteren parmakMAKS = 5 · tepe = 3 · envanter.length her zaman 5
tepe iki şeyi birden söylerKaç yuva dolu (3) ve yeni eşyanın nereye yazılacağı (indeks 3).BOS“Bu yuvada bir şey yok” demek için seçtiğimiz özel değer: -1, "" gibi.yiginEkleÖnce sınıra bakıyor: yer yoksa false döner ve hiçbir şey eklemez. Yer varsa tepe’nin gösterdiği yuvaya yazar, sonra tepe’yi bir ilerletir.
yiginCikarBOS döner.tepe’yi bir geri al: artık son dolu yuvayı gösteriyor.BOS yaz.| Adım | İşlem | yigin | tepe |
|---|---|---|---|
| Başlangıç | — | [-1, -1, -1, -1, -1] | 0 |
| 1 | yiginEkle(7) | [7, -1, -1, -1, -1] | 1 |
| 2 | yiginEkle(3) | [7, 3, -1, -1, -1] | 2 |
| 3 | yiginCikar() → 3 | [7, -1, -1, -1, -1] | 1 |
yigin.length hep MAKS. Dolu eleman sayısı tepe. Döngü bu yüzden i < tepe ile sınırlanır.
0 ile işaretlesek olur mu?Oyuncu gerçekten 0 puan aldıysa ne olacak?
BOS = -1 uygun. −1 hiçbir zaman geçerli bir tahmin olamaz.0 “boş” anlamına gelemez; yine -1 gibi imkânsız bir değer seçilir."" ya da "BOS" kullanılır.tepe tutmak istemezseniz “ilk BOS yuvaya yaz” diye tarayabilirsiniz. Fikir aynıdır; doluluk hesabı döngüyle yapılır.
| Yaklaşım | Boyut | Boş yer | Ne zaman uygun? |
|---|---|---|---|
push / pop | length değişir | Eleman yoksa yuva da yok | Uzunluk baştan bilinmiyor; geçmiş listesi |
Sabit kapasite + BOS + tepe | length === MAKS, sabit | Yuva var, değeri BOS | Envanter, can, sabit düşman havuzu, sınırlı geri al |
Kule kurma ve skor geçmişi gibi örnekleri push / pop ile yazmak kısa ve okunaklıdır. Sabit model “en fazla N yer” kuralını koda gömmek için bilinmelidir.
push ile büyür, pop ile küçülür. Doğru boyutu baştan seçmek çoğu zaman bir tasarım tercihidir.Tuvale birkaç kez tıklayın, sonra ÇIKAR kutusuna basın. length hep 5 kalıyor; değişen yalnızca tepe. Altıncı eşyayı eklemeyi deneyin.

draw içindeki metin listesini kaldırın; yan yana 5 dikdörtgen yuva çizin.tepe indeksinin altına küçük bir üçgen koyun. tepe === MAKS iken “dolu” yazın.yiginEkle, yiginCikar ve mousePressed’e dokunmayın; yalnızca çizimi değiştirin.Bir balonu tarif etmek için kaç sayıya ihtiyacınız var? Bunları kaç dizide tutarsınız?
balonX
balonY
balonRX · balonRY
Konum için balonX ve balonY; boyut için yatay ve dikey yarıçap: balonRX, balonRY.
ellipse çap ister: genişlik = 2 × rx, yükseklik = 2 × ry. Daire için rx ile ry eşittir.
Bu, birazdan sizin yazacağınız sahnenin bir örneği. Her diziye birer sayı ekleyin: altıncı balon belirir.
balonY[i]’yi okumaya çalışır ve undefined bulur.push, dört pop.| Belirti | Olası neden | Çözüm |
|---|---|---|
Ekranda undefined | Geçersiz indeks: üç elemanlı dizide d[3] | i < dizi.length koşulunu kontrol et |
| Son satırda fazladan boş değer | i <= length ile sınır aşımı | i < length kullan |
push sonrası liste görünmüyor | draw() içinde dolaşma yok | for ile ekrana yazdır |
| Balonlar üst üste ya da garip boyda | Paralel dizide indeks kayması | X, Y, RX, RY’yi aynı i ile oku |
| Bir balon “kaybolmuş” gibi | Yalnızca bir diziye push / pop | Ekleme-çıkarma bütün dizilerde birlikte |

balonX, balonY, balonRX, balonRY dizilerini kurun. İsterseniz bir de renk dizisi.for içinde ellipse ile çizin. Bonus: kısa bir line ile ip.balonX.push(...) yapıp diğer üç diziyi unutan arkadaşınızın ekranında ne bozulur? Bir cümleyle yazın.Mini kule sketch’inde üç kule kuruldu, sonra bir kez GERİ AL’a basıldı. Dizilerde ne kaldı, ekranda kaç kule görünüyor?
kuleX[0] hangi kuleyi temsil eder: ilk kurulanı mı, son kurulanı mı?pop ister?length === 0 iken pop çağırmak neden risklidir?pop() işe yarar mı?pop yalnızca sondaki elemanı çıkarıyor. Oyuncu ise istediği balona tıklıyor.
splice(i, 1): aradan bir eleman çıkar↓ balonX.splice(1, 1)
sonrakiler bir yuva sola kayar · length 3 olur
dizi.splice(i, 1)İndeksi i olan elemanı çıkarır; length bir azalır. Boşluk kalmaz.i için her dizide splice(i, 1) çağrılır. Biri unutulursa indeksler kayar.Balona tıklayınca o balon bütün dizilerden splice ile çıkar; boşluğa tıklayınca bütün dizilere push edilir. Birazdan bunu siz yazacaksınız.
setup / draw: arka plan, skor, for + ellipse.mousePressed akışı:
splice(i, 1); skoru artırın.push edin.noktaElipsIcindeMi(px, py, cx, cy, rx, ry) → boolean. Elips denklemini kullansın.yeniBalonOlustur(…): tuvalin içinde, diğer balonlara değmeyen rastgele bir balon. Yer bulamazsa null. Dönüş: [x, y, rx, ry].uyumluBalonRengi() → [r, g, b]. Pastel, birbirine yakışan renkler.noktaElipsIcindeMi gerçekten elips mi kullanıyor, yoksa dist ile daire mi? yeniBalonOlustur kenarları ve diğer balonları hesaba katıyor mu? Siz splice / push’u bütün dizilerde birlikte yaptınız mı?balonOlcek, balonAlfa. Onların da birlikte push / splice edildiğini kontrol edin. Düzeyinizin üstünde bir parça gelirse “daha basit anlat ya da sadeleştir” demek doğaldır.x[i], y[i], r[i] için bir nesne biçimi tasarlayın: {x, y, r}.tepe kaç, yigin nasıl?[4, 9, 7][4, 9, -1][9, 2, 7][4, 9, 2, 7]Dördüncü ekleme reddedilir: yer yok. Sonra en üstteki 2 çıkar. Dizi asla 3 yuvayı aşmaz.
d = [5, 8, 1, 6] iken d.splice(1, 1) sonrası d[2] kaç?undefined8 çıkar; dizi [5, 1, 6] olur. Sonraki elemanlar bir yuva sola kaydığı için indeksleri değişir.
0-130 geçerli bir can değeri; “boş” ile karışır. İşaret, oyunda asla oluşmayacak bir değer olmalı.
MAKS uzunlukta kurulur, boş yuvalar BOS ile işaretlenir.tepe hem dolu yuva sayısını hem sıradaki boş yuvayı gösterir.yigin[tepe] = deger; tepe++. Çıkarma: tepe-- ve yuvaya BOS.BOS geçerli bir oyun değeriyle çakışmamalı.push, pop, splice her zaman bütün dizilerde birlikte yapılır.splice(i, 1) aradan eleman çıkarır; sonrakiler sola kayar.Sıradaki ders
Klavye: basılı tutmak, bir kez basmak ve tuş kodları.