Matematik ve oyun programlama aslında yanlış anlaşılan bir ilişkiye sahiptir. Bir çok kişi iyi matematik problemlerini çözen veya iyi matematik yetenekleri olan kişinin iyi bir şekilde yazılımcı ya da programcı olduğunu düşünür fakat bu öyle değildir. En iyi üniversitelerden mezun olan toplumun genelde "zeki" olarak tanımladığı insanlar programcılıkta tam anlamıyla bir andaval olabiliyor. Oyun programlamaktan bahsedecek olursak bu konu "Bir kişinin oyun yazılımı yapması için matematik gerçekten ne kadar gereklidir?" gibi soruların cevabını arar.
Kısa cevap: Oyun programlamak için üst düzey bir matematik bilgisi gerekli değildir. Hatta türev ve integral bile oyun programlamak için baya gereksiz konulardır
Günümüzdeki gelişen oyun motorlarının gelişimiyle herkes basit bir matematik bilgisiyle, oyun programcısı olabilir. Önemli olan burada kişinin matematik bilgisinden ziyade edindiği tecrübesi ve mantıklı bir şekilde oyun motorundaki bileşenleri uygulamasıdır.
Önce oyun programcılığının da belirli bir dallara ayrıldığını düşünmeniz lazım. Örneğin grafik programlama ,ağ(network) programlama, yapay zeka(AI) programlama, oynanış(gameplay) programlama ve fizik programlama(bu dallar çoğaltılabilinir.)
Yapacağınız programlama veya yazılım ekipteki görevinizle alakalıdır. Grafik programlayıcısının gerçekten iyi bir matematik ve geometri bilgisine ihtiyacı vardır. Fakat ağ programlayıcı daha çok tecrübesi ve bilgisiyle ön plana çıkar. Oynanış programcısının özelliği ise soyutsal düşünme yeteneği ve mantığıdır. Oyun motoru teknolojileri ile artık bir oyun geliştirmek için bir ağ prototipi ya da buna benzer bir gölgelendirme sıvaması yapmaya gerek kalmıyor. Bu yüzden genel bir oyun programcısının bilmesi gereken matematik yetenekleri şunlardır:
Toplama, çıkarma, bölme ve çarpma: Bildiğiniz gibi çok kolay değil mi? Bir canavar oyuncuya saldırdığında, oyuncunun can puanını -20 düşür. DPS(Bir saniyedeki hasar) TOPLAM HASAR/60 = DPS gibisinden. Pekala! bunun gibi şeyleri türetebiliriz varsayıyoruz.
Mod Alma: Bir sayının bir sayıya bölümünden kalan demektir. Örneğin 10 sayısını 8'e böldük kalan 2, o zaman 8 sayısı mod10'da 2'ye eşittir demektir. Bir sayının tek veya çift olduğunu öğrenmek için o sayıyı 2'ye böleriz, eğer sayı tam bölünüyorsa(yani kalanı == 0) çift, eğer sayı tam bölünmüyorsa(yani kalanı==1) ise o sayı tektir.
Oyuncu bir zar attı ve çift gelirse +20 sağlık puanı kazanıyor. Tek gelirse Burada iki ihtimalimiz var. Zarların üstündeki sayılar 1'den 6 ya kadar 3 tane çift 3 tane tek sayımız var. Ya çift gelecek ya da tek. Peki şöyle düşünelim
örneğin;
zar = 1 ile 6 arasındaki rastgele bir sayıyı random fonksiyonuyla aldık.
zar sayısının mod 2 de kalanı eğer 0 ise bu sayı çifttir ve +20 sağlık puanı ekle
eğer değilse -20 sağlık puanı ekle.
Çok basit değil mi?
Yüzde Alma: Yüzde almak sadece bir verinin daha derli toplu olduğunu göstermesi anlamından başka bir şey değildir. aslında 3 dediğimiz sayı 3/1 fakat yüzde üç dediğimiz sayı 3/100 yani yüzde üç, yüz tane elmadan sadece üçü demek. Diyelim bir sayının %54'ünü alacağız, sayımız 350 olsun 350*0.54 sayısı bize o sayının %54'ünü verir.
Diyelim ki bir canvarın kalan canının yüzde kaç olduğunu bulmak istiyorsunuz. Bunu basit bir oran orantı ile de yapabilirsiniz. Canavarın toplam canı 300 olsun. Canavar saldırdık ve canavarın sağlık puanı 200 oldu. Diyoruz ki, 300 de 100 ise 200'de kaç? işte bunun cevabı bize verir
Değişken şeklinde düşünelim
KALAN_CAN = TOPLAM_CAN - VERİLEN_HASAR;
KALAN_CAN*100/TOPLAM_CAN gibisinden formüller üretebilirsiniz.
Negatif Sayıları Bilmek: Evet, -1 sayısı, -2 sayısı. -1 * -1 = +1 olur. -5 * 3 = -15 olur. vs..
Kartezyen Koordinat Sistemi: Bilgisayar sisteminde (0,0) orjini belirtir( Ekranın sol ve üst köşesindeki yer) X ekseni ilk bileşeni, Y ekseni ise ikinci bileşeni ifade eder. Yukarıdan aşağıya doğru çektiğimiz zaman Y değişkeni değişir. Soldan sağa doğru fareyi çektiğimizde X değişkeni değişir. Aynı zamanda üç boyutlu düzlemde x, y, z gibi bileşenlere ayrılır.
Pisagor Teoremi: Basitçe, a^2 + b^2 = c^2. (x1, y1) ve (x2, y2) yani iki tane 2 boyutlu nokta üzerindeki uzaklığı bulmak için kullanıyoruz.
Basit Cebir: x + 5 = 7 ise x=2'dir. Hepsi bu evet.
Gelişmiş Seviye Oyun Programcılığı: Trigonometri, Doğrusal Cebir(Linear Algebra) ve Matrisler: Belki de matematik bilmeyenler için en zor kısıma geldik. 3B şeyler genellikle trigonometri ve doğrusal cebir (matrislerle uğraşılan) kısmı için mantığını anlaması için temel olarak bilinmesi gereken şeylerdir. Vektörlerde toplama, çıkarma, çarpma, toplama gibi temel oluşumları bilmeniz gerekli. Trigonometrideki cos,sin gibi temel şeyleri bilmeniz ve matrisler sayesinde oyundaki bir kübün yönünü, dönüşümünü ve çevrilmesini sağlayabilirsiniz. Eğer Unreal Engine, CryEngine veya Unity 3D gibi oyun motorlarını kullanıyorsanız gerçekten işiniz çok kolay demektir. Basit bir lineer cebir eğitimi ile yapı-taşlarını anlayacaksınız.
Mesela dot product(nokta çarpım) işlemini kullanırsanız bir karakterin diğer karakterin önünde mi yoksa arkasında mı olduğunu anlayabilirsiniz.
Görüldüğü gibi matematik oyun programlamada abartılı bir şekilde kullanılmaz hatta hiç matematik bilmeden oyun programcısı olan bir çok kişi vardır. Fakat eğer bir depremin daha önceden hesaplanmasını bulmak istiyorsanız o zaman deli gibi bir matematik bilgisine ihtiyacınız vardır. Ya da bilgisayar bilimleri ile ilgili en büyük fibonacci sayısını bulacaksanız o zaman geniş çaplı bir matematik uzmanı olmanız gerekli.
Peki oyun programlayıcısı olmak için ne gerekli?
İyi bir oyun programlayıcısı olmanın tek şartı kendinizi sürekli geliştirmeniz ve tecrübe edinmenizdir. Gerçekten dehşet derecede yalayıp yutacak matematik bilmenize gerek yok. Hatta üniversitede & lisede öğretilen bir çok matematik konusunun oyun programlama ile alakası yok. Zorlanacağınız tek konu belki de Doğrusal Cebir olacaktır.
Daha sonra var olan soyutsal düşünceleri oyuna aktarmak için yapacağınız hamleyi bilgileriniz ve tecrübelerinizle sahneye aktarmanız lazım.
En basitinden diyelim ki bir oynanış programcısısınız ve envanter sistemi yapacaksınız. Ve itemleri envanterinizden ekleyip çıkarmak istiyorsunuz.
Aşağıdaki kod sadece matematiğin basit işlemlerde kullanıldığını göstermek amacıyla yazılmıştır. Lütfen ciddiye almayınız.
can = 3 olsun
oyunaDevam doğru durumunu alsın
a 8 elemanlı bir dizi olsun
do
{
grafikleriCiz();
eğer oyuncu bir canavarı öldürürse oyuncunun envanter dizisine yeni bir girdi ekle
oyuncu.esyaekle("kumaş pantolon");
oyuncu.esyaekle("altın kılıç");
eğer oyuncu ölürse (yani canı 0'dan az olursa)
oyuncu sınıfının eşya ekle dizisinin her elemanı sil.
eğer oyuncu c tuşuna basarsa envanterini göstermek istiyoruz.
oyuncu sınıfının her bir elemanını yazdır
eğer canavar oyuncuya saldırırsa
oyuncunun canını bir azalt. yani can--;
eğer can 0 a eşitse veya küçükse
oyuna devam yanlış değerini alsın
}
while(oyunaDevam yanlış olmayana kadar); yani can 0'a eşit olana kadar bu döngüyü devam ettir.
gördüğünüz gibi matematik sadece toplama ve çıkartma...
vereceğim bir diğer örnek ise pacman oyununun algoritması (temel bazlı alınmıştır) Bir yapay zeka programcısı buna benzer şeyler yapar.
7 saniye boyunca dağılın, ardından 20 saniye boyunca kovalayın.
7 saniye boyunca dağılın, ardından 20 saniye boyunca kovalayın.
5 saniye boyunca dağılın, sonra 20 saniye boyunca kovalayın.
5 saniye boyunca dağılın, sonra da Kalıcı olarak Chase moduna geçin.
Pathfinding(yol bulma) sistemi temel bazlı şöyle işliyor. kırmızı noktada karakterimiz olsun, kırmızı hayalet en kısa yol için 4, en uzun yol için 9 hamlesi var diyelim. Diğer hayaletlerin sayısı ile harekete geçiyor(Muhtemelen bir döngü içerisinde) eğer en kısa yol 4 ise diğer hayaletler en uzun yolu seçiyor. Kısacası anlatmak istediğim yine yüksek derecede bir matematik yok. 3D oyunlarda da NPC lerin sizi takip etmesi sadece vektörlerin belirli bir yolu takip etmesiyle. Sadece lineer koordinatlar değişiyor.
3B veya 2B grafiklerin oluşması için matematiği bilmenize gerek yok çünkü openGL, webGL, Vulkan ve DirectX gibi grafik kütüphaneleri bunu çok kolay şekilde sağlıyor. Sadece nasıl kullanabileceğinizi öğrenmeniz lazım. Fizik konusuna gelirsek o da aynı şekilde. Eğer NVDIA'da çalışacaksanız tabii ki müthiş bir fizik bilgisine sahip olmanız gerekli ama bir Blizzard veya EA'da oyun programcısı olarak çalışacaksanız gerçekten çok fazla bir matematik bilgisine gerek yok.
Bunun dışında pygame(Python için), Allegro, SFML, SDL gibi oyunları yapmak için içinde klavye giriş çıkışı, ses yönetimi, ağ yönetimi ve grafik kütüphaneleri barındıran kütüphaneler mevcut. Bunların nasıl kullanıldığını öğrenirseniz, matematiğe gerek kalmayacaktır. Kendi oyun motorunuzu yapmak istiyorsanız(ki bu gerçekten çok çok çok zor bir iştir bu sefer gerçekten matematiğe ihtiyaç duyacaksınız.)oyun motoru derken sadece bir oyunun motorundan bahsetmiyorum geniş çaplı bir oyun motorundan bahsediyorum. Yoksa basit bir oyun motoru yapmak zor değil.)
Son olarak oyun geliştirmek ve programlamak her insan için kolay bir iş olmaya başladı. İyi bir oyun yapıp bu işi profesyönel bir şekilde idare etmek istiyosanız en zor türev, integral ya da en zor matematik sorusu çözmek size oyun geliştirme konusunda kişiye oyun programlamak hakkında hiçbir şey kazandırmaz.
Bu konu tartışmaya açıktır.
Kısa cevap: Oyun programlamak için üst düzey bir matematik bilgisi gerekli değildir. Hatta türev ve integral bile oyun programlamak için baya gereksiz konulardır
Önce oyun programcılığının da belirli bir dallara ayrıldığını düşünmeniz lazım. Örneğin grafik programlama ,ağ(network) programlama, yapay zeka(AI) programlama, oynanış(gameplay) programlama ve fizik programlama(bu dallar çoğaltılabilinir.)
Yapacağınız programlama veya yazılım ekipteki görevinizle alakalıdır. Grafik programlayıcısının gerçekten iyi bir matematik ve geometri bilgisine ihtiyacı vardır. Fakat ağ programlayıcı daha çok tecrübesi ve bilgisiyle ön plana çıkar. Oynanış programcısının özelliği ise soyutsal düşünme yeteneği ve mantığıdır. Oyun motoru teknolojileri ile artık bir oyun geliştirmek için bir ağ prototipi ya da buna benzer bir gölgelendirme sıvaması yapmaya gerek kalmıyor. Bu yüzden genel bir oyun programcısının bilmesi gereken matematik yetenekleri şunlardır:
Toplama, çıkarma, bölme ve çarpma: Bildiğiniz gibi çok kolay değil mi? Bir canavar oyuncuya saldırdığında, oyuncunun can puanını -20 düşür. DPS(Bir saniyedeki hasar) TOPLAM HASAR/60 = DPS gibisinden. Pekala! bunun gibi şeyleri türetebiliriz varsayıyoruz.
Mod Alma: Bir sayının bir sayıya bölümünden kalan demektir. Örneğin 10 sayısını 8'e böldük kalan 2, o zaman 8 sayısı mod10'da 2'ye eşittir demektir. Bir sayının tek veya çift olduğunu öğrenmek için o sayıyı 2'ye böleriz, eğer sayı tam bölünüyorsa(yani kalanı == 0) çift, eğer sayı tam bölünmüyorsa(yani kalanı==1) ise o sayı tektir.
Oyuncu bir zar attı ve çift gelirse +20 sağlık puanı kazanıyor. Tek gelirse Burada iki ihtimalimiz var. Zarların üstündeki sayılar 1'den 6 ya kadar 3 tane çift 3 tane tek sayımız var. Ya çift gelecek ya da tek. Peki şöyle düşünelim
örneğin;
zar = 1 ile 6 arasındaki rastgele bir sayıyı random fonksiyonuyla aldık.
zar sayısının mod 2 de kalanı eğer 0 ise bu sayı çifttir ve +20 sağlık puanı ekle
eğer değilse -20 sağlık puanı ekle.
Çok basit değil mi?
Yüzde Alma: Yüzde almak sadece bir verinin daha derli toplu olduğunu göstermesi anlamından başka bir şey değildir. aslında 3 dediğimiz sayı 3/1 fakat yüzde üç dediğimiz sayı 3/100 yani yüzde üç, yüz tane elmadan sadece üçü demek. Diyelim bir sayının %54'ünü alacağız, sayımız 350 olsun 350*0.54 sayısı bize o sayının %54'ünü verir.
Diyelim ki bir canvarın kalan canının yüzde kaç olduğunu bulmak istiyorsunuz. Bunu basit bir oran orantı ile de yapabilirsiniz. Canavarın toplam canı 300 olsun. Canavar saldırdık ve canavarın sağlık puanı 200 oldu. Diyoruz ki, 300 de 100 ise 200'de kaç? işte bunun cevabı bize verir
Değişken şeklinde düşünelim
KALAN_CAN = TOPLAM_CAN - VERİLEN_HASAR;
KALAN_CAN*100/TOPLAM_CAN gibisinden formüller üretebilirsiniz.
Negatif Sayıları Bilmek: Evet, -1 sayısı, -2 sayısı. -1 * -1 = +1 olur. -5 * 3 = -15 olur. vs..
Kartezyen Koordinat Sistemi: Bilgisayar sisteminde (0,0) orjini belirtir( Ekranın sol ve üst köşesindeki yer) X ekseni ilk bileşeni, Y ekseni ise ikinci bileşeni ifade eder. Yukarıdan aşağıya doğru çektiğimiz zaman Y değişkeni değişir. Soldan sağa doğru fareyi çektiğimizde X değişkeni değişir. Aynı zamanda üç boyutlu düzlemde x, y, z gibi bileşenlere ayrılır.
Pisagor Teoremi: Basitçe, a^2 + b^2 = c^2. (x1, y1) ve (x2, y2) yani iki tane 2 boyutlu nokta üzerindeki uzaklığı bulmak için kullanıyoruz.
Basit Cebir: x + 5 = 7 ise x=2'dir. Hepsi bu evet.
Gelişmiş Seviye Oyun Programcılığı: Trigonometri, Doğrusal Cebir(Linear Algebra) ve Matrisler: Belki de matematik bilmeyenler için en zor kısıma geldik. 3B şeyler genellikle trigonometri ve doğrusal cebir (matrislerle uğraşılan) kısmı için mantığını anlaması için temel olarak bilinmesi gereken şeylerdir. Vektörlerde toplama, çıkarma, çarpma, toplama gibi temel oluşumları bilmeniz gerekli. Trigonometrideki cos,sin gibi temel şeyleri bilmeniz ve matrisler sayesinde oyundaki bir kübün yönünü, dönüşümünü ve çevrilmesini sağlayabilirsiniz. Eğer Unreal Engine, CryEngine veya Unity 3D gibi oyun motorlarını kullanıyorsanız gerçekten işiniz çok kolay demektir. Basit bir lineer cebir eğitimi ile yapı-taşlarını anlayacaksınız.
Mesela dot product(nokta çarpım) işlemini kullanırsanız bir karakterin diğer karakterin önünde mi yoksa arkasında mı olduğunu anlayabilirsiniz.
Görüldüğü gibi matematik oyun programlamada abartılı bir şekilde kullanılmaz hatta hiç matematik bilmeden oyun programcısı olan bir çok kişi vardır. Fakat eğer bir depremin daha önceden hesaplanmasını bulmak istiyorsanız o zaman deli gibi bir matematik bilgisine ihtiyacınız vardır. Ya da bilgisayar bilimleri ile ilgili en büyük fibonacci sayısını bulacaksanız o zaman geniş çaplı bir matematik uzmanı olmanız gerekli.
Peki oyun programlayıcısı olmak için ne gerekli?
İyi bir oyun programlayıcısı olmanın tek şartı kendinizi sürekli geliştirmeniz ve tecrübe edinmenizdir. Gerçekten dehşet derecede yalayıp yutacak matematik bilmenize gerek yok. Hatta üniversitede & lisede öğretilen bir çok matematik konusunun oyun programlama ile alakası yok. Zorlanacağınız tek konu belki de Doğrusal Cebir olacaktır.
Daha sonra var olan soyutsal düşünceleri oyuna aktarmak için yapacağınız hamleyi bilgileriniz ve tecrübelerinizle sahneye aktarmanız lazım.
En basitinden diyelim ki bir oynanış programcısısınız ve envanter sistemi yapacaksınız. Ve itemleri envanterinizden ekleyip çıkarmak istiyorsunuz.
Aşağıdaki kod sadece matematiğin basit işlemlerde kullanıldığını göstermek amacıyla yazılmıştır. Lütfen ciddiye almayınız.
can = 3 olsun
oyunaDevam doğru durumunu alsın
a 8 elemanlı bir dizi olsun
do
{
grafikleriCiz();
eğer oyuncu bir canavarı öldürürse oyuncunun envanter dizisine yeni bir girdi ekle
oyuncu.esyaekle("kumaş pantolon");
oyuncu.esyaekle("altın kılıç");
eğer oyuncu ölürse (yani canı 0'dan az olursa)
oyuncu sınıfının eşya ekle dizisinin her elemanı sil.
eğer oyuncu c tuşuna basarsa envanterini göstermek istiyoruz.
oyuncu sınıfının her bir elemanını yazdır
eğer canavar oyuncuya saldırırsa
oyuncunun canını bir azalt. yani can--;
eğer can 0 a eşitse veya küçükse
oyuna devam yanlış değerini alsın
}
while(oyunaDevam yanlış olmayana kadar); yani can 0'a eşit olana kadar bu döngüyü devam ettir.
gördüğünüz gibi matematik sadece toplama ve çıkartma...
vereceğim bir diğer örnek ise pacman oyununun algoritması (temel bazlı alınmıştır) Bir yapay zeka programcısı buna benzer şeyler yapar.
7 saniye boyunca dağılın, ardından 20 saniye boyunca kovalayın.
7 saniye boyunca dağılın, ardından 20 saniye boyunca kovalayın.
5 saniye boyunca dağılın, sonra 20 saniye boyunca kovalayın.
5 saniye boyunca dağılın, sonra da Kalıcı olarak Chase moduna geçin.

Pathfinding(yol bulma) sistemi temel bazlı şöyle işliyor. kırmızı noktada karakterimiz olsun, kırmızı hayalet en kısa yol için 4, en uzun yol için 9 hamlesi var diyelim. Diğer hayaletlerin sayısı ile harekete geçiyor(Muhtemelen bir döngü içerisinde) eğer en kısa yol 4 ise diğer hayaletler en uzun yolu seçiyor. Kısacası anlatmak istediğim yine yüksek derecede bir matematik yok. 3D oyunlarda da NPC lerin sizi takip etmesi sadece vektörlerin belirli bir yolu takip etmesiyle. Sadece lineer koordinatlar değişiyor.
3B veya 2B grafiklerin oluşması için matematiği bilmenize gerek yok çünkü openGL, webGL, Vulkan ve DirectX gibi grafik kütüphaneleri bunu çok kolay şekilde sağlıyor. Sadece nasıl kullanabileceğinizi öğrenmeniz lazım. Fizik konusuna gelirsek o da aynı şekilde. Eğer NVDIA'da çalışacaksanız tabii ki müthiş bir fizik bilgisine sahip olmanız gerekli ama bir Blizzard veya EA'da oyun programcısı olarak çalışacaksanız gerçekten çok fazla bir matematik bilgisine gerek yok.
Bunun dışında pygame(Python için), Allegro, SFML, SDL gibi oyunları yapmak için içinde klavye giriş çıkışı, ses yönetimi, ağ yönetimi ve grafik kütüphaneleri barındıran kütüphaneler mevcut. Bunların nasıl kullanıldığını öğrenirseniz, matematiğe gerek kalmayacaktır. Kendi oyun motorunuzu yapmak istiyorsanız(ki bu gerçekten çok çok çok zor bir iştir bu sefer gerçekten matematiğe ihtiyaç duyacaksınız.)oyun motoru derken sadece bir oyunun motorundan bahsetmiyorum geniş çaplı bir oyun motorundan bahsediyorum. Yoksa basit bir oyun motoru yapmak zor değil.)
Son olarak oyun geliştirmek ve programlamak her insan için kolay bir iş olmaya başladı. İyi bir oyun yapıp bu işi profesyönel bir şekilde idare etmek istiyosanız en zor türev, integral ya da en zor matematik sorusu çözmek size oyun geliştirme konusunda kişiye oyun programlamak hakkında hiçbir şey kazandırmaz.
Bu konu tartışmaya açıktır.