Python *args ve **kwargs Kullanımı

*args nedir?

*args sınırsız sayıda argüman almamızı sağlar. Fonksiyonun argument bölümünde kullanılır. Ayrıca programın çökmesini engeller. Bazı durumlarda kullanılacak olan argüman sayısı belli olmayabilir. Böyle durumlarda *args kullanmak yararlı olabilir.
def goster(*args):
    for arg in args:
        print(arg)

goster("ahmet", "mehmet", 12)
goster(23, True)
Yukarıda görüldüğü *args kullanımıyla birlikte parametre kısmında istediğimiz sayıda argüman verebiliriz. Şimdi biraz daha detaylandıralım:
liste = ["ahmet", "mehmet", 12]

goster(liste)
Eğer bu şekilde verirsek liste elemanları alt alta sıralanıp gösterilmeyecek. Direkt olarak ['ahmet', 'mehmet', 12] sonucu elde edeceğiz. Çünkü verdiğimiz argüman bir liste olarak görülmüyor. Bu argümanın liste olarak görünmesi için aşağıdaki şekilde bir kullanılmalıdır.
goster(*liste)

**kwargs nedir? 

**kwargs argümanı *args argümanı gibi olmakla birlikte ondan ayrı bir özellik olarak değer atanmış argümanlardır. Kısacası bu argümanlar default olarak tanımlıdır.
def goster_2(**kwargs):
    for e in kwargs.items():
        print(e)

goster_2(pi = 3.14, e = 2.78, g = 10)
Elde ettiğimiz sonuç aşağıdaki gibi olur:
('pi', 3.14)
('e', 2.78)
('g', 10)
Sadece değerleri ekrana yazdırmak istersek e yerine e[1] yazmamız yeterli olacaktır.
Devamını Oku »

Python ile Dosya Oluşturma

Yeni bir proje dosyası oluşturalım. Main.py adında bir dosya oluşturulalım. Python ile dosya oluşturmamız için gerekli fonksiyonu yazalım. Fonksiyon ismini dosyaOlustur olarak belirledik.

Şimdi belli bir aşamada kodlarımızı yazalım. Ayrıca main.py dosyasının main yani ana dosya olduğunu belirtmek için if __name__ == '__main__': koşullu ifadesi yazılmaktadır. Bu sayede dosya çalıştırıldığında direkt olarak bu koşullu ifade altında yer alan fonksiyonlar çalıştırılmış olacaktır.
def dosyaOlustur(ad):
    pass

if __name__ == '__main__':
    dosyaOlustur("deneme")
Dosya işlemleri için os modülünden path sınıfını kullanmamız gerekli:
from os import path
dosyaOlustur fonksiyonunda aşağıdaki geliştirmeler yapılır. Öncelikle parametre olarak dosya adını alıyoruz. Ayrıca bu ad ile oluşturulmuş bir dosya varsa kontrol ediliyor ki bunu path.isFile ile yapıyoruz.
def dosyaOlustur(ad):
    if path.isfile(ad):
        print("Bu ad ile oluşturulmuş dosya zaten mevcut")
    else:
        file = open(ad, "w")
        file.write("merhaba")
        file.close()
        print("dosya olusturuldu")
Program çalıştırıldıktan sonra deneme adında dosya, program dosyamızın bulunduğu dizinde yazılacaktır. Eğer bu ad ile oluşturulmuş bir dosya var ise uyarıda bulunacaktır.
Devamını Oku »

Nasıl Yılan Oyunu Yapılır?

Bu yazı serimizde nasıl yılan oyunu yapılır, onu öğreneceğiz. Yılan oyununu yapmak için belli bir seviye programlama bilgisine ihtiyaç vardır. Kullanılacaklar programlama dili Python ve onun modülü olan oyun geliştirme kütüphanesi Pygame. Pygame hakkında ayrınıtılı bilgiyi web sayfasından edinebilir, ayrıca pygame kullanılarak yapılmış oyun örneklerini inceleyebilirsiniz.

Yılan oyunu yaparken aslında Pygame nasıl kullanılır onu da öğrenmiş olacağız. Bu sebeple yazıları elimden geldiğince ayrıntılı tutmaya çalışıyorum. Ayrıca yazılar belli aralıklarla güncellenebilir ve var olan yazım hataları giderilmeye çalışılacaktır. Yılan oyununu yaparken yazılan kod modüler olmaktan çok ilk başta spagetti bir kod olarak yazılacaktır. Sırasıyla dersler:

Devamını Oku »

Pygame Yılanı Hareket Ettirme

Yılanı hareket ettirmeyi bu yazıda sağlayacağız. İlk olarak Snake sprite sınıfında move adında bir metot oluşturuyoruz. Bu metot event loop içinde kullanılacaktır. Örneğin, oyuncu yukarı tuşuna bastığında move fonksiyonu parametresi y=-1 olmak üzere bir birim yukarı çıkacaktır. Ancak her ne kadar değerler üzerinde değişiklik olsa bile bu durum çizimlere yansımayacaktır çünkü sprite update edilmeden görüntünün değişmesi mümkün değildir. Bu sebeple update adında metot yazılır ve yılan karakterinin ekrandaki konumu görünüm olarak güncellenir:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        ...
    
    def move(self, x=0, y=0):
        self.x += x
        self.y += y

    def update(self):
        self.rect.x = self.x * 32
        self.rect.y = self.y * 32
Sıra move metotunu oyun döngüsünde yer alan event loop içinde kullanmaya geldi. Oyuncu, yukarı ok tuşuna bastığında y=-1, aşağı ok tuşuna bastığında y=1, sağ ok tuşuna bastığında x=1 ve sol ok tuşuna bastığında x=-1 argümanlarını alacaktır:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snake.move(x=-1)
            if event.key == pygame.K_RIGHT:
                snake.move(x=1)
            if event.key == pygame.K_UP:
                snake.move(y=-1)
            if event.key == pygame.K_DOWN:
                snake.move(y=1)
Şimdi oyunu çalıştıralım ve hareket işleminin nasıl gerçekleştiğine bakalım:
Pygame Yılan Oyunu
Görüldüğü gibi yılanı hareket ettirdiğimizde geçtiği her yeri kırmızı yapıyor. Bunun çözümü ise oldukça basit. Her güncelleme esnasında yine aynı şekilde ekranı da siyah renk ile doldurursak çözüm sağlanmış olur:
    # çizim
    display.fill((0,0,0))
    
    for x in range(0, 720, 32):
        ...
    for y in range(0, 480, 32):
        ...

    all_sprites_group.draw(display)
    pygame.display.flip()
Oyunu tekrar çalıştırdığımızda ise aşağıdaki sonucu elde ederiz:
Pygame Yılan Oyunu
Normalde yılan oyununda yılan sürekli hareket eder, oyuncu ise ona sadece yön verir. Ancak şu ana kadar yılanı hareket ettirmek tuşlara tekrar basılı tutmalıyız. Normal sadece bir kere sol ok tuşuna bastığımızda yılan hiç durmadan sol yöne doğru hareket etmeli.

Yön doğrultusunda hareket yapılacağı için dir adında bir özellik tanımlanır Snake sınıfı içinde ve move fonksiyonu aşağıdaki gibi güncellenir, yılan hareket ettikten sonra aktif yönde durmadan hareket etmesi gerektiği için update fonksiyonu da yine aşağıdaki gibi değiştirilir:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        ...
        self.dir = ""
    
    def move(self, dir):
        self.dir = dir

    def update(self):
        if self.dir == 'left':
            self.rect.x -= 1 * 32
            self.x -= 1 
            self.rect.y = self.y * 32
        if self.dir == 'right':
            self.rect.x += 1 * 32
            self.x += 1 
            self.rect.y = self.y * 32
        if self.dir == 'up':
            self.rect.x = self.x * 32
            self.rect.y -= 1 * 32
            self.y -= 1
        if self.dir == 'down':
            self.rect.x = self.x * 32
            self.rect.y += 1 * 32
            self.y += 1
Nesnenin yönlere göre hareket ettirilmesi için event loop içinde aşağıdaki değişiklikler yapılır:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snake.move(dir='left')
            if event.key == pygame.K_RIGHT:
                snake.move(dir='right')
            if event.key == pygame.K_UP:
                snake.move(dir='up')
            if event.key == pygame.K_DOWN:
                snake.move(dir='down')
Oyun çalıştırıldığında ve yılan hareket ettirildiğinde muhtemelen ekranda hiçbir şey görünmeyecektir. Bu durumda yapmamız gereken oldukça basit, kare hızını düşürmek olacaktır. Bunun için tick metotu kullanılacak. İlk olarak clock adında bir zaman nesnesi tanımlanır:
display = pygame.display.set_mode((720, 480))

# **
clock = pygame.time.Clock() 

pygame.display.set_caption('Merhaba Dünya')
Sonrasında oyun döngüsü içinde flip fonksiyonundan sonra tick metotu aşağıdaki gibi kullanılır:
while True:
    for event in pygame.event.get():
        ...
    # güncelle
    ...

    # çizim
    ...
    pygame.display.flip()
    
    clock.tick(5)
clock.tick(5)'in anlamı her bir saniyede sadece 5 frame(kare) gösterileceğidir. Bu kısım oldukça önemli çünkü yılanın hızını yine tick metotuna göre değiştireceğiz.
Devamını Oku »

Pygame Sprite Groups Kullanımı

Bu yazıda Sprite sınıfına ait olan Groups container kullanılacak. Ayrıca eklediğimiz yılan karakterinin grid üzerine tam olarak oturtulması sağlanacak. Sprite Group, kısaca spritelerin tek bir yerde toplanmasıdır. Örneğin, kontrol ettiğimiz karakter, düşman oyun objeleri, diğer objeler vs. hepsi için ayrı ayrı sprite oluşturduğumuzu düşünürsek bunları tek bir yapı içinde toplayıp oyun döngüsü içinde aynı anda çizip, güncellenmesini sağlıyoruz. 

snake adlı oluşturduğum nesnenin hemen üstünde all_sprites_group adında pygame Group container oluşturuyorum. Tüm spriteları buraya ekleyeceğiz:
all_sprites_group = pygame.sprite.Group()
Önceki yazı ile paralel gittiğim için draw metotunu siliyoruz. Çünkü artık ona ihtiyacımız olmayacak sprite groups'tan dolayı. Snake sınıfına ait __init__ yani kurucu metotu parametresine Sprite Groups container'ı ekliyoruz. Sonrasında bunu groups adlı değişkene atayıp, super kurucu fonksiyona ikinci parametre olarak pass ediyoruz.
Kısacası Snake sprite sınıfımızı şu hale gelmiş oluyor:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        # ana sınıfı çağır
        self.groups = all_sprites_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        
        self.image = pygame.Surface([w, h])
        self.image.fill(color)

        # image boyutlarına göre dikdörtgen nesnesi döndürülür
        self.rect = self.image.get_rect()
        # nesnenin pozisyonunu ayarla
        self.rect.x = x
        self.rect.y = y
Sonrasında ise snake adlı nesneyi oluştururken aşağıdaki gibi küçük bir ekleme yani sprite groups container pass ediliyor:
snake = Snake(all_sprites_group, 150, 60, 32, 32, (255, 0, 0))
Bu işlemden sonra tek yapmamız gereken oyun döngüsü içinde sprite group aracılığı ile karakter çizimi sağlamak. Döngü aşağıdaki gibi oluyor:
while True:
    for event in pygame.event.get():
        ...

    # çizim
    
    ...
    
    # sprite group içindeki tüm spritelar display yani ekrana çizdirilsin
    all_sprites_group.draw(display)

    pygame.display.flip()
Daha sonra çalıştırıldığında düzgün bir şekilde karakterin eklendiği görülecektir. Bu şekilde tüm spriteları tek bir grup içinde toplayıp aynı anda güncelleyip, çizdirebiliriz.

Yılan Nesnesini Hizalama

Çözmemiz gereken bir diğer sorun ise yılan nesnesini ızgaraya göre hizalama. Grid hücrelerine tam olarak oturtmak. Eğer farkettiyseniz her bir grid boyutu 32px boyutunda keza yılan nesnesi de 32px boyutunda. O zaman yapmamız gereken yılan nesnesini px değer ile konumlamak yerine grid miktarına göre konumlandırmak. Örneğin, ekranda genişlik olarak 22, yükseklik olarak 15 hücre bulunmakta. Yani toplamda 22 x 15 hücreden oluşmaktadır. Aşağıdaki resimde işaretli alanda yılan nesnesini başlangıç olarak konumlandırmak istediğimizi düşünelim:
Yılan Oyunu Pygame
Bizim yapmamız gereken işlem sadece x ekseni olduğunu varsayarsak 2, y ekseni olduğunu var sayarsak 1 değerini vermek olacaktır. 2*32'den ve 1*32'den yılan nesnesi tam olarak grid üstüne oturacaktır. Bunu yapabilmek için Snake sınıfında kurucu fonksiyonu aşağıdaki gibi gerekli yerleri düzenliyoruz:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        ...
        
        # nesnenin pozisyonunu ayarla
        self.rect.x = x * 32
        self.rect.y = y * 32
Sonrasında snake nesnesi oluştururken parametrelerde x: 2 ve y: 1 olarak verilir:
snake = Snake(all_sprites_group, 2, 1, 32, 32, (255, 0, 0))
Artık hizalama aşağıda olduğu gibi gerçekleşmiştir:
Yılan Oyunu Pygame
Kodun tam hali:
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

white = (255, 255, 255)

class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, all_sprites_group, x, y, w, h, color):
        # ana sınıfı çağır
        self.groups = all_sprites_group
        pygame.sprite.Sprite.__init__(self, self.groups)
        
        self.image = pygame.Surface([w, h])
        self.image.fill(color)

        # image boyutlarına göre dikdörtgen nesnesi döndürülür
        self.rect = self.image.get_rect()
        # nesnenin pozisyonunu ayarla
        self.rect.x = x * 32
        self.rect.y = y * 32
    
all_sprites_group = pygame.sprite.Group()

snake = Snake(all_sprites_group, 2, 1, 32, 32, (255, 0, 0))

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    # çizim
    
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    
    all_sprites_group.draw(display)

    pygame.display.flip()

sys.exit()
Devamını Oku »

Pygame Sprite Kullanımı (Yılan Ekleme)

Önceki yazıda çizgiler aracılığı ile grid yani ızgara bir görünüm kazandırmıştık oyun ekranında. Şimdi ise sıra oyuncunun kontrol edeceği yılanı oyuna eklemeye geldi. Pygame içerisinde hazır bir class mevcuttur. Bu class, Sprite sınıfıdır. Kısaca açıklamak gerekirse oyunda bir şekilde kontrol edilmesi gereken nesneler bu sınıftan oluşturulur. Sprite sınıfı beraberinde Sprite.image ve Sprite.rect gibi özellikleri yanında getirmektedir. Cümle sonundaki bağlantıdan ayrıntılı bilgi edinebilirsiniz. (https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite)

Şimdi Sprite sınıfının yardımıyla yılan karakterini oyun için oluşturmaya başlayalım. Öncelikle Snake adında bir sınıf oluşturuyorum ve sonrasında Sprite sınıfından kalıtım alıyorum:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, x, y, w, h, color):
        # ana sınıfı çağır
        pygame.sprite.Sprite.__init__(self)
        
        self.image = pygame.Surface([w, h])
        self.image.fill(color)

        # image boyutlarına göre dikdörtgen nesnesi döndürülür
        self.rect = self.image.get_rect()
        # nesnenin pozisyonunu ayarla
        self.rect.x = x
        self.rect.y = y
Bir yılan nesnesi oluştururken parametre olarak o yılanın başlangıç poziyonunu, boyutunu ve rengini belirlememiz gerekiyor. Nesneyi oluşturalım ve ekrana çizdirmeye çalışalım. While döngüsünden hemen önce snake adında nesne oluşturuldu.
snake = Snake(150, 60, 32, 32, (255, 255, 0))
Buraya kadar her şey iyi gibi ama çizim kısmında bir sıkıntı var. Öncelikle Sprite sınıfı kendi içerisinde Group adı ile bilinen bir container'a sahip. Bu container, içinde Sprite nesnelerini barındırmaktadır. Oluşturduğumuz her sprite tek bir grupta toplanıyor. Bu sayede kodda büyük oranda azalma meydana geliyor. Her sprite'ı tek tek güncellemeye veya çizmeye gerek kalmıyor. Ancak ben şimdilik Group kısmını es geçeceğim. Nesneyi ekrana çizdirmek için Snake sınıfına draw() adında bir metot ekleyeceğim. Bu metot parametre olarak display yani ekran nesnesini alacak ve bu nesneye sprite nesnesi çizilecek. Bu şekilde ekran çizimi gerçekleşmiş olacak. İlk olarak draw metotu yazılır:
class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, x, y, w, h, color):
        ...
    
    def draw(self, display):
        display.blit(self.image, self.rect)
Artık oyun döngüsü içinde nesneyi çizdirebiliriz:
while True:
    for event in pygame.event.get():
        ...

    # çizim
    
    ...
    
    # snake nesnesini display nesnesine çiz
    snake.draw(display)

    pygame.display.flip()
Elde ettiğimiz sonuç görüntü aşağıdaki gibi olacaktır:
Pygame Sprite Ekleme
Görüldüğü gibi başarılı bir şekilde yılan nesnesini ekledik ama grid üzerine tam oturmadı. Bu durumu tile boyutunu kullanarak düzelteceğiz. Onu bir sonraki yazıda gerçekleştirmeyi düşünüyorum.

Öncelikle yukarıda Snake sınıfı için draw metotu yazmak yerine Sprite sınıfına ait Group nesnesini oluşturmak ve snake nesnesini bu gruba eklemek çok daha mantıklı ve faydalı bir kullanım. Bu sayede her sprite sınıfı için gereksiz yere draw metotu yazmamıza gerek kalmıyor. Group container kullanımı da aynı şekilde bir sonraki yazıda uygulanacak ancak burada tek başına ekrana nasıl sprite çizdirilir onu göstermek istedim.

Kodun tam hali: 
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

white = (255, 255, 255)

class Snake(pygame.sprite.Sprite):
    # constructor
    def __init__(self, x, y, w, h, color):
        # ana sınıfı çağır
        pygame.sprite.Sprite.__init__(self)
        
        self.image = pygame.Surface([w, h])
        self.image.fill(color)

        # image boyutlarına göre dikdörtgen nesnesi döndürülür
        self.rect = self.image.get_rect()
        # nesnenin pozisyonunu ayarla
        self.rect.x = x
        self.rect.y = y
    
    def draw(self, display):
        display.blit(self.image, self.rect)
    


snake = Snake(150, 60, 32, 32, (255, 0, 0))

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    # çizim
    
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    
    snake.draw(display)

    pygame.display.flip()

sys.exit()
Devamını Oku »

Pygame Çizgi Yapımı (Grid)

Uygulama üzerinde basit bir şekilde ızgara(grid) çizimi yapacağız. Bunun kullanılacak method ise pygame.draw.line() metodudur. Parametre olarak çizim yapılacak display(pygame.Surface) nesnesini, ikinci parametre olarak renk rgb kodunu, üçüncü parametre ise çizginin başlangıç noktasını ve dördüncü olarak çizginin bitiş noktasını almaktadır.

Çizime başlamadan önce renk kodunu belirtmekte yarar. Kod içerisinde renkleri rgb formatından kullanabiliyoruz. Yani (Red, Blue, Green) şeklinde. Örneğin beyaz rengi için değişken oluşturup daha sonra kullanmak istersek, aşağıdaki kod satırını yazmak yeterlidir.
white = (255, 255, 255)
Şimdi çizimi gerçekleştirmeye çalışalım. Döngü içerisinde event döngüsünden sonra çizim fonksiyonunu kullandık.
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    pygame.draw.line(display, white, (32, 0), (32,480))
(x:32, y:0) noktasından (x:32, y:480) noktasına kadar bir çizgi çekilmesi gerekiyor. 480px ekranın yüksekliğiydi. Kodu çalıştırdığımızda karşımıza sadece siyah bir ekran çıkacak, beyaz çizgi olmayacak. Bunun nedeni pygame.display.flip() fonksiyonunu kullanmamızdan kaynaklanıyor. pygame.display.flip() fonksiyonu, display yani pygame.Surface nesnesini günceller ve ekrana yansıtır. Koda ekleyelim:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    pygame.draw.line(display, white, (32, 0), (32,480))
    pygame.display.flip()
Kod çalıştırıldığında elde edilen sonuç:
Pygame Çizgi Çizimi
Başarılı şekilde çizildi. Şimdi hem yatay hem de dikey olacak şekilde 32px aralıkla çizgiler çizmeye çalışalım. Bu işlemi yapabilmek için döngü kullanmamız gerek, önce sadece x eksenine göre dikey çizgileri çizelim:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x, 720))
        
    pygame.display.flip()
Elde edilen sonuç:
Pygame Çizim Yapma
Şimdi sıra yatay çizgileri çizmeye geldi. Onun içinde ikinci bir döngü yazılır ancak bu kez y eksenine göre:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    pygame.display.flip()
Ekran çıktısı:
Pygame Çizim Yapma
Artık ızgara çizimi yapmış olduk. Bir sonraki derste yılan oyunu için gerekli yılanı eklemeye çalışacağız. Kodun tam hali:
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

white = (255, 255, 255)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    pygame.display.flip()
Devamını Oku »

Pygame ile Yılan Oyunu Tasarımı

Bu yazıdan itibaren yılan oyunu yapımına başlıyoruz. Bu sayede hem pygame'i uygulamalı bir şekilde öğrenmiş olacağız hem de bir oyun yapmış olacağız. Yılan oyunu genel olarak bakıldığında oldukça basit bir yapıya sahip ancak içerisinde çok önemli temel oyun konseptlerini barındırmaktadır.

Öncelikle bir projeyi gerçekleştirmeden önce onu genel hatlarıyla oluşturmak önemlidir. Bunun içinse kağıt ve kalem yeterli. Yılan oyunu bildiğiniz gibi yön tuşları ile yönlendirilen bir tane yılan içeriyor. Yön değişikliğine bağlı olarakta yılan o yöne kıvrılıyor ve ona göre şekil alıyor. Bunu direkt olarak koda dökebilmek ilk başta kafa karıştırıcı olabilir. Bu yüzden kağıt üzerinde bu durumu canlandırdık. Ayrıca yılan bir besin yediğinde yılanın kuyruğuna ekleme yapılacak.
Yukarıdaki çizimi incelersek eğer x ve y dizilerinin yer aldığı görülecektir. Bu dizilerde yılanın görüntüsünü oluşturan her bir kare parçasının konumu saklanmaktadır. Ayrıca bir şeklin konumunu sol üst köşe temsil eder. En azından pygame'de durum böyle. Ayrıca pygame'de koordinat sistemi tam olarak yukarıdaki kareli çizimlerde olduğu gibi düşünülebilir.

Oyuncu, yılanın yönünü sağa doğru değiştirdiğinde o görüntüye ait x noktasının değeri 1 arttırıldı. Eğer sola doğru olsaydı o parçaya ait x noktasının değeri 1 azaltılmış olacaktı. Aynı durum aşağı ve yukarı için geçerli, tabi y noktasına göre. Ondan sonraki tüm parçaların sahip olduğu konum koordinatlara ise bir önceki parçanın sahip olduğu koordinatlar atanır. Resmi detaylıca incelerseniz bu durum rahatlıkla görebilirsiniz.

Şimdilik bu oyunun genel çalışma mantığını çözdük sayılır. Sıra bu durumu koda dökmekte ama daha öncesinde pygame'de uygun bir ortam oluşturulmalı. Bunu da sonraki yazıda gerçekleştireceğiz.
Devamını Oku »

pygame.Surface Hakkında

Pygame Program Yapısı yazısında pygame.display.set_mode() fonksiyonunun pygame.Surface nesnesi döndürdüğünden bahsetmiştik. pygame.Surface nesnesini dikdörtgen bir 2D Image olarak düşünebiliriz. Ayrıca pygame.Surface'e bağlı olan çeşitli default metotlarımız mevcuttur. Bunla alakalı ayrıntılı bilgiye şu sayfadan ulaşabilirsiniz.

pygame.Surface üstüne çizilen her şey ekrana yansıtılır. Zaten bu sebeple kendi oluşturduğumuz display adlı bir değişkene atadık. Bu değişken adı programcının isteğine bağlı değişebilir.

Aynı şekilde pygame'de bir image modülü mevcuttur. Bu modül sayesinde local dizin üzerinde resim kaydedebilir ve yükleyebilirsiniz. Image'ler yani görüntü dosyaları pygame.Surface nesnelerine yüklenmektedir. Bu sayede sonrasında görüntü üzerinden değişiklikler de yapabiliriz.

pygame.Surface nesnelerini dikdörtgen olarak düşünmemiz gerek. Sırf bu sebepten bu nesnelere özel olarak Rect sınıf mevcuttur. Bu sınıf sayesinde oyun içi bir çok dinamik sağlanmış olacak. Örneğin, collision gibi.
Devamını Oku »

Pygame Program Yapısı

Pygame'e giriş yazısında genel olarak pygame nedir, nasıl kurulur gibi sorulara cevaplar verildi ve örnek bir program çalıştırıldı. Bu yazıda ise önceki yazıda yazdığımız kod yapısını inceleyeceğiz.

İlk olarak kullanılacak modüller import edilir. Bu modüller pygame ve sys. Bu sayede pygame içinde yer alan fonksiyonlara ve özel değişkenlere ulaşabileceğiz.
import pygame, sys
pygame.init() fonksiyonunu çağırmak zorunludur. Aksi takdirde pygame'e bağlı fonksiyonlar çalışmaz.
pygame.init()
Daha sonrasında display adında bir değişken tanımlandı. pygame.display.set_mode() fonksiyonu pygame.Surface nesnesi döndürür. Parametre olarak bir tuple verildi. Bu tuple içinde yer alan iki integer değer sırasıyla width(genişlik) ve height(yükselik) değerleridir. Kısacası pencerenin boyutu ayarlandı. Genişilik 720 pixel ve yükseklik 480 pixel.
display = pygame.display.set_mode((720, 480))
Pencere başlığı bu şekild pygame.display.set_caption() ile eklenir.
pygame.display.set_caption('Merhaba Dünya')
Sıra geldi bir oyun için olmazsa olmaz olan oyun döngüsü. Oyun döngüsü kullanıcı çıkış yapmadığı sürece ya da döngünün çalışmasını sağlayan boolean değişken false olmadığı sürece çalışmaya devam eden kod bloğudur. Oyun tamamen bu döngü içerisinde çalışacak. Animasyonlar, kullanıcının aktardığı event'ler gibi birçok şey bu döngü içinde yer alacak. Kullanıcının event'ini yakalamak için ise pygame.event.get() fonksiyonu kullanılır. Herhangi bir event durumunda eğer koşul ifadelerinde bu event'in bir karşılığı varsa o blokta yer alan fonksiyon çalıştırılır. Örneğin aşağıdaki kodda pencerenin x kırmızı tuşuna başarsak, pygame.QUIT constant yakalanacak ve sırasıyla pygame.quit() ve sys.exit() fonksiyonları çalışacak ve oyun kapanacağı için döngü sonlanacak.
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
Elbette programda kullanılacak çok fazla gerekli fonksiyon olacak ancak bunları ileriki yazılarda daha ayrıntılı göreceğiz, ayrıca burada anlatılan yapıları daha ayrıntılı bir şekilde nasıl çalıştığına dair incelemeler yapacağız.
Devamını Oku »

Pygame'e Giriş

Pygame, Python'un 2d oyun geliştirme framework'üdür. Pygame hakkında daha önceden bu blogda birkaç yazı yayınlamıştı ancak yeniden başlama ihtiyacı duydum. Pygame ile oyunlar geliştirebilirsiniz. Bu oyunlar sizin ne kadar çok öğrendiğinize ve pratik yaptığınıza bağlı olarak o kadar iyi bir ürün çıkarmanız demektir. Açıkçası benim Pygame ile ilgili çok bir tecrübem yok ancak bu yazılarla beraber "öğretirken öğren" prensibine sadık kalacağım.😶 Öncelikle Pygame ile uygulama geliştirirken Python kullanılacağı için belli bir seviye Python bilmek gerekiyor.

Python'un Bilgisayarda kurulu olması gerekmektedir. Python Website adresine gidip bilgisayarınıza uygun olan sürümü indirebilirsiniz. Kurulumunu yaptıktan sonra ise Pygame kurulumunu yapmalıyız. Pygame'i kurmak için bilgisayarın terminali açılır, ben cmd kullanıyorum Windows için:
python3 -m pip install -U pygame --user
Komut girildikten sonra yükleme olacaktır. Eğer yüklemede sorun yaşarsanız ayrıntılı bilgiyi buradan alabilirsiniz Pygame Getting Started

Pygame framework'ü kendi içinde ses, çizim grafikleri, mouse event gibi çeşitli modüller barındırmaktadır. 

Şimdi test amaçlı bir basit uygulama yazalım ve daha sonrasında çalıştırmayı deneyelim. Öncelikle Python IDLE çalıştırılır. Sonrasında üst barda yer alan File -> New File ile yeni bir dosya açılır, aşağıdaki gibi kodlar yazılır:
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
Kodu yazdıktan sonra çalıştırmaya hazırız, F5'e basılır ve açılan pencereye Evet denir. Sonrasında dosyanın kaydedilmesini isteyecektir, istediğiniz konuma dosyayı **.py uzantılı olacak şekilde kaydedin. Kaydetme işleminden sonra program çalışacaktır aşağıdaki gibi:
Pygame'e Giriş
Penceremiz başarılı bir şekilde açıldı. Bir sonraki yazıda ise temel anlamda Pygame programının kod yapısını inceleyeceğiz ve her bir kod satırının görevlerinden bahsedeceğiz.
Devamını Oku »

C++ Matrisleri Toplama ve Çıkarma

Matrislerde toplama ve çıkarma işlemi C++ ile aşağıdaki gibi koda dönüştürülmüştür. Her iki matrisin tüm elemanları kullanıcı tarafından girilmekte olup daha sonrasında bu elemanlar karşılıklı olarak toplanıp, sonuç matrisine yazdırılmaktadır ve ekran çıktısı elde edilmektedir.
#include <iostream>

int main(){

    toplama_cikarma("topla");
    
    return 0;
}

void toplama_cikarma(std::string islem){
    int m, n;
    std::cout << "m: ";
    std::cin >> m;
    std::cout << "n: ";
    std::cin >> n;
    float a_matris[m][n];
    float b_matris[m][n];
    float sonuc_matris[m][n];

    
    for(int i=0; i < m; i++){
        for(int j=0; j < n; j++){
            std::cout << "A matrisi[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> a_matris[i][j];
        }
    }

    std::cout << std::endl;
    
    for(int i=0; i < m; i++){
        for(int j=0; j < n; j++){
            std::cout << "B matris[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> b_matris[i][j];
        }
    }
    if(islem == "topla"){
        for(int i=0; i < m; i++){
            for(int j=0; j < n; j++){
                sonuc_matris[i][j] = a_matris[i][j] + b_matris[i][j];
                std::cout << sonuc_matris[i][j] << " ";
            }
            std::cout << std::endl;
        }
    }else if(islem == "cikar"){
        for(int i=0; i < m; i++){
            for(int j=0; j < n; j++){
                sonuc_matris[i][j] = a_matris[i][j] - b_matris[i][j];
                std::cout << sonuc_matris[i][j] << " ";
            }
            std::cout << std::endl;
        }        
    }
}

Devamını Oku »

C++ Matris Çarpımı

İki matrisin çarpımını yapan program kodu aşağıda verilmiştir. Program şu şekilde çalışmaktadır: eğer kullanıcı ilk girdiği matrisin sütun sayısı ile ikinci girdiği matrisin satır sayısını eşit girmemişse program kullanıcıdan tekrar matrisi boyutlarını belirlemesini isteyecektir. Böyle olmasının nedeni iki matrisi çarpabilmek için bu şarta uyması gerekmektedir.

Matrislerin boyutlarındaki uygunluk sağlandıktan sonra  kullanıcı tarafından her iki matrisin de değerleri ayrı ayrı girilir. Bu iki matris çarpılır ve olması gereken sonuç ekrana döndürülür:
#include <iostream>

void carpma();

int main(){
    carpma();
    
    return 0;
}
void carpma(){
    bool uyari = false;
    int m1, n1, m2, n2;
    do{ 
        if(uyari) std::cout << "A'nin sutun sayisi B'nin satir sayisina esit olmali" << std::endl;
        std::cout << "A matrisi(mxn): ";
        std::cout << "m : ";
        std::cin >> m1;
        std::cout << "n : ";
        std::cin >> n1;
        std::cout << "B matrisi(mxn): ";
        std::cout << "m : ";
        std::cin >> m2;
        std::cout << "n : ";
        std::cin >> n2;
        uyari = true;
    }while (n1 != m2);
    

    float a_matris[m1][n1];
    float b_matris[m2][n2];
    float sonuc_matris[m1][n2];

    
    for(int i=0; i < m1; i++){
        for(int j=0; j < n1; j++){
            std::cout << "A matrisi[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> a_matris[i][j];
        }
    }

    std::cout << std::endl;
    
    for(int i=0; i < m2; i++){
        for(int j=0; j < n2; j++){
            std::cout << "B matris[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> b_matris[i][j];
        }
    }

    // çarpım işlemi	
    for (int i = 0; i < m1; i++){
        for (int j = 0; j < n1; j++){
            sonuc_matris[i][j] = 0;
            for (int s = 0; s < n1; s++){
                sonuc_matris[i][j] += a_matris[i][s] * b_matris[s][j];
            }
        }
    }

    for (int i = 0; i < m1; i++){
        for (int j = 0; j < n2; j++){
            std::cout << sonuc_matris[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
}
Devamını Oku »