Bölüm 1 — Amaç ve Kapsam

Genel Amaç

Bu bölümün temel amacı, programlamaya sıfırdan başlayan bireye algoritmik düşünce, JavaScript temel yapıları ve p5.js ile etkileşimli çizim becerisini kazandırmak; değişken, operatör ve koşullu ifadelerle karar veren sketch’ler yazdırarak fare etkileşimli ilk mini oyuna güvenli bir geçiş hazırlamaktır. Bölüm boyunca her ana başlık kendi içinde amaç, öğrenme çıktıları, örnek kod ve değerlendirme sorularıyla tamamlanır; böylece bir sonraki bölüme geçmeden önce ölçülebilir kazanımlar elde edilir.

Kapsam

Bu bölüm şu ana başlıklar altında ele alınmaktadır:

Ana Başlık 1: Programlama, p5.js ve İlk Sketch

Ana Başlık 2: Koordinat Sistemi, Çizim, setup ve draw

Ana Başlık 3: Değişkenler, Operatörler ve Koşullu İfadeler

Ana Başlık 4: Fare Girdisi ve Daire Tıklama Oyunu


Ana Başlık 1. Programlama, p5.js ve İlk Sketch

Amaç: Programlama ve algoritma kavramlarını tanıtarak p5.js Web Editor ortamını kurmak ve ilk sketch’i çalıştırmak.

Öğrenme Çıktıları:

Anahtar Sözcükler: programlama, algoritma, yaratıcı kodlama, p5.js, Web Editor, sketch

Giriş

Oyun programlama, ekranda hareket eden şekillerden önce düşünme biçimiyle başlar. Bilgisayara verilecek iş, belirsiz bir istek değil; sonlu, açık ve sıralı adımlar dizisi olmalıdır. Bu dizinin adı algoritmadır; adımların bir dilde yazılması ise programlamadır. Günlük bir çay demleme sırası bile algoritmik düşünceye örnektir: sırayı bozmak sonucu bozar.

Bu ana başlıkta programlama ve algoritma kısaca tanımlanır; ardından yaratıcı kodlama bağlamında p5.js seçilir. p5.js’in eğitimdeki gücü, kurulum yükünü düşürüp her denemenin tarayıcıda hemen görünmesidir. Web Editor ile hesap oluşturma, yeni sketch açma ve Run ile çalıştırma adım adım işlenir. Henüz koordinat geometrisi ve setup/draw döngüsünün ayrıntısına girilmez; önce ortamın “çalışır bir sayfa” olduğu güveni kurulur. Böylece bir sonraki ana başlıkta çizim komutları ve animasyon iskeleti sağlam bir zemin üzerinde anlatılabilir. 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.

1.1. Programlama Nedir? Algoritmik Düşünce

Tanım: Programlama — Bilgisayara belirli bir görevi yerine getirmesi için verilen, adım adım yazılmış talimatlar bütünüdür.

Tanım: Algoritma — Belirli bir problemi çözmek veya bir hedefe ulaşmak için izlenen sonlu, açık ve sıralı adımlar dizisidir.

Günlük yaşamda algoritmalar fark edilmeden sıkça kullanılır. Bir çay demleme süreci düşünüldüğünde adımlar şu şekilde sıralanabilir: suyu kaynat, demliğe çay koy, kaynar suyu ekle, belirli süre bekle, servis et. Bu adımlardan herhangi birinin atlanması veya yanlış sırada uygulanması istenen sonucu vermez. Bilgisayar programları da benzer mantıkla çalışır; ancak talimatların belirsizliğe yer bırakmayacak kadar kesin olması gerekir.

Algoritmik düşünce, büyük bir problemi daha küçük ve yönetilebilir alt problemlere ayırma becerisidir. Örneğin "basit bir oyun yap" ifadesi tek başına bir bilgisayar talimatı olamaz; ancak "ekranda bir daire çiz", "daireyi sağa hareket ettir", "daire kenara değdiğinde yönünü tersine çevir" gibi alt adımlara bölündüğünde uygulanabilir hale gelir. Oyun programlama eğitiminin temelinde bu parçalama ve sıralama becerisi yatar.

Programlama dilleri, algoritmaların bilgisayara aktarılması için kullanılan biçimsel sistemlerdir. Bu kitapta JavaScript dili ve onun görsel kütüphanesi olan p5.js kullanılacaktır. JavaScript, web tarayıcılarında ek bir eklenti kurmadan çalıştırılabilen ve günümüzde yaygın biçimde kullanılan dillerden biridir.

Bilgi: Algoritma kavramının adı, 9. yüzyıl Pers matematikçisi el-Harezmi'nin (Al-Khwarizmi) adından türemiştir; zamanla «belirli kurallara göre çözüm yöntemi» anlamını kazanmıştır.

1.2. Yaratıcı Kodlama ve p5.js Kütüphanesi

Tanım: Yaratıcı kodlama (creative coding) — Yazılım geliştirmenin teknik disiplini ile görsel sanatların ifade biçimlerini birleştiren, estetik ve etkileşimli dijital eserler üretmeyi hedefleyen yaklaşımdır.

p5.js kütüphanesi, 2001 yılında Massachusetts Teknoloji Enstitüsü'nde (MIT) geliştirilen Processing dilinin felsefesini modern web teknolojilerine taşır. Processing'in yaratıcıları Ben Fry ve Casey Reas, programlamayı sanatçılar ve tasarımcılar için erişilebilir kılma amacı gütmüştür. p5.js ise 2014 yılında Lauren McCarthy önderliğinde JavaScript ve HTML5 tabanlı olarak hayata geçirilmiştir.

p5.js'in oyun programlama eğitimindeki temel avantajları şu şekilde özetlenebilir:

Klasik metin tabanlı programlama öğretiminde öğrenilen soyut kavramlar (değişken, döngü, koşul) ilk başta yalnızca konsol çıktısı olarak görülür; bu durum motivasyonu düşürebilir. p5.js ile aynı kavramlar renkli şekiller, hareketli nesneler ve oyun mekanikleri üzerinden deneyimlenir.

Bilgi — üretken sanat (generative art) ve Genuary: Yaratıcı kodlama sıkça üretken sanat (generative art) ile kesişir: görüntü, kural ve rastgelelik kodla üretilir; sonuç her çalıştırmada biraz farklı olabilir. p5.js bu alanda özellikle yaygındır çünkü kurulum hafiftir ve görsel geri bildirim anındadır. Her ocak ayında düzenlenen Genuary etkinliğinde katılımcılar günlük istemlere (prompt) göre kod sanatı üretir; birçok örnek p5.js ile yapılır. Hazır işleri görmek ve fikir toplamak için OpenProcessing, p5.js Web Editor galerisi ve Coding Train / Patt Vira kanalları iyi başlangıç noktalarıdır. Bu kitap oyun mekaniğine odaklanır; üretken sanat zorunlu değildir, merak için yan kapıdır.

Dikkat: p5.js bir oyun motoru (game engine) değildir. Unity veya Godot gibi hazır fizik, sahne yönetimi ve varlık (asset) sistemleri sunmaz. Bu kitapta oyun mekanikleri sıfırdan kodlanacak; böylece arka plandaki mantık adım adım izlenebilecektir.

Bilgi: p5.js çekirdeğinin yanında ek kütüphaneler de vardır. Örneğin p5.play sprite (hareketli görsel nesne), animasyon ve basit çarpışma kolaylıkları sunar; Matter.js gibi fizik motorları yerçekimi ve sert cisim çarpışmasını simüle edebilir. Bu araçlar prototipi hızlandırır ancak “sihirli kutu” gibi davranabilir. Bu kitapta amaç temelleri görünür kılmak olduğu için bu tür ek kütüphaneler kullanılmaz; ileride ihtiyaç duyulursa p5.js kütüphanelerine bakılabilir.

1.3. p5.js Web Editor Kurulumu ve İlk Sketch

p5.js ile çalışmaya başlamak için p5.js Web Editor kullanıldığında ayrı bir yazılım indirmeye gerek yoktur. p5.js Web Editor (https://editor.p5js.org/) adresine gidildiğinde hazır bir proje şablonu açılır. Bu kitabın ilk bölümlerinde Web Editor yeterlidir ve örnekler buna göre anlatılır.

Aynı p5.js kodu, birçok programcının kullandığı yerel editörlerde de yazılabilir — örneğin Visual Studio Code (VS Code) veya benzeri bir editör. Yerel kurulumda tipik adımlar şunlardır:

  1. Bilgisayara VS Code (veya tercih ettiğiniz editör) kurulur.
  2. Boş bir klasör açılır; içine en az iki dosya konur: index.html ve sketch.js.
  3. index.html, p5.js kütüphanesini (çoğu zaman CDN üzerinden) ve sketch.js dosyasını yükler; sketch.js içine setup / draw yazılır.
  4. Klasör bir yerel sunucu ile tarayıcıda açılır (VS Code’da yaygın yol: Live Server eklentisi). index.html dosyasına çift tıklamak bazı tarayıcılarda kısıtlara takılabilir; bu yüzden yerel sunucu önerilir.

Tanım: CDN (Content Delivery Network, içerik dağıtım ağı) — Kütüphane dosyasını (ör. p5.min.js) kendi klasörünüze indirmeden, internetteki bir adresten tarayıcıya yükleme yoludur. Aşağıdaki script src="https://cdn.jsdelivr.net/..." satırı buna örnektir: bilgisayarınızda p5.js kopyası olmasa da sketch çalışır. İnternet bağlantısı gerekir; çevrimdışı çalışmak için dosyayı indirip yerel yoldan bağlamak gerekir (p5.js Download).

Örnek index.html iskeleti (CDN ile — p5.js uzak adresten yüklenir):

Kod 1.

html
<!DOCTYPE html><html lang="tr"><head>  <meta charset="utf-8"/>  <script src="https://cdn.jsdelivr.net/npm/p5@1.11.3/lib/p5.min.js"></script></head><body>  <script src="sketch.js"></script></body></html>

Bilgi: Resmi indirme ve kurulum seçenekleri için p5.js Download sayfasına bakılabilir. Kitap örneklerini denemek için Web Editor en hızlı yoldur (hesap açıp hemen Play). Proje büyüyüp birden fazla dosyaya yayıldığında veya değişiklikleri Git ile kaydetmek / geri almak istediğinizde dosyaları bilgisayarınızdaki bir klasörde tutmak (yerel ortam) daha uygundur.

Editör arayüzü dört temel bölümden oluşur:

  1. Dosya paneli (sol): Projedeki dosyaların listelendiği kenar çubuğu (sketch.js, index.html, style.css).
  2. Kod paneli: JavaScript/p5.js kodunun yazıldığı alan; satır numaraları ve sketch.js sekmesi bulunur.
  3. Önizleme paneli (sağ): Kodun çalıştırıldığında oluşan görsel çıktı.
  4. Konsol (alt): Hata mesajlarının ve console.log() çıktılarının görüntülendiği alan.

Görsel 1. p5.js Web Editor arayüzü — kod paneli, önizleme ve konsol
Görsel 1. p5.js Web Editor arayüzü — kod paneli, önizleme ve konsol

Görsel 1 p5.js Web Editor’ün bir ekran görüntüsüdür. Solda dosya listesi ve kod paneli (sketch.js), üstte Play / Stop, sağda önizleme (tuval), altta konsol görülür. Örnekte frameCount ile hareket eden daire önizlemede; console.log çıktısı konsolda listelenir.

Tanım: console.log() — JavaScript'te konsola (alt panel) metin veya değer yazdıran fonksiyon. Önizleme tuvalinde görünmez; hata ayıklama ve değer gözlemi için kullanılır. Parantez içine bir metin ("Sketch başladı") veya birden fazla değer (console.log("sayac:", sayac)) verilebilir. Sketch çalıştırıldığında çıktı alt konsolda listelenir.

Her p5.js projesi bir "sketch" (taslak) olarak adlandırılır. Sketch dosyası en az iki fonksiyon içerir: setup() ve draw(). İlk sketch aşağıdaki gibi görünür:

Kod bloğu: p5.js'in en basit sketch iskeleti — yalnızca gri arka plan çizer; // ve /* … */ yorum örnekleri içerir.

Kod 2.

javascript
function setup() {  /* Tuval boyutunu bir kez ayarlar.     Bu blok, birden fazla satırı kapsayan yorum örneğidir. */  createCanvas(400, 400); // 400x400 piksel tuval oluştur} function draw() {  background(220); // Açık gri arka plan}

Tanım: Yorum (comment) — Kodun yanına veya üstüne yazılan, programın çalışmasını etkilemeyen açıklama metnidir. JavaScript’te satır sonuna kadar süren tek satırlık yorum // ile başlar; birden fazla satırı kapsayan yorum /* ile açılıp */ ile kapanır. Yorumlar hem okuyana hem gelecekteki size ne yapıldığını hatırlatır; bu kitapta çoğunlukla // kullanılır.

createCanvas(400, 400) komutu, 400 piksel genişliğinde ve 400 piksel yüksekliğinde bir çizim alanı (canvas) oluşturur. background(220) komutu ise draw() her çalıştığında arka planı açık gri renge boyar. Renk değeri 0 (siyah) ile 255 (beyaz) arasında bir sayıdır.

Kod yazıldıktan sonra ▶ (Play) düğmesine basıldığında sketch çalışır ve sağ panelde gri bir kare görünür. Kaydetmek için File > Save veya Ctrl+S (Mac: Cmd+S) kullanılabilir; hesap oluşturulduğunda projeler bulutta saklanır.

Dikkat: JavaScript'te satır sonuna noktalı virgül (;) koymak sözdizimi açısından çoğu durumda zorunlu değildir; JavaScript satır sonlarını çoğu zaman otomatik ayırır. Yine de noktalı virgül kullanmak belirsizliği azaltır; örneklerde tutarlı biçimde kullanılır. Parantez () ve süslü parantez {} eşleşmelerine dikkat edilmelidir; eksik parantez en sık karşılaşılan sözdizimi hatalarından biridir.

Yapay Zekâ Etkileşimi: Algoritmayı Adımlara Bölme Tahmini süre: 15–20 dakika.

Amaç: Belirsiz bir oyun isteğini algoritmik alt adımlara ayırmayı pekiştirmek.

Adım 1: “Ekranda zıplayan bir top” hedefini kendi cümlelerinizle 5–7 adıma bölün. Adım 2: Yapay zekâya aynı hedefi adım adım yazdırın; sizin listenizle karşılaştırın. Adım 3: Eksik veya sırası yanlış adımları düzeltin; henüz kod istemeyin — yalnızca sıralı talimat listesi isteyin.

Özet

Programlama, bir bilgisayara belirli bir görevi yaptırmak üzere adım adım yazılan talimatlar bütünüdür; algoritma ise bir hedefe ulaşmak için izlenen sonlu, açık ve sıralı adımlar dizisidir. Çay demleme gibi gündelik bir rutin bile bu tanıma uyar, çünkü adımlardan biri atlandığında veya sıra bozulduğunda sonuç değişir. Algoritmik düşüncenin oyun bağlamındaki karşılığı, büyük bir isteği yönetilebilir alt problemlere ayırmaktır: “basit bir oyun yap” ifadesi tek başına bir talimat sayılmazken, ekrana daire çizmek, daireyi sağa hareket ettirmek ve kenara değince yönü tersine çevirmek gibi adımlar uygulanabilir hâle gelir.

Yaratıcı kodlama, yazılımın teknik disiplinini görsel ifade biçimleriyle birleştirerek etkileşimli çıktıyı öğrenmenin merkezine koyar. p5.js bu yaklaşımı tarayıcıda düşük sürtünmeyle sunar; Processing’in felsefesini modern web teknolojilerine taşır, kurulum yükünü kaldırır ve anında görsel geri bildirim sağlar. Buna karşılık p5.js bir oyun motoru değildir: hazır fizik, sahne yönetimi ve varlık sistemleri sunmadığı için mekanikler bu kitapta sıfırdan yazılır.

Uygulama ortamı p5.js Web Editor’dır; dosya paneli, kod alanı, önizleme ve konsol birlikte okunur, console.log çıktıları alt panelde izlenir. Her proje bir sketch’tir ve en az setup ile draw fonksiyonlarını içerir; en sade örnek createCanvas ile tuvali kurup background ile arka planı boyar. İlk sketch’in amacı sözdizimi ezberi değil, çalışan bir sayfanın güvenini kurmaktır; koordinat sistemi ve setup/draw ayrımı bir sonraki ana başlıkta ele alınır.

Neler Öğrendik?

Soru 1 Algoritma için en uygun tanım hangisidir?

A) Rastgele seçilen renk listesi

B) Belirli bir hedefe giden sonlu, açık ve sıralı adımlar

C) Yalnızca fare tıklaması

D) CSS dosyasının adı

E) FPS değerinin kendisi

Soru 2 p5.js Web Editor’da sketch’i çalıştırmak için tipik adım nedir?

A) Yalnızca dosyayı silmek

B) Run ile çalıştırıp tuval çıktısını görmek

C) DNS kaydı oluşturmak

D) setup’ı silmek

E) İnterneti kapatmak

Soru 3 Yaratıcı kodlamanın eğitimdeki temel katkısı nedir?

A) Görsel çıktıyla kavramı hemen gözlemlenebilir kılmak

B) Klavyeyi tamamen kaldırmak

C) Matematığı yasaklamak

D) Yalnızca sunucu tarafı yazmak

E) Renk körlüğünü zorunlu kılmak

Soru 4 “Basit bir oyun yap” ifadesi neden doğrudan talimat sayılmaz?

A) Çünkü alt adımlara bölünmeden uygulanamaz

B) Çünkü p5.js desteklemez

C) Çünkü tarayıcı kapanır

D) Çünkü frameCount yasaktır

E) Çünkü değişken kullanılamaz

Neler Öğrendik Yanıt Anahtarı

Soru 1: Doğru Cevap: B

Soru 2: Doğru Cevap: B

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:


Ana Başlık 2. Koordinat Sistemi, Çizim, setup ve draw

Amaç: Tuval koordinatlarını ve temel çizim komutlarını öğreterek setup/draw ayrımıyla ilk animasyon iskeletini kurmak.

Öğrenme Çıktıları:

Anahtar Sözcükler: koordinat, canvas, rect, ellipse, fill, stroke, setup, draw, frameCount

Giriş

Önceki ana başlıkta ortam kuruldu ve ilk sketch çalıştırıldı. Şimdi soru şudur: şekil tuvalde nereye çizilir ve her frame’de ne yinelenir? p5.js tuvali, sol üst köşesi (0,0) olan bir koordinat düzlemidir; x sağa, y aşağı artar. Bu yön, matematik defterindeki eksenden farklıdır ve konum hatalarının çoğunun kaynağıdır.

rect, ellipse, line gibi komutlar bu düzlemde geometri üretir; fill, stroke, background ise rengi ve temizliği yönetir. Zaman boyutu setup ile draw ayrımında belirir: bir kez hazırlık, sonra her frame tekrar. frameCount bu tekrara sayaç ekler. Bu ana başlık çizim dilini ve oyun döngüsünün en sade biçimini kurar; koşullu kararlar ve fare bir sonraki konularda gelecektir. 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.

2.1. Koordinat Sistemi ve Temel Çizim Komutları

p5.js'te çizim yapılan alan bir koordinat düzlemidir. Matematikteki koordinat sisteminden farklı olarak, p5.js'te Y ekseni aşağı doğru artar. Köşegenin sol üst noktası (0, 0) orijinidir; X sağa, Y aşağı doğru büyür.

Görsel 1. Canvasta koordinatlar — dikmeler, eksen sayıları, rect ve ellipse
Görsel 1. Canvasta koordinatlar — dikmeler, eksen sayıları, rect ve ellipse

Görsel 1 canvas üzerinde koordinat okumayı gösterir. Sağda point, rect, ellipse, line ve text imzaları ile parametrelerin anlamı yer alır; rect için w/h eksen farkından hesaplanır. Eksenlerdeki her sayı ayrı renktedir; aynı değer fonksiyon çağrısında da aynı renkle yazılır.

Bu düzen, Canvas API ve p5.js dahil çoğu ekran tabanlı grafik kütüphanesinde yaygındır: piksel satırları yukarıdan aşağı numaralandırıldığı için Y ekseninin aşağı yönlü artması teknik olarak pratiktir.

Temel çizim komutları:

Tablo 1.

Komut Açıklama Örnek Örnekte ne olur?
rect(x, y, w, h) Dikdörtgen çizer. (x, y) sol üst köşe; w genişlik, h yükseklik (piksel). rect(50, 50, 100, 80) Sol üst köşesi (50, 50) olan, 100 piksel genişliğinde ve 80 piksel yüksekliğinde bir dikdörtgen çizilir.
ellipse(x, y, w, h) Elips veya daire çizer. (x, y) merkez; w yatay çap, h dikey çap (dairede eşit). ellipse(200, 200, 60, 60) Merkezi (200, 200) olan, yatay ve dikey çapı 60 piksel olan bir daire çizilir.
line(x1, y1, x2, y2) Doğru parçası çizer. (x1, y1) başlangıç noktası; (x2, y2) bitiş noktası. line(0, 0, 400, 400) Tuvalin sol üst köşesinden (0, 0) sağ alt köşesine (400, 400) uzanan bir köşegen çizgi çizilir.
point(x, y) Tek piksel nokta çizer. (x, y) noktanın konumu. point(100, 150) (100, 150) konumuna tek bir nokta konur.
text(metin, x, y) Tuvale metin yazar. metin yazılacak string (veya sayı); (x, y) metnin konumu (varsayılan hizalama sol-alt). text("Skor: 7", 20, 40) "Skor: 7" yazısı, varsayılan hizalamayla yaklaşık (20, 40) konumundan başlayarak ekrana basılır.
fill(r, g, b) Sonraki şekillerin iç dolgu rengini ayarlar (r, g, b: 0–255). Tek sayı gri ton da olabilir. fill(255, 0, 0) Sonraki şekillerin içi kırmızıya boyanır.
stroke(r, g, b) Sonraki şekillerin kenar çizgisi rengini ayarlar. stroke(0) Sonraki şekillerin kenarı siyah çizilir.
strokeWeight(kalinlik) Kenar çizgisinin kalınlığını piksel cinsinden ayarlar. strokeWeight(2) Kenar çizgisi 2 piksel kalınlığında olur.
noFill() Dolguyu kapatır; yalnızca kenar çizilir. — Sonraki şekillerde iç dolgu olmaz; yalnızca çerçeve görünür (aşağıdaki görsele bakın).
noStroke() Kenar çizgisini kapatır; yalnızca dolgu görünür. — Sonraki şekillerde kenar çizilmez; yalnızca dolgu görünür (aşağıdaki görsele bakın).

strokeWeight(): kalınlık farkı

strokeWeight kenarın ne kadar kalın çizileceğini ayarlar (piksel). Farkı görmek için aynı boyutta iki kareyi abartılı değerlerle çizmek yeterlidir: biri ince (1), diğeri çok kalın (50).

Kod bloğu: Aynı 100×100 kare — yalnızca strokeWeight farklı.

Kod 1.

javascript
function setup() {  createCanvas(500, 500);} function draw() {  background(230, 235, 240);   strokeWeight(1);  rect(100, 100, 100, 100);   strokeWeight(50);  rect(100, 300, 100, 100);}

Her iki rect çağrısı da 100×100 karedir; tek fark kenar kalınlığıdır. Alttaki kare gözle çok daha büyük görünür çünkü kenar, şeklin sınırının ortasına oturur: biraz içeri, biraz dışarı taşar. Kalınlık 50 olunca dışarı taşan kısım (~25 piksel her yönde) hemen fark edilir.

Görsel 2. Aynı 100×100 kare — strokeWeight(1) ve strokeWeight(50)
Görsel 2. Aynı 100×100 kare — strokeWeight(1) ve strokeWeight(50)

Görsel 2 yukarıdaki kodun çıktısıdır. Üstte strokeWeight(1), altta strokeWeight(50); her iki kare de kodda 100×100’dür. Kalın kenarın yarısı sınırın içinde, yarısı dışındadır — bu yüzden alttaki şekil şişmiş gibi durur.

Aynı etki daire, çizgi ve noktada da görülür; büyütülmüş piksel ızgarası kenarın sınırın ortasına oturduğunu tek tek piksel olarak gösterir:

Kod bloğu: Farklı şekillerde strokeWeight.

Kod 2.

javascript
function setup() {  createCanvas(520, 280);  noLoop();} function draw() {  background(245);  noFill();  stroke(0);   strokeWeight(2);  ellipse(80, 80, 70, 70);  strokeWeight(12);  ellipse(200, 80, 70, 70);   strokeWeight(3);  rect(40, 160, 70, 50);  strokeWeight(10);  rect(150, 160, 70, 50);   strokeWeight(2);  line(300, 50, 480, 50);  strokeWeight(8);  line(300, 90, 480, 90);   strokeWeight(4);  point(340, 180);  strokeWeight(16);  point(420, 180);}

Görsel 3. strokeWeight — daire, dikdörtgen, çizgi, nokta ve büyütülmüş piksel
Görsel 3. strokeWeight — daire, dikdörtgen, çizgi, nokta ve büyütülmüş piksel

Görsel 3 solda bu kodun tuval çıktısını, sağda rect + strokeWeight(2) için büyütülmüş piksel ızgarasını gösterir. Kesik çizgi şeklin verdiğiniz boyutudur; koyu kenarın bir sırası içerde, bir sırası dışarıdadır.

noFill() ve noStroke(): kod ve çıktı

fill() / stroke() şekilden önce yazılır. Aşağıdaki sketch aynı daireyi dört kombinasyonda çizer: fill() + stroke(), noFill() + stroke(), fill() + noStroke(), noFill() + noStroke().

Kod bloğu: Dört fill/stroke kombinasyonu.

Kod 3.

javascript
function setup() {  createCanvas(400, 200);  noLoop();} function draw() {  background(245);   // 1) fill() + stroke()  fill(50, 100, 220);  stroke(0);  strokeWeight(3);  ellipse(50, 100, 70, 70);   // 2) noFill() + stroke()  noFill();  stroke(0);  ellipse(150, 100, 70, 70);   // 3) fill() + noStroke()  fill(50, 100, 220);  noStroke();  ellipse(250, 100, 70, 70);   // 4) noFill() + noStroke() → daire görünmez  noFill();  noStroke();  ellipse(350, 100, 70, 70);}

Görsel 4. Dört kullanım — fill()+stroke(), noFill()+stroke(), fill()+noStroke(), noFill()+noStroke()
Görsel 4. Dört kullanım — fill()+stroke(), noFill()+stroke(), fill()+noStroke(), noFill()+noStroke()

Görsel 4 aynı ellipse() çağrısını dört kombinasyonda gösterir: (1) fill() + stroke(), (2) noFill() + stroke(), (3) fill() + noStroke(), (4) noFill() + noStroke() (şekil görünmez). Arka plandaki çizgiler, dolgu kapalıyken içinin boş olduğunu vurgular.

fill / stroke ayarı çizim sırasında değişebilir

fill(), stroke(), noFill() ve noStroke() bir sketch içinde birden fazla kez kullanılabilir. Her çizim komutu, o anda geçerli olan ayarla çalışır; önceki şekiller değişmez.

Kod bloğu: Aralara çizim serpiştirilmiş yedi adım.

Kod 4.

javascript
function setup() {  createCanvas(620, 200);  noLoop();} function draw() {  background(245);   // ① kırmızı dolgu + kenar  fill(220, 50, 50);  stroke(0);  strokeWeight(2);  rect(20, 70, 70, 50);   // ② yalnız kenar  noFill();  stroke(0);  ellipse(140, 95, 64, 64);   // ③ mavi dolgu, kenarsız  fill(50, 100, 220);  noStroke();  ellipse(230, 95, 64, 64);   // ④ yeşil dolgu + kenar  fill(46, 125, 50);  stroke(0);  strokeWeight(2);  rect(290, 65, 60, 60);   // ⑤ görünmez  noFill();  noStroke();  ellipse(400, 95, 64, 64);   // ⑥ turuncu çizgi (line'da fill kullanılmaz)  stroke(255, 152, 0);  strokeWeight(4);  line(450, 60, 520, 130);   // ⑦ mor dolgu + kenar  fill(186, 104, 200);  stroke(0);  strokeWeight(3);  ellipse(560, 95, 64, 64);}

Görsel 5. Yedi adımda fill/stroke değişimi — her şekil çizildiği andaki ayarla
Görsel 5. Yedi adımda fill/stroke değişimi — her şekil çizildiği andaki ayarla

Görsel 5 aynı sketch’teki yedi çizimin çıktısını gösterir: kırmızı kenarlı dikdörtgen, yalnız kenarlı daire, kenarsız mavi daire, yeşil kenarlı kare, ardından noFill() + noStroke() ile çizilen (bu yüzden görünmeyen) daire, turuncu çizgi ve mor kenarlı daire.

RGB renk modeli ve p5.js'te kullanım

Tanım: RGB (Red-Green-Blue) — Ekran rengini kırmızı (R), yeşil (G) ve mavi (B) ışık bileşenlerinin karışımıyla ifade eden modeldir. p5.js'te her bileşen 0 ile 255 arasında bir tam sayıdır: 0 o bileşenin kapalı, 255 tam güçte olduğunu gösterir.

Ekran toplamsal (additive) karışım kullanır: bileşenler birleştikçe renk aydınlanır. Üç bileşen de 255 ise beyaza; hepsi 0 ise siyaha yaklaşılır. fill(255, 255, 0) sarıya, fill(0, 255, 255) cyan'a, fill(255, 0, 255) magentaya yakındır.

Aşağıdaki tabloda her satır bir örnek komuttur; parantez içindeki sayılar sırasıyla R, G, B (veya tek sayıda gri ton) okunur.

Tablo 2.

Örnek komut R / G / B okuması Sonuç
fill(255, 0, 0) R=255, G=0, B=0 Yalnızca kırmızı açık → tam kırmızı dolgu
fill(0, 255, 0) R=0, G=255, B=0 Yalnızca yeşil açık → tam yeşil dolgu
fill(0, 0, 255) R=0, G=0, B=255 Yalnızca mavi açık → tam mavi dolgu
fill(255, 255, 255) R=G=B=255 Üç bileşen tam güçte → beyaz dolgu
fill(0, 0, 0) R=G=B=0 Üç bileşen kapalı → siyah dolgu
fill(128) tek sayı = gri ton R=G=B=128 kabul edilir → orta gri
fill(220, 50, 50) R=220, G=50, B=50 Kırmızı baskın, yeşil/mavi düşük → soluk kırmızı

Bilgi — renk kodu seçme: RGB sayılarını ezbere bilmek gerekmez. Tarayıcıda çalışan renk seçici (color picker) araçları, bir rengi tıklayınca karşılık gelen R, G, B (veya hex) değerlerini gösterir. Örnekler: Google’ın “color picker” araması, HTML Color Codes, Coolors veya tarayıcı geliştirici araçlarındaki renk paneli. Beğenilen rengin üç sayısını fill / stroke / background içine yazmak yeterlidir.

Bilgi — diğer renk modelleri: Renk yalnızca RGB ile ifade edilmez. Örneğin HSB (Hue–Saturation–Brightness; p5.js’te colorMode(HSB)) veya HSL (Hue–Saturation–Lightness) ton / doygunluk / parlaklık üzerinden çalışır. Bu kitapta çizim ve oyun örnekleri RGB (ve isteğe bağlı alfa) ile sınırlıdır; HSB/HSL’ye girilmez.

p5.js'te renk veren başlıca komutlar aynı sayı biçimini paylaşır:

Tablo 3.

Biçim Örnek Kullanım
Gri ton (tek sayı) background(220) 0 siyah … 255 beyaz
RGB (üç sayı) fill(50, 100, 220) Kırmızı, yeşil, mavi
RGBA (dört sayı) fill(255, 0, 0, 120) Dördüncü değer alfa (opacity)

Tanım: Alfa (alpha) kanalı — Rengin ne kadar opak / saydam olduğunu belirleyen dördüncü bileşendir. p5.js’te alfa da 0–255 arasındadır: 0 tamamen görünmez (saydam), 255 tamamen opak, ara değerler yarı saydamdır. Aynı RGB ile fill(255, 0, 0) opak kırmızı, fill(255, 0, 0, 80) ise arkasındaki çizimin kısmen göründüğü soluk kırmızıdır. Üst üste binen şekillerde, HUD (Heads-Up Display — ekranın üstünde/köşesinde duran skor, can vb. bilgi paneli) veya vurgu efektlerinde sık kullanılır.

stroke(r, g, b) kenar çizgisi, background(r, g, b) tuval arka planı için aynı kuralları kullanır (background’a alfa vermek de mümkündür). Renk, şekilden önce ayarlanır: önce fill / stroke, sonra rect / ellipse / line. noFill() dolguyu, noStroke() kenarı kapatır; yalnızca kenarlı daire veya dolgusuz çerçeve çizmek için kullanılır.

Bilgi: fill ve stroke bir kez çağrılınca sonraki şekiller aynı rengi kullanır; yeni renk isteniyorsa komut yeniden yazılır.

Görsel 6. RGB örnekleri ve alfa kanalı — opak / yarı saydam / görünmez
Görsel 6. RGB örnekleri ve alfa kanalı — opak / yarı saydam / görünmez

Görsel 6 üstte temel RGB (ve gri) dolgularını, sonraki satırda cyan / magenta / turuncu gibi karışımları; en altta aynı kırmızı için alfa = 255 / 120 / 0 farkını gösterir. Tüm fill değerleri tam yazılır.

Kod bloğu: Temel geometrik şekillerin çizimi.

Kod 5.

javascript
function setup() {  createCanvas(400, 400);} function draw() {  background(240);   // Kırmızı dolgulu, siyah kenarlı dikdörtgen  fill(220, 50, 50);  stroke(0);  strokeWeight(2);  rect(50, 50, 120, 80);   // Mavi dolgulu daire  fill(50, 100, 220);  noStroke();  ellipse(280, 120, 90, 90);   // Yeşil çizgi  stroke(30, 180, 80);  strokeWeight(4);  line(50, 300, 350, 300);}

rect() fonksiyonunda (x, y) dikdörtgenin sol üst köşesini belirtir; ellipse() fonksiyonunda (x, y) elipsin merkezini belirtir. Bu fark, konumlandırma yaparken dikkat edilmesi gereken önemli bir ayrıntıdır.

2.2. setup() ve draw() Fonksiyonları

p5.js sketch'lerinin omurgasını setup() ve draw() fonksiyonları oluşturur.

Tanım: setup() — Program başladığında bir kez çalışan fonksiyondur; tuval oluşturma, başlangıç değişkenleri atama gibi hazırlık işlemleri burada yapılır.

Tanım: draw() — Hazırlık tamamlandıktan sonra sürekli tekrarlanan fonksiyondur; p5.js'te varsayılan olarak saniyede yaklaşık 60 kez çalışır (60 FPS — frames per second, saniyedeki frame sayısı). frameRate() fonksiyonu ile bu değer değiştirilebilir.

Tanım: Frame — draw() fonksiyonunun bir kez çalışması; ekranın bir kez güncellenmesi. Örneğin saniyede 60 FPS ise saniyede 60 frame üretilir.

Bu iki fonksiyonun ayrımı, oyun programlamanın temelini oluşturan oyun döngüsüne (game loop) hazırlık niteliğindedir. Gerçek bir oyunda setup() oyun dünyasını kurarken, draw() her frame'de girdileri okur, durumu günceller ve ekranı yeniden çizer.

Tablo 4.

Fonksiyon Ne sıklıkla çalışır? Tipik görevler
setup() Program başında bir kez createCanvas(), başlangıç değişkenleri, frameRate()
draw() Sketch durana kadar sürekli (her frame) background(), çizim, basit konum güncelleme

Tuval boyutu: width ve height

createCanvas(genislik, yukseklik) çalıştığında p5.js bir çizim alanı oluşturur. Bundan sonra tuvalin piksel cinsinden boyutları iki yerleşik değişkende tutulur:

Tablo 5.

Değişken Anlam createCanvas(500, 400) sonrası
width Tuval genişliği (piksel) 500
height Tuval yüksekliği (piksel) 400

width ve height değerleri createCanvas içine yazılan sayılarla eşleşir; kod içinde tuval kenarına hizalama veya ortalama yaparken kullanılır (ör. yatay orta nokta: width / 2). Bu değişkenler kullanıcı tarafından let ile tanımlanmaz; p5.js otomatik sağlar.

Farklı createCanvas çağrıları farklı oranlarda tuval üretir. Aşağıdaki görsel dört yaygın boyutu aynı ölçekte yan yana gösterir:

Görsel 7. Dört tuval boyutu — createCanvas genişlik × yükseklik
Görsel 7. Dört tuval boyutu — createCanvas genişlik × yükseklik

Görsel 7 sırasıyla createCanvas(200, 200), createCanvas(400, 200), createCanvas(200, 400) ve createCanvas(400, 400) ile oluşacak çizim alanlarının göreli boyutunu gösterir. Kare, yatay dikdörtgen ve dikey dikdörtgen farkı önizleme panelinde hemen görülür.

frameCount ve modulo

Tanım: frameCount — p5.js yerleşik değişkeni; draw() fonksiyonu her çalıştığında 1 artan sayaçtır. İlk draw() çağrısında 1, ikincisinde 2 olur.

Tanım: Modulo operatörü (%) — Bölümden kalanı verir. Örneğin 7 % 3 ifadesinin sonucu 1'dir. frameCount % width ifadesi, sayacı 0 ile width - 1 aralığında döngüsel tutar; animasyonda konumun sol kenardan tekrar başlamasını sağlar.

setup() ve draw() sırası

setup() ve draw() arasındaki ilişki doğrusaldır; geri dönen ok gerektirmez. Aşağıdaki sıralı liste yeterlidir:

  1. Program başlar.
  2. setup() bir kez çalışır — createCanvas() ve başlangıç ayarları burada yapılır.
  3. draw() ilk kez çalışır (1. frame).
  4. draw() ikinci kez çalışır (2. frame).
  5. draw() üçüncü kez çalışır (3. frame) … p5.js, sketch durdurulana kadar draw() çağrısını sürekli tekrarlar.

Özet: setup() hazırlığı bir defa yapar; draw() oyun döngüsünün (game loop) kalbidir ve her frame'de yeniden çalışır.

Görsel 8. setup() ve draw() çalışma sırası — hazırlık tek seferlik, draw sürekli tekrar
Görsel 8. setup() ve draw() çalışma sırası — hazırlık tek seferlik, draw sürekli tekrar

Görsel 8 program başlangıcında setup()'ın bir kez, ardından draw()'ın frame frame tekrarlandığını gösterir.

Kod bloğu: draw() tekrarıyla basit animasyon.

Kod 6.

javascript
function setup() {  createCanvas(400, 400);} function draw() {  background(30, 30, 60);   fill(255, 220, 50);  noStroke();  ellipse(frameCount % width, 200, 40, 40);}

frameCount % width ifadesi dairenin X konumunu her frame'de bir piksel sağa kaydırır; width değerine ulaşınca tekrar soldan başlar.

Örnek Olay: İlk Sketch'i Çalıştırma Tahmini etkinliği tamamlama süresi: 30–35 dakika.

Senaryo: p5.js Web Editor'e ilk kez giriş yapılmıştır. Ekranda yalnızca varsayılan boş sketch görünmektedir.

Durum Tespiti:

Problem Durumu: Kod yazılmadan önce ortamın ve temel çizim komutlarının deneyimlenmesi gerekir.

Tartışma Soruları:

Yapay Zekâ Etkileşimi: Referans Sayfası ve Yeni Çizim Fonksiyonları Tahmini etkinliği tamamlama süresi: 25–35 dakika.

Amaç: p5.js resmi belgelerini (reference / dokümantasyon) okuma alışkanlığı kazanmak; noLoop, loop, triangle, quad, square, ellipse, arc fonksiyonlarının ne işe yaradığını kaynaktan öğrenmek; takıldığınız noktalarda yapay zekâya yönelmek.

Not: Bu kitapta oyun örnekleri çoğunlukla rect, ellipse, line ve point ile ilerler; triangle, quad, square, arc, noLoop ve loop için sürekli ihtiyaç duymayacaksınız. Yine de bunları bilmek çizim dağarcığınızı ve genel programlama bilgi düzeyinizi artırır — bu yüzden referanstan tanımanız yeterlidir.

Bilgi — dokümantasyon neden önemli? Her programlama dilinin ve kütüphanenin bir resmi referans sayfası vardır: fonksiyonun adı, parametreleri, kısa açıklaması ve çoğu zaman çalışan örnek kod burada yer alır. Kitap veya video her komutu dökemez; yeni bir fonksiyon gördüğünüzde ilk bakılacak yer dokümantasyondur. Özellikle geniş kütüphanelerde yüzlerce, bazen binlerce fonksiyon bulunur — hepsini ezbere bilmek ne gerekir ne de mümkündür. Asıl beceri, ihtiyacınız olan komutu nerede arayacağınızı bilmek ve referansı okuyup doğru kullanmaktır. p5.js için bu adres p5.js Reference sayfasıdır. Yapay zekâ yardımcı olabilir; ancak önce resmi sayfayı okumak hem doğruyu hem de parametre sırasını öğrenmenin en güvenilir yoludur.

Adım 1 — Referansı okuyun. Aşağıdaki fonksiyonların her biri için p5.js referans sayfasını açın. Sayfada ne işe yaradığı, parametreler ve varsa örnek kod bölümlerine bakın; birer cümleyle kendi notlarınıza yazın.

Tablo 6.

Fonksiyon Referans
noLoop() https://p5js.org/reference/p5/noLoop/
loop() https://p5js.org/reference/p5/loop/
triangle() https://p5js.org/reference/p5/triangle/
quad() https://p5js.org/reference/p5/quad/
square() https://p5js.org/reference/p5/square/
ellipse() https://p5js.org/reference/p5/ellipse/
arc() https://p5js.org/reference/p5/arc/

Adım 2 — Kısa karşılaştırma. Notlarınıza şunları ekleyin:

Adım 3 — Hâlâ belirsizse yapay zekâya sorun. Referansı okuduktan sonra anlamadığınız nokta kaldıysa sohbet robotuna gidin. Önce dokümantasyonu okuduğunuzu belirtin; böylece yanıt resmi tanıma bağlanır.

Örnek İstem: "p5.js Reference’ta noLoop, loop, triangle, quad, square, ellipse ve arc sayfalarını okudum. Hâlâ netleşmeyen noktalarım: (1) noLoop sonrası draw neden yeniden çalışmaz, loop ile nasıl açılır? (2) triangle ve quad parametre sırası nasıl? (3) arc’ta start/stop açıları derece mi radyan mı, örnek kodla göster. Kısa Türkçe açıkla; her fonksiyon için 3–5 satırlık çalışan bir p5.js örneği ver."

Adım 4: Yapay zekânın verdiği örnekleri Web Editor’de deneyin. Çıktı referanstaki açıklamayla örtüşüyor mu kontrol edin; çelişki görürseniz yine resmi sayfayı esas alın.

Sıra Sizde: Kendi günlük bir rutininizi (ör. çay demlemek) 4–6 adımlık bir algoritma gibi yazın. Ardından bu adımlardan hangilerinin setup()’a, hangilerinin draw()’a daha çok benzediğini bir cümleyle gerekçelendirin.

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

Amaç: Sol-üst orijin alışkanlığını pekiştirmek.

Adım 1: 400×400 tuvalde merkezde bir daire için x,y tahmini yazın. Adım 2: Yapay zekâdan aynı tuvalde köşe ve merkez örnekleri isteyin; tahmininizle karşılaştırın. Adım 3: “y aşağı artar” kuralını bozan bir hata senaryosu sorup düzeltme önerisini kendi sketch’inizde deneyin.

Özet

Tuval, sol üst köşesi (0, 0) olan bir koordinat düzlemidir; x sağa, y ise matematik dersindeki alışkanlığın tersine aşağı doğru artar. Bu yönelim, piksel satırlarının yukarıdan aşağı numaralandırılmasından kaynaklanır ve konum hatalarının sık görülen kaynağıdır. createCanvas çizim alanının genişliğini ve yüksekliğini belirler; rect, ellipse, line, point ve text bu alan içinde geometri üretir. Konumun anlamı komuta göre değişir: rect çağrısında (x, y) sol üst köşeyi, ellipse çağrısında ise merkezi gösterir.

Görünüm fill, stroke ve strokeWeight ile ayarlanır; noFill dolguyu, noStroke kenarı kapatır. Bu ayarlar kendilerinden sonra çizilen şekilleri etkiler, önceki şekilleri değiştirmez; kenar çizgisi şeklin sınırının ortasına oturduğu için kalın değerlerde şekil verilen ölçüden büyük görünür. Renk RGB modeliyle, her bileşen 0 ile 255 arasında verilir; tek sayı gri tonu, dördüncü değer ise saydamlığı belirleyen alfa kanalını ifade eder.

Zaman boyutu setup ile draw ayrımında belirir. setup program başlarken bir kez çalışır ve hazırlık işlemlerini taşır; draw sketch durdurulana kadar her frame yeniden çağrılır ve varsayılan hedef 60 FPS’tir. background her frame’in başında sahneyi temizleyerek önceki çizimlerin izini siler. Tuval ölçüleri width ve height değişkenlerinde tutulur; her draw çağrısında bir artan frameCount ise modulo işleciyle birlikte kullanıldığında dairenin konumunu döngüsel biçimde ilerleten sade bir animasyon verir.

Neler Öğrendik?

Soru 1 p5.js tuvalinde (0,0) noktası nerededir?

A) Sağ alt köşe

B) Sol üst köşe

C) Tuval merkezi

D) Tarayıcı başlığı

E) CSS margin

Soru 2 setup ile draw farkı nedir?

A) İkisi de yalnızca bir kez çalışır

B) setup bir kez, draw her frame tekrarlanır

C) draw yalnızca farede çalışır

D) setup rengi yasaklar

E) Fark yoktur

Soru 3 background draw içinde sık kullanılmasının nedeni nedir?

A) DNS’i yenilemek

B) Önceki frame izlerini temizleyerek sahneyi yenilemek

C) Diziyi sıralamak

D) HTML’i silmek

E) Ses açmak

Soru 4 fill(255, 0, 0) tipik olarak neyi ayarlar?

A) Tuval boyutunu

B) Sonraki şekillerin iç rengini (kırmızı)

C) FPS’i sıfırlar

D) Klavyeyi kilitler

E) Dosya adını değiştirir

Neler Öğrendik Yanıt Anahtarı

Soru 1: Doğru Cevap: B

Soru 2: Doğru Cevap: B

Soru 3: Doğru Cevap: B

Soru 4: Doğru Cevap: B

Yararlanılan Kaynaklar

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


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ı:

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.

javascript
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.

javascript
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.

javascript
// 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. VE, VEYA ve DEĞİL için doğruluk tabloları
Görsel 1. VE, VEYA ve DEĞİL için doğruluk tabloları

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.

javascript
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. Mantıksal operatörler ile şekil renklendirme — && ile kare, || ile üçgen veya daire
Görsel 2. Mantıksal operatörler ile şekil renklendirme — && ile kare, || ile üçgen veya daire

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.

javascript
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.

javascript
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.

javascript
if (skor >= 10) {fill(0, 200, 0);ellipse(200, 200, 80, 80);}

Girintili hali:

Kod 8.

javascript
if (skor >= 10) {  fill(0, 200, 0);  ellipse(200, 200, 80, 80);}

Örnek 2 — if / else (girintisiz):

Kod 9.

javascript
if (can > 0) {background(200, 230, 200);} else {background(230, 180, 180);}

Girintili hali:

Kod 10.

javascript
if (can > 0) {  background(200, 230, 200);} else {  background(230, 180, 180);}

Örnek 3 — iç içe koşul (girintisiz):

Kod 11.

javascript
if (!oyunBitti) {if (skor >= HEDEF_SKOR) {oyunBitti = true;}}

Girintili hali:

Kod 12.

javascript
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.

javascript
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. if/else dallanma akışı — koşula göre renk seçimi
Görsel 3. if/else dallanma akışı — koşula göre renk seçimi

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.

javascript
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. Trafik ışığı — soldan sağa if, else if, else
Görsel 4. Trafik ışığı — soldan sağa if, else if, else

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.

javascript
if (can > 0) {  if (!oyunBitti) {    skor = skor + 1;  }}

Kod 16.

javascript
if (can > 0 && !oyunBitti) {  skor = skor + 1;}

Görsel 5. Örnek 1 — iç içe if ve tek if + &&
Görsel 5. Örnek 1 — iç içe if ve tek if + &&

Görsel 5 Örnek 1’in iki yazımını yan yana gösterir.

Örnek 2

else dallarında farklı mesajlar:

Kod 17.

javascript
if (can > 0) {  if (!oyunBitti) {    skor = skor + 1;    mesaj = "Devam";  } else {    mesaj = "Oyun bitti";  }} else {  mesaj = "Can yok";}

Görsel 6. Örnek 2 — iç içe if / else akışı
Görsel 6. Örnek 2 — iç içe if / else akışı

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.

javascript
if (can > 0 && !oyunBitti) {  if (skor >= 10) {    mesaj = "Seviye atlandı";    oyunBitti = true;  } else {    mesaj = "Skor yetersiz";  }} else {  mesaj = "Oyuna devam edilemez";}

Görsel 7. Örnek 3 — birleşik koşulu olan iç içe if / else
Görsel 7. Örnek 3 — birleşik koşulu olan iç içe if / else

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.

javascript
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

Soru 2: Doğru Cevap: B

Soru 3: Doğru Cevap: B

Soru 4: Doğru Cevap: A

Yararlanılan Kaynaklar

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


Ana Başlık 4. Fare Girdisi ve Daire Tıklama Oyunu

Amaç: Fare konumu, tıklama ve dist ile etkileşim kurarak Daire Tıklama mini oyununu adım adım kodlamak.

Öğrenme Çıktıları:

Anahtar Sözcükler: mouseX, mouseY, mousePressed, dist, etkileşim, mini oyun

Giriş

Önceki ana başlıkta değişkenler ve if/else ile programın karar verme iskeleti kuruldu. Gerçek bir mini oyunda bu kararlar çoğunlukla oyuncu girdisine bağlanır: fare hedefe yakın mı, tıklama hedefi vurdu mu, skor artmalı mı?

p5.js fare konumunu mouseX / mouseY ile, basılı olup olmadığını mouseIsPressed veya mousePressed() olayı ile verir. İki nokta arası uzaklık dist ile ölçülür; böylece “daireye tıklandı mı?” sorusu geometrik bir koşula dönüşür. Tek tıklamada skorun birden fazla artmaması için olay fonksiyonu ile sürekli basılı tutma ayrımı kritiktir.

Bu ana başlık fare, metin ve mesafe araçlarını birleştirir; ardından Daire Tıklama oyununu adım adım tamamlar. Çoklu hedefler ve diziler sonraki bölümlerde gelecektir. 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.

4.1. Fare Girdisi, Metin, Mesafe ve Etkileşim

Bu bölümde sırayla: fare konumu, ekrana yazı, iki nokta arası mesafe ve bunların if/else ile birleştirilmesi ele alınır. Her alt adımda yalnızca o ana kadar tanıtılmış kavramlar kullanılır.

Fare konumu ve tuş durumu

p5.js, fare girdisini yerleşik değişkenler ve fonksiyonlarla sunar. width ve height tuval boyutları tuval ve koordinat sistemi alt başlığında tanıtılmıştır; fare konumu bu aralıkta piksel cinsinden okunur.

Tablo 1.

Ad Tür Açıklama Örnek değer
mouseX number Fare imlecinin X konumu (0 … width−1) createCanvas(500,400) ve imleç ortadaysa → yaklaşık 250
mouseY number Fare imlecinin Y konumu (0 … height−1) imleç üst kenardaysa → 0
mouseIsPressed boolean Fare tuşu basılı mı? tuş basılı → true; bırakıldı → false
mousePressed() fonksiyon Tuşa basıldığı an (tek frame) her basışta bir kez çalışır
mouseReleased() fonksiyon Tuş bırakıldığı an (tek frame) her bırakışta bir kez çalışır

mousePressed() ve mouseReleased(), setup() ve draw() gibi p5.js olay fonksiyonlarıdır: p5.js, fare olayı gerçekleştiğinde bu isimdeki fonksiyonu otomatik çağırır. Genel fonksiyon tanımı 4. ana başlıkta ayrıntılı işlenecektir.

Ekrana metin yazma

Skor veya mesaj göstermek için p5.js metin komutları kullanılır. text() Ana Başlık 1'deki çizim tablosunda ve 3.1’deki string örneğinde geçmiştir; burada textSize ve textAlign ile birlikte özetlenir:

Tablo 2.

Komut Açıklama
text(metin, x, y) (x, y) noktasını referans alarak metin yazar
textSize(boyut) Yazı boyutunu piksel cinsinden ayarlar
textAlign(hizaX, hizaY) (x, y) noktasının metnin hangi köşesine / kenarına denk geleceğini seçer

textAlign, (x, y) koordinatlarını silmez; o noktanın metne göre bağlantı yerini değiştirir. Yatayda LEFT sol kenarı, CENTER ortayı, RIGHT sağ kenarı (x, y) üzerine oturtur. Dikeyde TOP üstü, CENTER ortayı, BOTTOM altı bağlar. Varsayılan genelde sola ve alta yakındır; skor gibi köşe yazıları için textAlign(LEFT, TOP) ile (15, 15) sol-üst köşeye oturur. Ekran ortası mesajında textAlign(CENTER, CENTER) ve text(..., width / 2, height / 2) kullanılır — aynı (x, y) verilse bile hizalama değişince yazı kaymış gibi görünür.

Kod bloğu: Metin çizimi örneği.

Kod 1.

javascript
function draw() {  background(240);  fill(0);  textSize(24);  textAlign(LEFT, TOP); // (15, 15) = metnin sol-üst köşesi  text("Skor: 0", 15, 15);}

İki nokta arası mesafe (dist)

Tanım: dist(x1, y1, x2, y2) — p5.js'in yerleşik fonksiyonu; iki nokta arasındaki Öklid mesafesini sayı olarak döndürür. Matematikteki karşılığı sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) ifadesidir (kare alma, farkın kendisiyle çarpılmasıdır); burada sqrt da p5.js'te yerleşiktir, isterseniz mesafeyi dist yerine bu ifadeyle kendiniz de yazabilirsiniz. İlerleyen bölümlerde iki dairenin birbirine değmesi bu mesafe ile yarıçap toplamı karşılaştırılarak test edilecektir.

Daire içinde tıklama algılamak için merkez ile fare konumu arası mesafe hesaplanır; mesafe yarıçaptan küçükse nokta daire içindedir.

Görsel 1. Nokta dairenin içinde mi? — mesafe < yarıçap testi
Görsel 1. Nokta dairenin içinde mi? — mesafe < yarıçap testi

Görsel 1 noktanın daire içinde olup olmadığını özetler: merkezden nokta uzaklığı (dist) yarıçaptan küçükse içeride, aksi halde dışarıdadır.

Fare yakınlığına göre renk (birleşik örnek)

Aşağıdaki örnek, 3.3’teki if/else yapısına mouseX, mouseY ve dist() eklenmiş halidir; bu üç kavram artık tanıtılmıştır.

Kod bloğu: Fare daireye yaklaştıkça renk değişen çizim.

Kod 2.

javascript
function draw() {  background(240);   let merkezX = 200;  let merkezY = 200;  let yaricap = 50;   let mesafe = dist(mouseX, mouseY, merkezX, merkezY);   if (mesafe < yaricap) {    fill(50, 200, 80);   // Yeşil — fare dairenin içinde (tam kenar hariç)  } else {    fill(200, 50, 50);   // Kırmızı — fare uzakta  }   noStroke();  ellipse(merkezX, merkezY, yaricap * 2, yaricap * 2);}

mousePressed() ile tek tıklama

mouseIsPressed draw() içinde sürekli kontrol edildiğinde tuş basılı tutulduğu sürece true döner. Skor gibi tek seferlik sayılması gereken olaylarda mousePressed() genellikle daha uygundur.

Tablo 3.

Yöntem Ne zaman true? Skor riski
mouseIsPressed Tuş basılı tutulduğu her frame'de (draw ~60/sn) Tek tıklama birden fazla sayılabilir
mousePressed() Tuşa basıldığı tek frame'de Skor genelde bir kez artar

Kod bloğu: mousePressed() ile tek tıklama yakalama.

Kod 3.

javascript
let tiklandi = false; function mousePressed() {  tiklandi = true;} function draw() {  background(220);  if (tiklandi) {    fill(0, 180, 0);    textSize(20);    textAlign(LEFT, TOP);    text("Tiklandi!", 150, 200);  }}

Daire Tıklama oyununda klavye girdisi (keyIsDown, keyPressed()) kullanılmaz; klavye girdisi ilerleyen bölümlerde sistematik ele alınacaktır.

4.2. Adım Adım: Daire Tıklama Oyunu

Daire Tıklama (Circle Clicker), ekranda beliren hedef daireye tıklayarak skor toplamayı amaçlayan basit bir refleks oyunudur. Bu oyun yalnızca değişken ve if/else bilgisiyle kodlanabilir; döngü veya dizi gerektirmez.

Oyun kuralları:

Bu mini oyun öğretim amaçlıdır; benzer «hedefe tıkla / isabet al» mekaniğini denemek için kaynaklardaki çevrim içi örneklerden yararlanılabilir.

Aşağıdaki sıra, mousePressed() içindeki karar adımlarını özetler:

  1. mousePressed() tetiklenir.
  2. oyunBitti true ise → işlem yapılmaz (return).
  3. Fare ile hedef arası mesafe hesaplanır (dist).
  4. Mesafe yarıçaptan küçük değilse → skor değişmez.
  5. Mesafe yarıçaptan küçükse → skor 1 artar.
  6. Skor hedefe ulaştıysa → oyunBitti = true; aksi halde hedefe yeni rastgele konum atanır.

Adım 1: Değişkenleri tanımla

Kod 4.

javascript
let hedefX;       // Hedef dairenin X konumulet hedefY;       // Hedef dairenin Y konumulet hedefYaricap = 40;let skor = 0;const HEDEF_SKOR = 10;let oyunBitti = false;

Adım 2: setup() — tuval ve ilk hedef konumu

Bu adımda p5.js’in iki parametreli random kullanımı ilk kez sistematik tanıtılır (önceki ana başlıklarda konum atamak için kullanılmamıştı).

Tanım: random(min, max) — p5.js fonksiyonu; min ile max arasında (üst sınır max dahil değil) rastgele ondalıklı bir sayı döndürür. Örnek: random(10, 50) yaklaşık 10 ile 50 arasında bir değer üretir; 50’ye eşit olma garantisi yoktur. Tek parametreli random(max) ise 0 ile max arasında değer üretir; parametresiz random() 0 ile 1 arasındadır. Bu oyunda merkez koordinatı için iki parametreli biçim kullanılır.

Kod 5.

javascript
function setup() {  createCanvas(500, 400);  // İlk hedef konumu — random(min, max) bu adımda tanıtıldı  hedefX = random(hedefYaricap, width - hedefYaricap);  hedefY = random(hedefYaricap, height - hedefYaricap);}

Hedef ellipse(hedefX, hedefY, hedefYaricap * 2, …) ile merkezden çizilir. Merkez sol kenara (0) veya sağ kenara (width) çok yaklaşırsa şeklin bir kısmı tuval dışına taşar; oyuncu eksik görünen bir hedefe tıklamaya çalışır. Bu yüzden X için alt sınır hedefYaricap, üst sınır width - hedefYaricap seçilir (Y için height ile aynı mantık): merkez her zaman kenardan en az bir yarıçap içeride kalır ve elips bütünüyle görünür.

Adım 3: draw() — çizim ve oyun durumu

Kod 6.

javascript
function draw() {  background(25, 30, 50); // Koyu arka plan   if (!oyunBitti) {    // Hedef daire    fill(255, 180, 0);    noStroke();    ellipse(hedefX, hedefY, hedefYaricap * 2, hedefYaricap * 2);  } else {    // Kazanma ekranı    fill(255);    textSize(32);    textAlign(CENTER, CENTER);    text("Kazandınız!", width / 2, height / 2);  }   // Skor göstergesi (her durumda)  fill(255);  textSize(20);  textAlign(LEFT, TOP);  text("Skor: " + skor, 15, 15);}

!oyunBitti ifadesi "oyun bitmediyse" anlamına gelir. ! operatörü boolean değeri tersine çevirir. textSize() ve textAlign() bu alt bölümde (2.4) özetlenmiştir; text() daha önce tanıtılmıştır.

Adım 4: mousePressed() — tıklama kontrolü

Tanım: return — Bulunulan fonksiyonun geri kalanını çalıştırmadan çıkmasını sağlar. Oyun bittiyse tıklamaların yoksayılması için kullanılır.

Kod 7.

javascript
function mousePressed() {  if (oyunBitti) {    return; // Oyun bittiyse aşağıdaki satırlar çalışmaz  }   let mesafe = dist(mouseX, mouseY, hedefX, hedefY);   if (mesafe < hedefYaricap) {    skor = skor + 1;     if (skor >= HEDEF_SKOR) {      oyunBitti = true;    } else {      hedefX = random(hedefYaricap, width - hedefYaricap);      hedefY = random(hedefYaricap, height - hedefYaricap);    }  }}

Hedef vurulduğunda skor bir artar; hedef skora ulaşılmadıysa random() ile yeni konum atanır. return sayesinde oyun bittikten sonra yapılan tıklamalar işlenmez.

Adım 5: Tam kod (birleştirilmiş)

Kod bloğu: Daire Tıklama oyununun tam kodu.

Kod 8.

javascript
let hedefX;let hedefY;let hedefYaricap = 40;let skor = 0;const HEDEF_SKOR = 10;let oyunBitti = false; function setup() {  createCanvas(500, 400);  hedefX = random(hedefYaricap, width - hedefYaricap);  hedefY = random(hedefYaricap, height - hedefYaricap);} function draw() {  background(25, 30, 50);   if (!oyunBitti) {    fill(255, 180, 0);    noStroke();    ellipse(hedefX, hedefY, hedefYaricap * 2, hedefYaricap * 2);  } else {    fill(100, 255, 100);    textSize(32);    textAlign(CENTER, CENTER);    text("Tebrikler! 10 puana ulaştınız.", width / 2, height / 2);  }   fill(255);  textSize(20);  textAlign(LEFT, TOP);  text("Skor: " + skor + " / " + HEDEF_SKOR, 15, 15);} function mousePressed() {  if (oyunBitti) {    return;  }   let mesafe = dist(mouseX, mouseY, hedefX, hedefY);   if (mesafe < hedefYaricap) {    skor = skor + 1;    if (skor >= HEDEF_SKOR) {      oyunBitti = true;    } else {      hedefX = random(hedefYaricap, width - hedefYaricap);      hedefY = random(hedefYaricap, height - hedefYaricap);    }  }}

Bu kod p5.js Web Editor'e yapıştırılıp doğrudan çalıştırılabilir. Oyun, if/else ve değişken kavramlarının bir arada kullanıldığı ilk tam örnektir; çoklu hedefler sonraki ana başlıklarda ele alınır.

Sıra Sizde: Daire Tıklama’da skorun bir basışta birden fazla artmaması için mousePressed ile draw içindeki mouseIsPressed farkını kendi cümlelerinizle açıklayın. Yanlış tasarımda ne olurdu?

Sıra Sizde: Yukarıdaki Daire Tıklama kodunu biraz daha karmaşık hale getirin. Çemberin dışına tıklandığında skor 3 puan azalsın. Skor sıfırın altına düşerse oyunu bitirin (oyunBitti = true) ve ekranda «Üzgünüm, oyunu kaybettiniz» mesajını gösterin. İpucu: mousePressed içinde mesafe < hedefYaricap dalına bir else ekleyin; draw içinde hem kazanma hem kaybetme mesajını skor ile ayırt edin.

Sıra Sizde: Hedef konumunda random(hedefYaricap, width - hedefYaricap) (ve Y için benzeri) kullanıyoruz. Neden daha “basit” görünen random(hedefYaricap, width) veya random(0, width) yazmadık? Kendi cümlelerinizle yorumlayın. Ardından: bu iki alternatiften birini kullansaydık oyunda görünüm ve tıklanabilirlik açısından ne değişirdi? (İsterseniz Web Editor’de kısa süre deneyip gözlemleyin.)

Yapay Zekâ Etkileşimi: Nokta Elipsin İçinde mi? Tahmini etkinliği tamamlama süresi: 20–25 dakika.

Amaç: Bir noktanın elips içinde olup olmadığını kontrol eden p5.js kodunu yazmak ve arkasındaki matematiği (Öklid mesafesi / yarıçap karşılaştırması) adım adım anlamak. (Bu ana başlıktaki hedef, genişlik ve yüksekliği eşit bir ellipse ile çizilir; o durumda merkez–nokta mesafesi yarıçapla karşılaştırılır.)

Adım 1: Merkezi (hedefX, hedefY), yarıçapı hedefYaricap olan bir elips ve fare noktası (mouseX, mouseY) düşünün. Adım 2: Tercih ettiğiniz yapay zekâya şu istemi verin:

Örnek İstem: "p5.js'te (mouseX, mouseY) noktasının bir elipsin içinde olup olmadığını kontrol eden kısa bir kod yaz; genişlik ve yükseklik eşit olsun (dist veya sqrt kullanabilirsin; kendi fonksiyonunu tanımlama). Ardından formülü terim terim açıkla: mesafe < yarıçap karşılaştırması geometrik olarak neden doğru sonuç verir?"

Adım 3: İlk yanıt çoğu zaman yalnızca kod verir veya matematik kısmı yüzeysel kalır. İstediğiniz bilgiyi alana kadar sohbeti sürdürün; örneğin: "Aynı testi dist kullanmadan sqrt ile yaz; Pisagor bağıntısıyla bağını göster." veya "Genişlik ve yükseklik farklı olduğunda test nasıl değişir; kısa kod ve gerekçe yaz." Yapay zekâ bazen mesafeyi function noktaIcindeMi(...) gibi sizin tanımladığınız bir fonksiyon içine koyar — fonksiyon tanımlamayı henüz görmediğiniz için bunu geri çevirin: "Fonksiyon tanımlamadan, yalnızca setup/draw/mousePressed ve yerleşik dist veya sqrt ile daha basit yaz." Yapay zekânın ilk cevabı her zaman yeterli değildir — kodu ve matematiği birlikte netleştirene kadar soruyu ilerletin. Adım 4: Aldığınız kodu ve açıklamayı bu ana başlıktaki dist(mouseX, mouseY, hedefX, hedefY) < hedefYaricap ifadesiyle ve Görsel 1 ile karşılaştırın.

Yapay Zekâ Etkileşimi: Dokunmatik Ekranda Dokunma Tahmini etkinliği tamamlama süresi: 15–20 dakika.

Amaç: Bilgisayarda fare tıklaması yerine dokunmatik ekranda sketch’e dokunmanın nasıl algılanacağını öğrenmek.

Adım 1: Bu ana başlıktaki fare örneklerini (mouseX, mousePressed) hatırlayın. Adım 2: Yapay zekâya sorun:

Örnek İstem: "p5.js sketch'imi dokunmatik ekranda kullanacağım. mousePressed / mouseX yerine dokunmayı nasıl algılarım? Kısa örnek ver; fare ile farkını bir paragrafta yaz."

Adım 3: Yanıttaki API adlarını (ör. touches, touchStarted) p5.js Reference’ta doğrulayın. Dokunmatik cihazda nasıl kolay deneyebileceğinizi de yapay zekâya sorun — örneğin: "p5.js Web Editor sketch'imi telefonda veya tablette kolayca nasıl açıp dokunarak denerim? Güvenli ve pratik yolları kısaca yaz." Ardından önerilen adımlardan birini uygulayın.

Özet

Fare etkileşimi, önceki ana başlıkta kurulan koşullu mantığı doğrudan oyuncu eylemine bağlar. p5.js’te mouseX ve mouseY imlecin tuval üzerindeki konumunu her frame günceller; mouseIsPressed tuş basılı tutulduğu sürece her frame doğru değerini alırken mousePressed() yalnızca basma anında bir kez çalışan bir olay fonksiyonudur. Bu ayrım, skor artışı gibi tek seferlik sayılması gereken işlemlerin draw içinde tekrarlanarak hatalı biçimde çoğalmasını önler. Aynı bölümde metin araçları da toparlanır: text mesajı yazar, textSize yazı boyutunu belirler, textAlign ise verilen noktanın metnin hangi kenarına oturacağını seçer.

dist(x1, y1, x2, y2) iki nokta arasındaki Öklid mesafesini döndürür; bu değer hedef dairenin yarıçapıyla karşılaştırıldığında “tıklama daireye isabet etti mi?” sorusu geometrik bir koşula dönüşür. Daire Tıklama oyunu bu araçları tek bir sketch’te birleştirir: hedefin konumu random(min, max) ile kenardan en az bir yarıçap içeride seçilir, mousePressed() içinde isabet sınanır, skor bir artar ve hedef yeni bir rastgele konuma taşınır. Hedef skora ulaşıldığında oyunBitti bayrağı devreye girer ve return sonraki tıklamaları etkisiz kılar. Kaçırmada puan kaybı ve skorun sıfırın altına düşmesiyle kaybetme gibi kurallar Sıra Sizde etkinliklerinde genişletilir.

Böylece mini oyun, dizilere ve çoklu nesne yapılarına geçmeden önce girdi–karar–geri bildirim döngüsünü pekiştirir.

Neler Öğrendik?

Soru 1 Daireye tıklanıp tıklanmadığını anlamak için en uygun araç hangisidir?

A) Yalnızca frameCount

B) dist ile merkez–imleç mesafesini yarıçapla karşılaştırmak

C) background rengini okumak

D) Yalnızca keyIsDown

E) console.log zorunluluğu

Soru 2 Skorun bir tıklamada birden fazla artmasını önlemek için ne yapılır?

A) Artışı mousePressed içinde tutmak

B) Artışı yalnızca background içinde yazmak

C) frameRate(1) zorunlu kılmak

D) createCanvas’ı draw içine almak

E) Değişken kullanmamak

Soru 3 mouseX / mouseY neyi verir?

A) Tuval boyutunu

B) İmlecin tuval üzerindeki konumunu

C) Yalnızca son tıklanan noktayı kalıcı saklar

D) Klavye kodunu

E) FPS değerini

Soru 4 Daire Tıklama iskeletinde hedef yenileme tipik olarak ne zaman yapılır?

A) Yalnızca dosya kaydedilirken

B) İsabet sonrası yeni rastgele konum atanırken

C) setup hiç çalışmazken

D) Yalnızca EPUB üretilirken

E) CSS yüklenirken

Neler Öğrendik Yanıt Anahtarı

Soru 1: Doğru Cevap: B

Soru 2: Doğru Cevap: A

Soru 3: Doğru Cevap: B

Soru 4: Doğru Cevap: B

Yararlanılan Kaynaklar

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


Bölüm 1 — Ek Sorular

Her ana başlık için 10 çoktan seçmeli değerlendirme sorusu. Bölüm sonu sınav veya pekiştirme amaçlıdır.


Ana Başlık 1 için 10 Soru

SORU 1: Algoritma için en uygun tanım hangisidir?

A) Rastgele seçilen renk listesi

B) Belirli bir hedefe giden sonlu, açık ve sıralı adımlar

C) Yalnızca fare tıklaması

D) CSS dosyasının adı

E) FPS değerinin kendisi

Doğru cevap: B

Genel açıklama: Bu soru ana başlık kazanımını ölçer. İlgili Konu: 1.1


SORU 2: Aşağıdaki yaklaşımlardan hangisi oyun sketch’inde daha sağlam bir geliştirmedir?

A) Konu dışı teknolojiye (biçim/dil dışı) sapıp temel kuralı atlamak

B) Öğrenilen p5.js API’si ile ölçülebilir bir oyun kuralı eklemek

C) draw içinde createCanvas tekrarlamak

D) Skoru her frame koşulsuz artırmak

E) Hata ayıklamadan uzun kodu olduğu gibi bırakmak

Doğru cevap: B

Genel açıklama: Geliştirme, öğrenilen araçlarla kural eklemeyi hedefler; alandan kopuk şıklar elenir. İlgili Konu: Pekiştirme


SORU 3: Yaratıcı kodlamanın eğitimdeki temel katkısı nedir?

A) Görsel çıktıyla kavramı hemen gözlemlenebilir kılmak

B) Klavyeyi tamamen kaldırmak

C) Matematığı yasaklamak

D) Yalnızca sunucu tarafı yazmak

E) Renk körlüğünü zorunlu kılmak

Doğru cevap: A

Genel açıklama: Bu soru ana başlık kazanımını ölçer. İlgili Konu: 1.3


SORU 4: “Basit bir oyun yap” ifadesi neden doğrudan talimat sayılmaz?

A) Çünkü alt adımlara bölünmeden uygulanamaz

B) Çünkü p5.js desteklemez

C) Çünkü tarayıcı kapanır

D) Çünkü frameCount yasaktır

E) Çünkü değişken kullanılamaz

Doğru cevap: A

Genel açıklama: Bu soru ana başlık kazanımını ölçer. İlgili Konu: 1.4


SORU 5: «Programlama, p5.js ve İlk Sketch» bağlamında hangisi daha iyi bir sonraki adım geliştirmedir?

A) Konu dışı bir CSS animasyonu eklemek

B) Mevcut sketch’e ölçülebilir bir kural (skor, sınır, durum) eklemek

C) Tuvali silip boş bırakmak

D) setup’ı tamamen kaldırmak

E) Rastgele sözdizimi hatası bırakmak

Doğru cevap: B

Genel açıklama: Geliştirme mevcut öğrenilen API ile kural ekler. İlgili Konu: 1.uygulama


SORU 6: Aşağıdaki hangi seçenek tipik bir çeldirici bug senaryosudur?

A) dist ile isabet, ardından skoru bir kez artırmak

B) draw içinde koşulsuz skor artışı

C) createCanvas’ı setup içinde bir kez çağırmak

D) background ile frame temizlemek

E) keyIsDown ile sürekli hareket

Doğru cevap: B

Genel açıklama: Koşulsuz artış her frame şişer — görünür bug. İlgili Konu: 1.uygulama


SORU 7: Kod okuma: if (x > width) { x = 0; } ne yapar?

A) Y’yi sıfırlar

B) X tuval sağını aşınca sola sarar

C) FPS’i sıfırlar

D) Fareyi kilitler

E) Diziyi temizler

Doğru cevap: B

Genel açıklama: Yatay sarma (wrap) kalıbı. İlgili Konu: 1.uygulama


SORU 8: Bu ana başlıkta (Programlama, p5.js ve İlk Sketch) hangi uygulama en uygundur?

A) Öğrenilen API’yi bilinçli yok sayıp rastgele hazır kütüphane çağırmak

B) Anlatılan kavramı küçük bir sketch’te görünür çıktıyla denemek

C) Konuyu yalnızca okuyup hiç kod yazmamak

D) Tuval boyutunu her frame rastgele değiştirmek

E) Hata ayıklamadan uzun kod kopyalamak

Doğru cevap: B

Genel açıklama: Seçenek konu başlığıyla örtüşür; diğerleri alandan kopuk. İlgili Konu: 1.uygulama


SORU 9: console.log ayıklamada asıl faydası nedir?

A) Tuval çözünürlüğünü artırır

B) Ara değerleri görüp yanlış varsayımı yakalamayı sağlar

C) Otomatik çarpışma ekler

D) draw’ı durdurur

E) Kaynakça üretir

Doğru cevap: B

Genel açıklama: Gözlemlenebilir ara durum. İlgili Konu: 1.uygulama


SORU 10: Bir fonksiyonu parametreli yazmanın faydası?

A) FPS’i kilitlemek

B) Aynı mantığı farklı argümanlarla yeniden kullanmak

C) setup’ı kaldırmak

D) HTML’i silmek

E) Rengi yasaklamak

Doğru cevap: B

Genel açıklama: Modülerlik ve yeniden kullanım. İlgili Konu: 1.uygulama


Ana Başlık 2 için 10 Soru

SORU 1: p5.js tuvalinde (0,0) noktası nerededir?

A) Sağ alt köşe

B) Sol üst köşe

C) Tuval merkezi

D) Tarayıcı başlığı

E) CSS margin

Doğru cevap: B

Genel açıklama: Bu soru ana başlık kazanımını ölçer. İlgili Konu: 2.1


SORU 2: setup ile draw farkı nedir?

A) İkisi de yalnızca bir kez çalışır

B) setup bir kez, draw her frame tekrarlanır

C) draw yalnızca farede çalışır

D) setup rengi yasaklar

E) Fark yoktur

Doğru cevap: B

Genel açıklama: Bu soru ana başlık kazanımını ölçer. İlgili Konu: 2.2


SORU 3: Aşağıdaki yaklaşımlardan hangisi oyun sketch’inde daha sağlam bir geliştirmedir?

A) Konu dışı teknolojiye (biçim/dil dışı) sapıp temel kuralı atlamak

B) Öğrenilen p5.js API’si ile ölçülebilir bir oyun kuralı eklemek

C) draw içinde createCanvas tekrarlamak

D) Skoru her frame koşulsuz artırmak

E) Hata ayıklamadan uzun kodu olduğu gibi bırakmak

Doğru cevap: B

Genel açıklama: Geliştirme, öğrenilen araçlarla kural eklemeyi hedefler; alandan kopuk şıklar elenir. İlgili Konu: Pekiştirme


SORU 4: fill(255, 0, 0) tipik olarak neyi ayarlar?

A) Tuval boyutunu

B) Sonraki şekillerin iç rengini (kırmızı)

C) FPS’i sıfırlar

D) Klavyeyi kilitler

E) Dosya adını değiştirir

Doğru cevap: B

Genel açıklama: Bu soru ana başlık kazanımını ölçer. İlgili Konu: 2.4


SORU 5: «Koordinat Sistemi, Çizim, setup ve draw» bağlamında hangisi daha iyi bir sonraki adım geliştirmedir?

A) Konu dışı bir CSS animasyonu eklemek

B) Mevcut sketch’e ölçülebilir bir kural (skor, sınır, durum) eklemek

C) Tuvali silip boş bırakmak

D) setup’ı tamamen kaldırmak

E) Rastgele sözdizimi hatası bırakmak

Doğru cevap: B

Genel açıklama: Geliştirme mevcut öğrenilen API ile kural ekler. İlgili Konu: 2.uygulama


SORU 6: Aşağıdaki hangi seçenek tipik bir çeldirici bug senaryosudur?

A) dist ile isabet, ardından skoru bir kez artırmak

B) draw içinde koşulsuz skor artışı

C) createCanvas’ı setup içinde bir kez çağırmak

D) background ile frame temizlemek

E) keyIsDown ile sürekli hareket

Doğru cevap: B

Genel açıklama: Koşulsuz artış her frame şişer — görünür bug. İlgili Konu: 2.uygulama


SORU 7: Kod okuma: if (x > width) { x = 0; } ne yapar?

A) Y’yi sıfırlar

B) X tuval sağını aşınca sola sarar

C) FPS’i sıfırlar

D) Fareyi kilitler

E) Diziyi temizler

Doğru cevap: B

Genel açıklama: Yatay sarma (wrap) kalıbı. İlgili Konu: 2.uygulama


SORU 8: Bu ana başlıkta (Koordinat Sistemi, Çizim, setup ve draw) hangi uygulama en uygundur?

A) Öğrenilen API’yi bilinçli yok sayıp rastgele hazır kütüphane çağırmak

B) Anlatılan kavramı küçük bir sketch’te görünür çıktıyla denemek

C) Konuyu yalnızca okuyup hiç kod yazmamak

D) Tuval boyutunu her frame rastgele değiştirmek

E) Hata ayıklamadan uzun kod kopyalamak

Doğru cevap: B

Genel açıklama: Seçenek konu başlığıyla örtüşür; diğerleri alandan kopuk. İlgili Konu: 2.uygulama


SORU 9: console.log ayıklamada asıl faydası nedir?

A) Tuval çözünürlüğünü artırır

B) Ara değerleri görüp yanlış varsayımı yakalamayı sağlar

C) Otomatik çarpışma ekler

D) draw’ı durdurur

E) Kaynakça üretir

Doğru cevap: B

Genel açıklama: Gözlemlenebilir ara durum. İlgili Konu: 2.uygulama


SORU 10: Bir fonksiyonu parametreli yazmanın faydası?

A) FPS’i kilitlemek

B) Aynı mantığı farklı argümanlarla yeniden kullanmak

C) setup’ı kaldırmak

D) HTML’i silmek

E) Rengi yasaklamak

Doğru cevap: B

Genel açıklama: Modülerlik ve yeniden kullanım. İlgili Konu: 2.uygulama


Ana Başlık 3 için 10 Soru

SORU 1: let skor = 0 ile const MAX = 10 için doğru ifade hangisidir?

A) İkisi de her frame yeniden tanımlanmalıdır

B) let yeniden atanabilir; const aynı bağa yeni değer atanamaz

C) const yalnızca string tutar

D) let yalnızca draw içinde geçerlidir

E) Fark yalnızca değişken adının uzunluğudur

Doğru cevap: B

Genel açıklama: const ile kurulan bağ yeniden atanamaz; let güncellenebilir. İlgili Konu: 3.1


SORU 2: can > 0 && !bitti ne zaman true olur?

A) can 0 ve bitti true iken

B) can pozitif ve bitti false iken

C) Yalnızca can negatifken

D) Yalnızca bitti true iken

E) Her frame zorunlu true

Doğru cevap: B

Genel açıklama: && her iki yanın true olmasını ister; !bitti bitmemiş demektir. İlgili Konu: 3.2


SORU 3: Aşağıdaki hangi satır karşılaştırma yapar (atama değil)?

A) x = 5

B) x === 5

C) x = x + 1

D) const x = 5

E) x += 5

Doğru cevap: B

Genel açıklama: === sıkı eşitlik üretir; tek = atamadır. İlgili Konu: 3.2


SORU 4: if / else if / else zincirinde else ne zaman çalışır?

A) Her zaman ilk if ile birlikte

B) Önceki tüm koşullar false ise

C) Yalnızca fare tıklanınca

D) Yalnızca setup içinde

E) Hiçbir zaman; sözdizimi hatasıdır

Doğru cevap: B

Genel açıklama: else kalan durumları yakalar. İlgili Konu: 3.3


SORU 5: skor = skor + 1 ile skor == skor + 1 farkı nedir?

A) İkisi de skoru bir artırır

B) İlki atar; ikincisi (genelde false) karşılaştırma üretir

C) İkisi de string birleştirir

D) İkincisi FPS’i artırır

E) İlki yalnızca const ile çalışır

Doğru cevap: B

Genel açıklama: == karşılaştırır; artırması beklenen yerde atama kullanılmalıdır. İlgili Konu: 3.2


SORU 6: Boolean ifade sonucu olarak hangisi doğrudur?

A) 3 < 2 → true

B) 10 >= 10 → true

C) "a" === "b" → true

D) true && false → true

E) !true → true

Doğru cevap: B

Genel açıklama: 10, 10’a büyük eşittir. İlgili Konu: 3.2


SORU 7: || operatörü için doğru örnek hangisidir?

A) can > 0 || can > 0 yalnızca can negatifken true

B) tusA || tusB — en az biri true ise true

C) || her zaman false döndürür

D) || yalnızca sayıları toplar

E) || atama operatörüdür

Doğru cevap: B

Genel açıklama: VEYA: taraflardan biri yeterli. İlgili Konu: 3.2


SORU 8: Oyun kodunda skor artışı hangi bağlamda daha güvenlidir?

A) draw içinde koşulsuz skor = skor + 1

B) Tetikleyici olay/koşul sağlandığında bir kez artırma

C) Yalnızca dosya adını değiştirerek

D) createCanvas her frame çağrılarak

E) background rengini skor yapmak

Doğru cevap: B

Genel açıklama: Koşulsuz artış her frame şişer. İlgili Konu: 3.3


SORU 9: else if atlanırsa ne olur?

A) Önceki if true olsa bile else if çalışır

B) Önceki dal true ise sonraki else if denenmez

C) Program çöker

D) draw durur

E) Tuval silinir

Doğru cevap: B

Genel açıklama: Zincir kısa devre eder. İlgili Konu: 3.3


SORU 10: Aşağıdaki hangisi tipik bir mantık hatasıdır (sözdizimi değil)?

A) Eksik süslü parantez

B) Duvara çarpınca hizX = hizX yazıp yönü tersine çevirmemek

C) Tanımsız fonksiyon adı

D) let yerine geçersiz anahtar sözcük

E) String’i kapatmamak

Doğru cevap: B

Genel açıklama: Kod çalışır ama istenen oyun kuralı oluşmaz. İlgili Konu: 3.3


Ana Başlık 4 için 10 Soru

SORU 1: Daireye tıklama testi için en doğru yaklaşım hangisidir?

A) mouseX === daireX tek başına yeterli

B) dist(mouseX, mouseY, daireX, daireY) <= yaricap

C) frameCount > yaricap

D) keyIsDown(LEFT_ARROW)

E) background(daireX)

Doğru cevap: B

Genel açıklama: Mesafe yarıçaptan küçük/eşitse isabet vardır. İlgili Konu: 4.1


SORU 2: Skorun bir basışta birden fazla artmasını önlemek için ne yapılır?

A) Artışı draw içinde mouseIsPressed ile sürekli yapmak

B) Artışı mousePressed (veya kenar tetiklemeli) olayda bir kez yapmak

C) frameRate(1) zorunlu kılmak

D) createCanvas’ı kaldırmak

E) Skoru const yapmak ve hiç artırmamak

Doğru cevap: B

Genel açıklama: draw + basılı tutma tekrarlı artış üretir. İlgili Konu: 4.1


SORU 3: mouseX / mouseY neyi verir?

A) Tuval genişliğini

B) İmlecin tuval üzerindeki konumunu

C) Son kaydedilen dosya yolunu

D) FPS değerini

E) Yalnızca son ellipse yarıçapını

Doğru cevap: B

Genel açıklama: Sistem değişkenleri imleç konumudur. İlgili Konu: 4.1


SORU 4: İsabet sonrası hedef yenilemede tipik adım nedir?

A) setup’ı silmek

B) Yeni rastgele daireX / daireY atamak

C) draw’ı yorum satırı yapmak

D) Yalnızca stroke kalınlığını artırmak

E) dist fonksiyonunu tanımlamaktan vazgeçmek

Doğru cevap: B

Genel açıklama: Hedef yeni konuma taşınır. İlgili Konu: 4.2


SORU 5: text(skor, 20, 30) ne işe yarar?

A) Tuval boyutunu değiştirir

B) Skoru ekrana yazar

C) Fareyi kilitler

D) Diziyi sıralar

E) setup’ı iki kez çağırır

Doğru cevap: B

Genel açıklama: text metin çizer. İlgili Konu: 4.1


SORU 6: Yarıçap 40 iken dist(...) === 40 durumu ne anlama gelir?

A) Kesinlikle isabet yok

B) Sınır üzerinde (genelde isabet kabul edilebilir)

C) Tuval dışına çıkılmıştır

D) mousePressed zorunlu false

E) FPS 40’tır

Doğru cevap: B

Genel açıklama: <= ile sınır dahil edilir. İlgili Konu: 4.1


SORU 7: Daire Tıklama’da random(width) kullanımı için doğru gerekçe?

A) FPS’i sabitlemek

B) Hedefi yatayda rastgele konumlandırmak

C) dist’i devre dışı bırakmak

D) const zorunluluğu

E) Konsolu temizlemek

Doğru cevap: B

Genel açıklama: Rastgele X üretir. İlgili Konu: 4.2


SORU 8: Aşağıdaki hangi hata isabeti yanlış negatif yapar (vurduğu hâlde saymama)?

A) Yarıçapı olduğundan büyük yazmak

B) Yarıçapı olduğundan küçük yazmak veya merkez koordinatını yanlış tutmak

C) fill rengini değiştirmek

D) textSize artırmak

E) noStroke() kullanmak

Doğru cevap: B

Genel açıklama: Geometri uyuşmazlığı isabeti kaçırır. İlgili Konu: 4.1


SORU 9: mouseIsPressed ile mousePressed() farkı?

A) Fark yoktur

B) İlki sürekli durum; ikincisi basış olayı (fonksiyon)

C) İkisi de yalnızca klavye içindir

D) mousePressed yalnızca setup’ta çalışır

E) mouseIsPressed string döndürür

Doğru cevap: B

Genel açıklama: Durum vs olay ayrımı kritiktir. İlgili Konu: 4.1


SORU 10: Geliştirme: skora ek olarak can sistemi eklemek için en uygun yer?

A) Yalnızca HTML dosya adı

B) İsabet/kaçırma koşullarına bağlı değişken güncellemesi

C) createCanvas parametresini can yapmak

D) ellipse yarıçapını can sanmak

E) CSS class adı

Doğru cevap: B

Genel açıklama: Oyun kuralı koşula bağlanır. İlgili Konu: 4.2


Ana Başlık 1 — Açık Uçlu

A1. «Programlama, p5.js ve İlk Sketch» konusundaki merkezi kavramı kendi cümlelerinizle açıklayın ve bunu somut bir mini oyun / sketch örneğine bağlayın.

A2. «Programlama, p5.js ve İlk Sketch» için küçük bir varyasyon tasarlayın (yeni kural, sınır durumu veya görsel geri bildirim). Hangi fonksiyonlar değişir? Madde madde yazın.

A3. Bu ana başlıkta sık yapılan bir yanlış varsayımı (yanlış indeks, sıra, durum veya veri modeli) seçin; neden hatalı olduğunu ve doğru yaklaşımı iki–üç cümleyle yazın.


Ana Başlık 2 — Açık Uçlu

A1. «Koordinat Sistemi, Çizim, setup ve draw» konusundaki merkezi kavramı kendi cümlelerinizle açıklayın ve bunu somut bir mini oyun / sketch örneğine bağlayın.

A2. «Koordinat Sistemi, Çizim, setup ve draw» için küçük bir varyasyon tasarlayın (yeni kural, sınır durumu veya görsel geri bildirim). Hangi fonksiyonlar değişir? Madde madde yazın.

A3. Bu ana başlıkta sık yapılan bir yanlış varsayımı (yanlış indeks, sıra, durum veya veri modeli) seçin; neden hatalı olduğunu ve doğru yaklaşımı iki–üç cümleyle yazın.


Ana Başlık 3 — Açık Uçlu

A1. «Değişkenler, Operatörler ve Koşullu İfadeler» konusundaki merkezi kavramı kendi cümlelerinizle açıklayın ve bunu somut bir mini oyun / sketch örneğine bağlayın.

A2. «Değişkenler, Operatörler ve Koşullu İfadeler» için küçük bir varyasyon tasarlayın (yeni kural, sınır durumu veya görsel geri bildirim). Hangi fonksiyonlar değişir? Madde madde yazın.

A3. Bu ana başlıkta sık yapılan bir yanlış varsayımı (yanlış indeks, sıra, durum veya veri modeli) seçin; neden hatalı olduğunu ve doğru yaklaşımı iki–üç cümleyle yazın.


Ana Başlık 4 — Açık Uçlu

A1. «Fare Girdisi ve Daire Tıklama Oyunu» konusundaki merkezi kavramı kendi cümlelerinizle açıklayın ve bunu somut bir mini oyun / sketch örneğine bağlayın.

A2. 03-daire-tiklama örneğini temel alarak bu ana başlığa özgü bir kural veya görsel geri bildirim ekleyin; değişen satırları madde madde yazın.

A3. Bu ana başlıkta sık yapılan bir yanlış varsayımı (yanlış indeks, sıra, durum veya veri modeli) seçin; neden hatalı olduğunu ve doğru yaklaşımı iki–üç cümleyle yazın.