Ana Başlık 3. Değişkenler, Operatörler ve Koşullu İfadeler
Amaç: Değişken ve veri türlerini tanıtarak karşılaştırma/mantıksal operatörler ile if/else dallanma mantığını kurmak.
Öğrenme Çıktıları:
- Değişken tanımlar ve number, string, boolean türlerini ayırt eder.
- Karşılaştırma ve mantıksal operatörleri koşullarda kullanır.
- if, else if ve else ile çok yollu dallanma yazar.
- Atama (=) ile karşılaştırma (===) farkını açıklar.
Anahtar Sözcükler: değişken, veri türü, operatör, if/else, boolean, doğruluk tablosu
Giriş
İlk ana başlıkta p5.js ortamı kurulmuş, koordinat sistemi tanınmış ve temel şekiller çizilmiştir. Ancak çizilen şekiller henüz duruma göre karar verememektedir. Oyun programlamanın özü, çalışma anındaki bilgiye göre farklı yollar izlemektir: top kenara değdi mi, skor yeterli mi, fare doğru bölgeye tıkladı mı?
Bu kararlar koşullu ifadelerle kodlanır. Koşuldan önce değişken kavramı gerekir; skor, can, konum ve oyun bitiş bayrağı gibi bilgiler isimlendirilmiş bellek alanlarında tutulur. JavaScript’te let / const, temel veri türleri, atama ile karşılaştırmanın ayrımı ve && / || / ! operatörleri bu zemini oluşturur.
Bu ana başlıkta değişkenler, operatörler ve if/else yapıları sistematik işlenir. Fare etkileşimi ve Daire Tıklama mini oyunu bir sonraki ana başlıkta, bu temelin üzerine kurulacaktı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.
3.1. Değişkenler ve Veri Türleri
Tanım: Değişken (variable) — Program çalışırken değeri okunabilen, değiştirilebilen veya sabit tutulabilen isimlendirilmiş bellek alanıdır.
JavaScript'te değişken tanımlamak için let, const veya eski sözdizim olan var anahtar sözcükleri kullanılır. var işlev (function) kapsamına sahiptir ve beklenmedik davranışlara yol açabilir; let ve const ise blok kapsamlıdır (süslü parantez {} içinde tanımlanırsa dışarıdan erişilemez). Örneklerde değişebilir değerler için let, değişmeyecek sabitler için const kullanılır.
Kod bloğu: Temel değişken tanımlama örnekleri.
Kod 1.
let skor = 0; // Tam sayı (number)let oyunAdi = "Daire Tıklama"; // Metin (string)let oyunBitti = false; // Mantıksal değer (boolean)const HEDEF_SKOR = 10; // Sabit — sonradan değiştirilmez (BÜYÜK_HARF örfi)Bu düzeyde odaklanılan temel veri türleri şunlardır (JavaScript'te undefined, null, object gibi ek türler de vardır):
Tablo 1.
| Tür | Açıklama | Örnek |
|---|---|---|
| number | Tam sayı veya ondalıklı sayı | 42, 3.14, -7 |
| string | Metin (tırnak içinde) | "Merhaba", 'p5.js' |
| boolean | Doğru veya yanlış | true, false |
p5.js, konum ve boyut için number türünü yoğun biçimde kullanır. Oyun durumunu izlemek için boolean değişkenler (oyunBitti, hedefVuruldu gibi) sık görülür.
Değişken adlarının ne anlama geldiği okunabilirlik açısından önemlidir. x, y gibi tek harfli adlar koordinat için yaygındır; a, b, temp1 gibi belirsiz adlar ise kodun izlenmesini zorlaştırır.
Tanım: camelCase (deve notasyonu) — Birleşik değişken veya fonksiyon adlarında ilk kelimenin küçük harfle başladığı, sonraki kelimelerin ilk harfinin büyük yazıldığı ve kelimeler arasında boşluk veya alt çizgi bulunmayan adlandırma biçimidir. Örnek: hedefX, topHizi, kalanSure.
camelCase, JavaScript'te dil tarafından zorunlu kılınan bir kural değildir; hedef_x veya HedefX gibi adlar da sözdizimi açısından geçerlidir. Ancak JavaScript ve p5.js topluluğunda değişken ve fonksiyon adları için camelCase yaygın bir örf (convention) haline gelmiştir. Bu kitaptaki örneklerde değişken ve fonksiyon adları camelCase ile yazılır.
Sabit (const) değerlerde ise bazen tüm harflerin büyük yazıldığı ve kelimelerin alt çizgiyle ayrıldığı BÜYÜK_HARF örfi kullanılır: HEDEF_SKOR, MAKS_CAN. Bu da zorunluluk değil, okunabilirlik için benimsenen bir düzendir.
Dikkat: Tek eşittir (=) atama operatörüdür; eşitlik sorusu için == veya === kullanılır. === (üç eşittir, tam eşitlik) hem değeri hem veri türünü birlikte kontrol eder; örneklerde karşılaştırmalarda === kullanılır. == ise tür dönüşümü yaparak eşleştirebilir (ör. "5" == 5 true döner) ve başlangıç düzeyinde kafa karışıklığına yol açabilir.
String (metin) işlemleri — kısa özet
Bu kitaptaki mini oyunlar çoğunlukla sayı ve boolean ile ilerler; yine de skor yazısı, seviye adı veya "Kazandın!" gibi mesajlar string türündedir. Aşağıdaki işlemler başlangıç için yeterlidir:
Tablo 2.
| İşlem | Sözdizimi | Örnek | Sonuç |
|---|---|---|---|
Birleştirme (+) |
"a" + "b" |
"Skor: " + 7 |
"Skor: 7" |
| Uzunluk | metin.length |
"p5.js".length |
5 |
| Büyük / küçük harf | .toUpperCase() / .toLowerCase() |
"Hi".toUpperCase() |
"HI" |
| Eşitlik | === |
durum === "bitti" |
true veya false |
Kod bloğu: String birleştirme ve ekrana yazma (çalışır sketch).
Kod 2.
let skor = 7;let oyunAdi = "Daire Tıklama"; function setup() { createCanvas(400, 200);} function draw() { background(240); fill(0); let mesaj = "Skor: " + skor; // "Skor: 7" text(mesaj, 20, 40); if (oyunAdi.length > 0) { text(oyunAdi.toUpperCase(), 20, 70); }}Sayıyı metne çevirmek için String(skor) veya skor + "" de kullanılabilir; pratikte "Skor: " + skor en yaygınıdır. Metinden sayıya dönüş (Number("10"), parseInt) bu ana başlıkta zorunlu değildir; skor zaten number tutulur, ekrana yazarken string birleştirilir. text(metin, x, y) tuvale yazar (Ana Başlık 1 çizim tablosu); metin rengi fill ile ayarlanır.
3.2. Karşılaştırma ve Mantıksal Operatörler
Koşullu ifadeler, karşılaştırma operatörlerinin sonucuna dayanır. Karşılaştırma sonucu her zaman boolean değer üretir: true veya false.
Tablo 3.
| Operatör | Anlam | Örnek | Sonuç (örnek değerlerle) |
|---|---|---|---|
== |
Değer eşitliği (tür dönüşümü yapabilir) | skor == 10 |
skor 7 ise → false; skor 10 ise → true; skor "10" (metin) iken → true (tür dönüşür) |
=== |
Tam eşitlik (değer + tür) — örneklerde kullanılan | skor === 10 |
skor 7 ise → false; skor 10 ise → true; skor "10" (metin) iken → false |
!= |
Eşit değil mi? | durum != "bitti" |
durum "oynuyor" ise → true; durum "bitti" ise → false |
< |
Küçük mü? | x < 100 |
x 50 ise → true; x 150 ise → false |
> |
Büyük mü? | y > 200 |
y 250 ise → true; y 100 ise → false |
<= |
Küçük veya eşit mi? | skor <= 5 |
skor 5 ise → true; skor 7 ise → false |
>= |
Büyük veya eşit mi? | can >= 1 |
can 1 ise → true; can 0 ise → false |
== ile === farkı (tür dönüşümü): JavaScript’te "10" bir string (metin), 10 ise bir number (sayı)dır; görünüşte aynı olsalar da veri türleri farklıdır. == (iki eşittir) karşılaştırırken gerekirse türleri birbirine çevirmeye çalışır (tür dönüşümü / type coercion): bu yüzden "10" == 10 sonucu true olur. === (üç eşittir, tam eşitlik) hem değeri hem türü kontrol eder; "10" === 10 sonucu false olur. Oyun kodunda skor, can gibi değerler zaten number tutulduğu için ve sürpriz eşleşmeleri önlemek adına örneklerde === tercih edilir. Eşit değil için benzer ayrım vardır: != tür dönüşümü yapabilir, !== yapmaz; örneklerde mümkün olduğunca !== kullanılır.
Mantıksal operatörler
Mantıksal operatörler, karşılaştırma ifadelerinin ürettiği true/false değerlerini birleştirir. Sonuç yine boolean olur.
Tablo 4.
| Operatör | Anlam | Örnek | Sonuç (örnek değerlerle) |
|---|---|---|---|
&& |
VE — her iki koşul da doğru olmalı | x > 0 && x < 400 |
x 150 iken → true; x 500 iken → false |
|| |
VEYA — en az biri doğru yeter | can === 0 || sure === 0 |
can 0, sure 30 iken → true; can 3, sure 30 iken → false |
! |
DEĞİL — boolean değeri tersine çevirir | !oyunBitti |
oyunBitti false ise → true; oyunBitti true ise → false |
Dikkat — matematikteki zincir ile JavaScript farkı: Matematikte “x, 20 ile 60 arasında” çoğu zaman 20 < x < 60 diye yazılır. JavaScript’te bu ifade beklendiği gibi çalışmaz. Dil önce 20 < x sonucunu üretir (true veya false), sonra bu boolean değeri 60 ile karşılaştırmaya çalışır; sonuç kafa karıştırıcı veya yanlış olabilir. Aralığı doğru sormak için iki karşılaştırmayı && ile bağlayın:
Kod 3.
// Yanlış beklenti (matematik yazımı — JS'te güvenilir değil):// 20 < x < 60 // Doğru:20 < x && x < 60Örneğin x = 40 iken 20 < x && x < 60 → true; x = 10 iken → false. Tuval sınırı gibi durumlar da aynı kalıptır: x > 0 && x < width.
Bilgi: Bazı diller (örneğin Python) 20 < x < 60 biçimindeki zincirli karşılaştırmaya izin verir ve bunu “iki koşulun birden sağlanması” diye yorumlar. JavaScript / p5.js’te ise bu kolaylık yoktur; aralık her zaman && (veya gerekirse ||) ile açıkça yazılır. Matematikte geçerli görünen her yazımın kodda da geçerli veya aynı anlamda olması gerekmez — dilin kuralları esastır.
Tanım: Operand — Bir operatörün üzerinde işlem yaptığı değer veya ifadedir. Örneğin skor === 10 ifadesinde === operatördür; skor ve 10 iki operandtır. x > 0 && x < 400 ifadesinde && operatörünün operandları x > 0 ile x < 400 koşullarıdır. !oyunBitti ifadesinde ! tek operand alır (oyunBitti).
Tanım: Doğruluk tablosu — Bir ifadenin farklı girdi değerlerinde true veya false sonucunu satır satır gösteren tablodur.
İki operandlı operatörlerde (&&, ||) her operand true veya false olabileceğinden 2 × 2 = 4 durum vardır. Aşağıda A ve B, bu iki operandı temsil eder (ör. A = can > 0, B = !oyunBitti). Tek operandlı ! için ise yalnızca 2 durum vardır.
&& (VE) doğruluk tablosu — 4 durum
Tablo 5.
| # | A | B | A && B |
|---|---|---|---|
| 1 | true |
true |
true |
| 2 | true |
false |
false |
| 3 | false |
true |
false |
| 4 | false |
false |
false |
Özet: Yalnızca A ve B ikisi birden true ise sonuç true olur. Oyun bağlamında can > 0 && !oyunBitti ifadesi hem canın sıfırdan büyük hem de oyunun bitmemiş olması gerektiğini söyler; biri false ise tüm ifade false döner.
Tablo 6.
| Örnek ifade | can | oyunBitti | can > 0 | !oyunBitti | Sonuç |
|---|---|---|---|---|---|
can > 0 && !oyunBitti |
3 | false |
true |
true |
true |
can > 0 && !oyunBitti |
0 | false |
false |
true |
false |
can > 0 && !oyunBitti |
3 | true |
true |
false |
false |
|| (VEYA) doğruluk tablosu — 4 durum
Tablo 7.
| # | A | B | A || B |
|---|---|---|---|
| 1 | true |
true |
true |
| 2 | true |
false |
true |
| 3 | false |
true |
true |
| 4 | false |
false |
false |
Özet: A veya B'den en az biri true ise sonuç true olur. Oyun bağlamında can === 0 || sure === 0 ifadesi can bittiğinde veya süre dolduğunda oyunun sona erdiğini ifade eder.
Tablo 8.
| Örnek ifade | can | sure | can === 0 | sure === 0 | Sonuç |
|---|---|---|---|---|---|
can === 0 || sure === 0 |
0 | 45 | true |
false |
true |
can === 0 || sure === 0 |
2 | 0 | false |
true |
true |
can === 0 || sure === 0 |
2 | 45 | false |
false |
false |
! (DEĞİL) doğruluk tablosu — 2 durum (tek operand)
Tablo 9.
| # | A | !A |
|---|---|---|
| 1 | true |
false |
| 2 | false |
true |
Özet: ! yalnızca tek boolean değeri tersine çevirir. !oyunBitti ifadesi oyun bitmediyse true, bittiyse false döner; if (!oyunBitti) bloğu yalnızca oyun devam ederken çalışır.

Görsel 1 yukarıdaki VE, VEYA ve DEĞİL tablolarını yan yana özetler: iki operandlı operatörlerde 4 durum, ! için 2 durum.
Mantıksal operatörler ile şekil renklendirme
Aşağıdaki statik sketch bütün sonuçları tek çalıştırmada gösterir. Üst sırada &&, dört kenarlı ve eşit kenarlı olan kareyi vurgular; dikdörtgenin dört kenarı olsa da kenarları eşit değildir. Alt sırada ||, üçgen veya daire olan şekilleri vurgular; kare iki koşula da uymaz. Fare, klavye, animasyon veya kodda değer değiştirme gerekmez.
Bu örnekte iki yeni komut kullanılır:
Tablo 10.
| Komut | Açıklama |
|---|---|
triangle(x1, y1, x2, y2, x3, y3) |
Verilen üç köşe noktasını birleştirerek üçgen çizer. |
color(r, g, b) |
Bir RGB rengini değer olarak oluşturur; değişkende saklanıp fill, stroke gibi komutlarla kullanılabilir. |
color() doğrudan çizim yapmaz: let secili = color(45, 110, 170); rengi saklar; fill(secili) veya stroke(secili) sonraki dolgu / kenar rengini ayarlar. Etiketler için text() Ana Başlık 1'de tanıtılmıştır; textSize ve textAlign bu sketch’te kullanılır, ayrıntıları 4.1’de verilir.
Kod bloğu: && ve || ile seçilen geometrik şekiller — tüm sonuçlar aynı tuvalde.
Kod 4.
function setup() { createCanvas(760, 430); noLoop();} function draw() { background(245); textAlign(CENTER); fill(35); textSize(16); text("Mantıksal operatörler ile şekil renklendirme", 380, 30); textSize(12); text("Tüm sonuçlar tek statik tuvalde", 380, 52); noStroke(); let secili = color(45, 110, 170); let diger = color(195); // && : dört kenarlı VE eşit kenarlı fill(55); textSize(13); text("dört kenarlı && eşit kenarlı", 380, 82); let dortKenar = true; let esitKenar = true; if (dortKenar && esitKenar) { fill(secili); } else { fill(diger); } rect(125, 100, 110, 110); // kare dortKenar = true; esitKenar = false; if (dortKenar && esitKenar) { fill(secili); } else { fill(diger); } rect(445, 125, 180, 60); // dikdörtgen fill(secili); textSize(12); text("true — kare seçildi", 180, 232); fill(90); text("false — kenarlar eşit değil", 535, 232); // || : üçgen VEYA daire stroke(210); line(60, 255, 700, 255); noStroke(); fill(55); textSize(13); text("üçgen || daire", 380, 282); let ucgenMi = true; let daireMi = false; if (ucgenMi || daireMi) { fill(secili); } else { fill(diger); } triangle(90, 395, 170, 295, 250, 395); ucgenMi = false; daireMi = false; if (ucgenMi || daireMi) { fill(secili); } else { fill(diger); } rect(330, 305, 100, 90); // kare ucgenMi = false; daireMi = true; if (ucgenMi || daireMi) { fill(secili); } else { fill(diger); } ellipse(570, 350, 100, 100); // daire fill(secili); text("true", 170, 418); fill(90); text("false", 380, 418); fill(secili); text("true", 570, 418);}Üst sırada yalnız kare, alt sırada üçgen ile daire mavi görünür. Gri şekiller ilgili koşulun false sonucunu gösterir.

Görsel 2 && için iki koşulun birlikte, || için koşullardan en az birinin sağlanmasını tek tuvalde karşılaştırır.
İkiden fazla koşul birleştirmek
&& ve || zincirlenerek üç veya daha fazla koşul aynı ifadede birleştirilebilir. JavaScript ifadeyi soldan sağa değerlendirir; && || operatöründen önce işlenir. Başlangıç düzeyinde karışıklığı önlemek için parantez kullanmak önerilir.
Tablo 11.
| Birleştirme biçimi | Örnek | Ne zaman true? |
|---|---|---|
Üçlü VE (&&) |
skor >= 5 && can > 0 && !oyunBitti |
Üçü birden doğru |
Üçlü VEYA (||) |
can === 0 || sure === 0 || skor >= 100 |
En az biri doğru |
| VE + VEYA (parantezli) | (skor >= 10 && can > 0) || oyunBitti |
Skor ve can koşulu veya oyun bitmiş |
| Dört koşullu tuval sınırı | x > 0 && x < 400 && y > 0 && y < 400 |
Fare tuvalin içinde |
Örnek: x = 150, y = 200 iken dört koşul da true olduğundan tuvalIcinde true olur; x = 0 veya x = 500 iken zincir false döner (kısa devre ile sonraki koşullara bakılmayabilir). Karışık ifadede (skor >= 10 && can > 0) || oyunBitti için skor 10, can 2 ve oyun devam ediyorsa parantez içi true olduğundan sonuç true (kazanma); skor 7 iken parantez false kalır, oyunBitti de false ise tüm ifade false olur.
Dikkat: && ifadesinde ilk koşul false ise JavaScript ikinci koşula bakmadan sonucu false kabul eder. Örneğin can > 0 && skor === hedefSkor ifadesinde can 0 ise skor kontrolü yapılmaz. Bu, gereksiz karşılaştırmaları atladığı için performansı iyileştirir; ancak ikinci tarafta yan etki (ör. skor artırma veya fonksiyon çağrısı) varsa o kod hiç çalışmaz — dikkatsizlikte beklenmeyen hatalara yol açabilir.
Bilgi: Bu davranışa kısa devre (short-circuit) denir; && için short-circuit AND, || için short-circuit OR olarak da anılır. || için aynı mantık geçerlidir: ilk operand true ise ikinciye bakılmaz.
Kod bloğu: Karşılaştırma ve mantıksal operatör kullanımı — çalışır sketch.
Kod 5.
let x = 150;let y = 200;let skor = 7;let can = 2;let sure = 0;let oyunBitti = false; function setup() { createCanvas(400, 280);} function draw() { background(240); fill(0); textSize(14); // Dört koşullu VE: nokta tuval içinde mi? let tuvalIcinde = (x > 0 && x < 400 && y > 0 && y < 400); // true // İkili VE: skor yeterli mi ve oyun bitmedi mi? let kazandi = (skor >= 10 && !oyunBitti); // false — skor henüz 7 // Üçlü VE: oyun devam edebilir mi? let oyunDevam = (can > 0 && skor < 10 && !oyunBitti); // true // VEYA: oyun bitti mi? (can veya süre tükendi) let oyunSonu = (can === 0 || sure === 0); // true — sure 0 // Parantezli karışım: kazanma veya zorunlu bitiş let ekranMesaji = (skor >= 10 && can > 0) || oyunBitti; // false text("tuvalIcinde: " + tuvalIcinde, 20, 40); text("kazandi: " + kazandi, 20, 70); text("oyunDevam: " + oyunDevam, 20, 100); text("oyunSonu: " + oyunSonu, 20, 130); text("ekranMesaji: " + ekranMesaji, 20, 160);}3.3. if, else if ve else Yapıları
Tanım: Koşullu ifade (conditional statement) — Belirli bir koşul doğruysa (true) bir kod bloğunu, değilse başka bir bloğu çalıştıran yapıdır.
Temel sözdizimi:
Kod 6.
if (koşul) { // koşul doğruysa çalışır} else if (baskaKoşul) { // ilk koşul yanlış, bu doğruysa çalışır} else { // hiçbiri doğru değilse çalışır}Bilgi — girinti (indentation): Süslü parantez { } bloğun sınırını belirler; JavaScript sözdizimi açısından girinti zorunlu değildir (Python’daki gibi değildir). Yine de if / else gövdesindeki satırları içeri almak okunabilirliği ciddi biçimde artırır: hangi satırın hangi bloğa ait olduğu gözle hemen görülür. Bu kitaptaki tüm örneklerde blok gövdesi girintilidir. İngilizcede bu uygulamaya indentation denir.
Aşağıdaki üç örnekte sol taraftaki (girintisiz) ve sağdaki (girintili) kod JavaScript’te çoğu zaman aynı şekilde çalışır; fark okunabilirliktedir. Özellikle iç içe koşullarda girinti olmadan hangi satırın hangi bloğa ait olduğu hızla kaybolur.
Örnek 1 — tek if (girintisiz):
Kod 7.
if (skor >= 10) {fill(0, 200, 0);ellipse(200, 200, 80, 80);}Girintili hali:
Kod 8.
if (skor >= 10) { fill(0, 200, 0); ellipse(200, 200, 80, 80);}Örnek 2 — if / else (girintisiz):
Kod 9.
if (can > 0) {background(200, 230, 200);} else {background(230, 180, 180);}Girintili hali:
Kod 10.
if (can > 0) { background(200, 230, 200);} else { background(230, 180, 180);}Örnek 3 — iç içe koşul (girintisiz):
Kod 11.
if (!oyunBitti) {if (skor >= HEDEF_SKOR) {oyunBitti = true;}}Girintili hali:
Kod 12.
if (!oyunBitti) { if (skor >= HEDEF_SKOR) { oyunBitti = true; }}Bilgi: Python’da girinti yalnızca görsel değil, sözdiziminin parçasıdır: yanlış veya eksik indentation programı çalıştırmaz (IndentationError). JavaScript / p5.js’te ise girinti bozulsa bile kod çoğu zaman çalışır; hata sessizce okunabilirlikte ve bakımdadır. Bu yüzden JS’te «çalışıyor» demek yeterli değildir — tutarlı indentation, ekip ve hata ayıklama için yine zorunlu iyi pratik sayılır.
Dikkat: Girinti için boşluk (space) veya sekme (Tab) kullanılabilir. Boşluk, klavyedeki uzun boşluk çubuğudur; sekme için ise çoğu klavyede Tab tuşuna basılır (genelde Q’nun solunda, Caps Lock’un üstünde; üzerinde iki ok veya ⇥ simgesi olabilir). İkisini aynı dosyada karıştırmak sürüm kontrolünde ve farklı editörlerde «yanlış hizalı» görünen satırlara yol açabilir. Birini seçip tutarlı kullanın; p5.js Web Editor ve birçok proje 2 veya 4 boşluk tercih eder. Tab tuşuna basınca editör çoğu zaman boşluk üretecek şekilde ayarlanabilir — önemli olan tutarlılıktır, karakterin «görünmez» olması okuyanı yanıltmasın diye.
Kod bloğu: Koşula göre renk değiştiren çizim.
Kod 13.
let sicaklik; // Değişken — draw dışında tanımlandı (setup'ta değer verilecek) function setup() { createCanvas(400, 400); sicaklik = 18; // Başlangıç değeri} function draw() { background(240); if (sicaklik > 25) { fill(200, 80, 50); // Sıcak — turuncu } else { fill(50, 100, 200); // Serin — mavi } noStroke(); ellipse(200, 200, 100, 100);}Bu örnekte koşul, fare veya mesafe yerine sayısal bir değişken (sicaklik) üzerinden kurulmuştur. sicaklik değeri setup() içinde bir kez atanır; draw() her frame'de aynı değerle koşulu değerlendirir. Fare ile etkileşimli sürüm, fare girdisi ve dist() tanıtıldıktan sonra 4.1’de verilecektir.
Aşağıdaki özet, draw() içindeki if/else dallanmasını gösterir. İlk akış şeması örneği olduğu için simgeler, döngü bölümündeki şemalarla aynı üç eleman üzerinden hatırlatılır: yuvarlak = başla/bitiş, elmas = koşul, dikdörtgen = işlem (oklar sırayı gösterir).
Tablo 12.
| Simge | Anlamı | Bu örnekte |
|---|---|---|
| Yuvarlak | Başla / bitiş | Şemanın girişi ve çıkışı |
| Elmas | Koşul sorusu | sicaklik > 25 |
| Dikdörtgen | Yapılacak işlem | draw(), fill, ellipse |

Görsel 3 Başla → koşul → iki fill dalı → ortak ellipse → Bitir yolunu gösterir; sicaklik > 25 yalnızca rengi seçer.
if / else if / else ile görsel karar: Trafik ışığı
İkiden fazla alternatif için else if zinciri kullanılır. Trafik ışığı bunun en tanıdık örneğidir: tek bir durum değişkeni hangi lambanın yanacağını seçer; zincir yalnızca ilk uyan dalı çalıştırır. Aşağıdaki sketch üç olası durumu da tek çalıştırmada yan yana çizer; fare, klavye veya animasyon yoktur.
Kod bloğu: Üç durum değeri — üç trafik ışığı, tek tuval.
Kod 14.
function setup() { createCanvas(620, 400); noLoop();} function draw() { background(255); textAlign(CENTER); textSize(15); noStroke(); // —— if —— let durum = "kirmizi"; fill(21, 101, 192); text("if", 130, 78); textSize(11); fill(198, 40, 40); text('durum = "kirmizi"', 130, 98); fill(40); rect(100, 110, 60, 230); fill(90); ellipse(130, 154, 40, 40); ellipse(130, 224, 40, 40); ellipse(130, 294, 40, 40); if (durum === "kirmizi") { fill(220, 60, 60); ellipse(130, 154, 40, 40); } else if (durum === "sari") { fill(240, 200, 50); ellipse(130, 224, 40, 40); } else { fill(70, 200, 90); ellipse(130, 294, 40, 40); } // —— else if —— durum = "sari"; textSize(15); fill(21, 101, 192); text("else if", 310, 78); textSize(11); fill(184, 134, 11); text('durum = "sari"', 310, 98); fill(40); rect(280, 110, 60, 230); fill(90); ellipse(310, 154, 40, 40); ellipse(310, 224, 40, 40); ellipse(310, 294, 40, 40); if (durum === "kirmizi") { fill(220, 60, 60); ellipse(310, 154, 40, 40); } else if (durum === "sari") { fill(240, 200, 50); ellipse(310, 224, 40, 40); } else { fill(70, 200, 90); ellipse(310, 294, 40, 40); } // —— else —— durum = "yesil"; textSize(15); fill(21, 101, 192); text("else", 490, 78); textSize(11); fill(46, 125, 50); text('durum = "yesil"', 490, 98); fill(40); rect(460, 110, 60, 230); fill(90); ellipse(490, 154, 40, 40); ellipse(490, 224, 40, 40); ellipse(490, 294, 40, 40); if (durum === "kirmizi") { fill(220, 60, 60); ellipse(490, 154, 40, 40); } else if (durum === "sari") { fill(240, 200, 50); ellipse(490, 224, 40, 40); } else { fill(70, 200, 90); ellipse(490, 294, 40, 40); }}Önce üç lamba gri çizilir; if / else if / else yalnızca duruma uyan lambayı yeniden boyar. Soldan sağa üç sütun sırasıyla if, else if ve else dallarını gösterir.

Görsel 4 soldan sağa if ("kirmizi"), else if ("sari") ve else ("yesil") dallarını ayırır; her durumda yalnızca bir dal çalışır.
if/else oyunlarda neden bu kadar sık?
Oyunlar sürekli karar verir: can bitti mi, engelle çarpışma oldu mu, menü mü oyun içi mi, skor eşiği aşıldı mı? Bu kararların çoğu if / else if / else ile kodlanır. Tanıdık oyunlardan birkaç örnek:
Tablo 13.
| Oyun (örnek) | Koşul (kabaca) | Sonuç |
|---|---|---|
| Super Mario | 1-Up mantarı alındı | Can bir artar |
| Pac-Man | Hayalet ile çarpışma ve güç hapı aktif değil | Bir can kaybedilir |
| Tetris | Bir satır tamamen dolu | Satır silinir, skor artar |
| Futbol / FIFA tarzı | Top kale çizgisini geçti | Gol; skor güncellenir |
| Candy Crush tarzı | Üç veya daha fazla aynı renk komşu | Taşlar patlar, puan gelir |
Aynı iskelet ilerideki Daire Tıklama örneğinde de görünür: isabet varsa skor artar, hedef skora ulaşınca oyun biter.
Sıra Sizde: Bildiğiniz bir oyundan üç durum seçin (yukarıdaki gibi). Her birini kısa bir koşul cümlesi olarak yazın; ardından ya küçük bir if/else iskeleti ya da bir akış şeması çizin.
İç içe if / else ve mantıksal operatör eşdeğerliği
Bir if bloğunun içine başka bir if (ve isteğe bağlı else) yazmak iç içe koşul (nested conditional) adını alır: önce dış koşul, doğruysa iç koşul sorulur. Her düzeydeki koşul tek bir karşılaştırma olmak zorunda değildir; && / || / ! ile birleştirilmiş daha karmaşık ifadeler de yazılabilir (ör. can > 0 && skor < 10). else yalnızca gerçekten yapılacak bir iş varken eklenir; boş else { } bloğu gereksizdir.
Örnek 1
Skor yalnızca can varken ve oyun bitmemişken artsın. İç içe if ile tek if + && aynı kararı verir:
Kod 15.
if (can > 0) { if (!oyunBitti) { skor = skor + 1; }}Kod 16.
if (can > 0 && !oyunBitti) { skor = skor + 1;}
Görsel 5 Örnek 1’in iki yazımını yan yana gösterir.
Örnek 2
else dallarında farklı mesajlar:
Kod 17.
if (can > 0) { if (!oyunBitti) { skor = skor + 1; mesaj = "Devam"; } else { mesaj = "Oyun bitti"; }} else { mesaj = "Can yok";}
Görsel 6 üç yolu ayırır: devam, oyun bitti, can yok.
Örnek 3
Dış koşulda birden fazla ifade (&&); içeride skor eşiği. Her dal farklı işlem yapar:
Kod 18.
if (can > 0 && !oyunBitti) { if (skor >= 10) { mesaj = "Seviye atlandı"; oyunBitti = true; } else { mesaj = "Skor yetersiz"; }} else { mesaj = "Oyuna devam edilemez";}
Görsel 7 önce can > 0 && !oyunBitti sorusunu, ardından skor eşiğini izler.
Bilgi: || için de benzer bir eşdeğerlik vardır. Örneğin “can bitti veya süre bitti → oyunu bitir” kuralı ardışık iflerle veya if (can === 0 || sure === 0) ile yazılabilir.
Sıra Sizde: Aşağıdaki kodu çalıştırmadan önce konsolda hangi satırların, hangi sırayla görüneceğini yazın. Karşılaştırma (>, <, ===, !==, >=) ve mantıksal (&&, ||, !) operatörler ile if / else if / else dallarını adım adım izleyin. Sonra p5.js Web Editor’de setup içine yapıştırıp konsoldan doğrulayın.
Kod 19.
let x = 15;let y = 8;let aktif = true;let seviye = 2; console.log("basla"); if (x > 10 && y < 10) { console.log("bolge-icinde");} else { console.log("bolge-disinda");} if (!aktif || seviye === 1) { console.log("beklet");} else if (seviye >= 2 && x === 15) { console.log("ilerle");} else { console.log("bekle");} let sonuc = (x >= 10 && y !== 0) || !aktif;console.log(sonuc);Yapay Zekâ Etkileşimi: Koşul Cümlesi Tasarlama
Amaç: if/else yapısını günlük dildeki koşullarla eşleştirerek pekiştirmek.
Adım 1: Üç kısa oyun kuralı yazın (ör. “can sıfırsa bitir”, “skor 10 olunca seviye atla”).
Adım 2: Yapay zekâya bunları if/else if/else iskeletine çevirmesini söyleyin.
Adım 3: Üretilen kodda = / === ve && kullanımını kontrol edin; hatalı atamaları düzeltin.
Yapay Zekâ Etkileşimi: Sketch Okunabilirliğini Gözden Geçirme Tahmini etkinliği tamamlama süresi: 15–20 dakika.
Amaç: Yazılan bir sketch’in okunabilirliğini (girinti, değişken adlandırma vb.) yapay zekâya kontrol ettirmek.
Adım 1: Bu ana başlıkta yazdığınız bir sketch’i (örneğin sıcaklık rengi) kopyalayın. Adım 2: Tercih ettiğiniz bir yapay zekâ sohbet robotunu açın. Adım 3: Aşağıdaki istemi girin.
Örnek İstem: "Bir p5.js sketch’im var. Okunabilirlik açısından incele: girinti (indentation) tutarlı mı, değişken adları anlamlı mı (camelCase), sabitler BÜYÜK_HARF mi, gereksiz karmaşık yerler var mı? Kısa madde madde öneri ver; kodun mantığını değiştirme. Kod: [sketch]"
Adım 4: Önerileri uygulayıp editörde tekrar çalıştırın. Davranış aynı kalmalı; yalnızca okunuş iyileşmeli.
Özet
Değişkenler, programın çalışma sırasında okuyup güncelleyebildiği isimlendirilmiş bellek alanlarıdır. let değişebilir, const değişmez bağlar kurar; örneklerde skor ve konum için let, tuval boyutu gibi sabitler için const tercih edilir. Number, string ve boolean temel türlerdir; string birleştirme ve .length kısa metin işlemlerinde yeterlidir.
Atama (=) değer yazar; karşılaştırma (===, <, >) ise doğru/yanlış üretir. Mantıksal operatörler birden fazla koşulu birleştirir: && tümünün doğru olmasını, || en az birinin doğru olmasını, ! ise değillemeyi sağlar. if / else if / else zinciri bu koşullara göre farklı kod yollarını seçer. İç içe if ile tek if + && çoğu zaman aynı kararı verir; ara adım yoksa birleşik koşul daha sadedir.
Oyun kodunda koşul çoğu zaman draw() veya olay fonksiyonu içinde okunur; yanlış yerde yazılan atama veya = / === karışıklığı sessiz hatalara yol açar. Bu ana başlığın çıktısı, bir sonraki adımda fare girdisi ve mesafe hesabıyla birleşecek sağlam bir karar verme iskeletidir.
Neler Öğrendik?
Soru 1
let skor = 0 ile const GENISLIK = 400 arasındaki temel fark nedir?
A) İkisi de sonradan değiştirilebilir
B) let değişebilir bağ, const yeniden atanamaz
C) const yalnızca string tutar
D) let yalnızca setup içinde çalışır
E) Fark yoktur
Soru 2
can > 0 && !oyunBitti ifadesi ne zaman true olur?
A) can sıfır ve oyun bitmişken
B) can pozitif ve oyun bitmemişken
C) Yalnızca can sıfırken
D) Yalnızca oyun bitmişken
E) Her frame zorunlu true
Soru 3
x = 5 ile x === 5 farkı nedir?
A) İkisi de karşılaştırır
B) = atar, === karşılaştırır
C) === atar, = karşılaştırır
D) İkisi de string birleştirir
E) Yalnızca = boolean üretir
Soru 4
else if ne zaman devreye girer?
A) Önceki if koşulları false ise ve kendi koşulu true ise
B) Her zaman if ile birlikte
C) Yalnızca setup içinde
D) draw hiç çağrılmazsa
E) Yalnızca fare tıklanınca
Neler Öğrendik Yanıt Anahtarı
Soru 1: Doğru Cevap: B
- Çözüm:
constile bağlanan tanımlayıcıya yeni değer atanamaz;letgüncellenebilir. - İlgili Konu: 3.1. Değişkenler ve Veri Türleri
Soru 2: Doğru Cevap: B
- Çözüm:
&&her iki yanın true olmasını ister;!oyunBitti’yi tersine çevirir. - İlgili Konu: 3.2. Karşılaştırma ve Mantıksal Operatörler
Soru 3: Doğru Cevap: B
- Çözüm: Tek
=atamadır;===sıkı eşitlik karşılaştırmasıdır. - İlgili Konu: 3.2. Karşılaştırma ve Mantıksal Operatörler
Soru 4: Doğru Cevap: A
- Çözüm: else if, önceki dallar tutmazsa kendi koşulunu dener.
- İlgili Konu: 3.3. if, else if ve else Yapıları
Yararlanılan Kaynaklar
Bu içerik aşağıdaki kaynaklardan derlenerek hazırlanmıştır:
- McCarthy, L., Reas, C., & Fry, B. (2015). Make: Getting Started with p5.js. Maker Media.
- MDN Web Docs. (n.d.). JavaScript Guide. Mozilla. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
- p5.js Foundation. (n.d.). dist(). p5.js Reference. https://p5js.org/reference/p5/dist/
- p5.js Foundation. (n.d.). mouseX. p5.js Reference. https://p5js.org/reference/p5/mouseX/
- p5.js Foundation. (n.d.). random(). p5.js Reference. https://p5js.org/reference/p5/random/
- Shiffman, D. (n.d.). Code! Programming with p5.js. The Coding Train. https://thecodingtrain.com/tracks/code-programming-with-p5-js
- Sweigart, A. (2017). Invent Your Own Computer Games with Python (4th ed.). No Starch Press. (Benzer mini oyun örnekleri için.)
- The Coding Train. (n.d.). Games [Öğretici parkur]. https://thecodingtrain.com/tracks/games/