Çözüldü Pygame kodunda line hatası

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Fueren

Centipat
Katılım
23 Aralık 2023
Mesajlar
1.302
Çözümler
18
Daha fazla  
Sistem Özellikleri
İşlemci: Intel© Core™ i7-4510U CPU @ 2.00GHz × 2
Ekran kartı: NVIDIA Geforce 840M
İşletim Sistemi: Arch Linux
Masaüstü Ortamı: Gnome 46.1
Laptop modeli: ASUS X555LN
Cinsiyet
Erkek
Meslek
Öğrenci
Hocam bu kod bizim hocamızın istediği bir oyunun kodu. Atasözü eşleştirme oyunu diyebiliriz aslında. Ben bu oyunda önce "words" adında içinde listeler olan bir liste oluşturdum. İstediğim şey oluşturduğum "rect1, rect2, rect3" şekillerinin içine bu atasözlerinin yazılması. Fakat bir line hatası alıyorum sebebi nedir? Çözüp yollayabilir misiniz?

Python:
import pygame, sys, random

pygame.init()

def display_text(val: str, pos: tuple):
 text_surf = font.render(val, True, 'white')
 text_rect = text_surf.get_rect(center = pos)
 screen.blit(text_surf, text_rect)

screen = pygame.display.set_mode((850, 600))
pygame.display.set_caption('Atasözü Eşleştirme Oyunu')
clock = pygame.time.Clock()
font = pygame.font.SysFont('Calibri', 20, False, False)
canDraw = True

rect1 = pygame.rect.Rect((100, 100), (225, 100))
rect2 = pygame.rect.Rect((100, 250), (225, 100))
rect3 = pygame.rect.Rect((100, 400), (225, 100))

rect_meaning1 = pygame.rect.Rect((525, 100), (225, 100))
rect_meaning2 = pygame.rect.Rect((525, 250), (225, 100))
rect_meaning3 = pygame.rect.Rect((525, 400), (225, 100))

words = [['Mart kapıdan baktırır,', 'kazma kürek yaktırır'], ['Otu çek, köküne bak'], ['Etle tırnak arasına girilmez']]
words_alt = words

num = random.randint(0, len(words) - 1)

screen.fill('#63a0b0')

pygame.draw.rect(screen, '#93b858', rect1)
pygame.draw.rect(screen, '#93b858', rect2)
pygame.draw.rect(screen, '#93b858', rect3)

pygame.draw.rect(screen, '#bfc965', rect_meaning1)
pygame.draw.rect(screen, '#bfc965', rect_meaning2)
pygame.draw.rect(screen, '#bfc965', rect_meaning3)

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

 while canDraw:
 if len(words[num]) > 1:
 display_text(words[num][0], (rect1.centerx, rect1.centery - 15))
 display_text(words[num][1], (rect1.centerx, rect1.centery + 15))
 words.remove(words[num])

 elif len(words[num]) == 1:
 display_text(words[num][0], rect1.center)
 words.remove(words[num])

 num_alt = num

 while num != num_alt:
 num = random.randint(0, len(words) - 1)

 if len(words[num]) > 1:
 display_text(words[num][0], (rect2.centerx, rect1.centery - 15))
 display_text(words[num][1], (rect2.centerx, rect1.centery + 15))
 words.remove(words[num])

 elif len(words[num]) == 1:
 display_text(words[num][0], rect2.center)
 words.remove(words[num])

 num_alt = num

 while num != num_alt:
 num = random.randint(0, len(words) - 1)

 if len(words[num]) > 1:
 display_text(words[num][0], (rect3.centerx, rect1.centery - 15))
 display_text(words[num][1], (rect3.centerx, rect1.centery + 15))
 words.remove(words[num])

 elif len(words[num]) == 1:
 display_text(words[num][0], rect3.center)
 words.remove(words[num])

 canDraw = False

 pygame.display.update()
 clock.tick(60)
 
Çözüm
Hala hatayı paylaşmıyorsunuz.

Çözdüm çünkü hocam. Metinlerin yazılmasını bir fonksiyona atadım ve parametrelere "rect" ve "Word" ekledim. Sırasıyla fonksiyonu kullanınca line hatasının words listesinden çıkardığım elementlerden kaynaklı olduğunu düşündüm. Doğru mudur bilemem.
Hatayı tahmin mi edeceğiz? İlla pygame kurup çalıştırıp hatayı kendimiz mi görelim?

Hatayı paylaşsanız genel Python hatası ise anlaşılır. Kütüphane ile ilgili bir hata ise dokümantasyon bakılır.

Paylaştığınız kod birebir aynısı ise tek kademe girinti var. Daha fazla olmalı.
1 karakter girinti bırakanı ilk defa görüyorum.
 
Kodda herhangi bir sorun yok gerekli paketler yüklendiğinde ve doğru indentation ile çalışıyor.

Python:
import pygame, sys, random

pygame.init()

def display_text(val: str, pos: tuple):
    text_surf = font.render(val, True, 'white')
    text_rect = text_surf.get_rect(center=pos)
    screen.blit(text_surf, text_rect)

screen = pygame.display.set_mode((850, 600))
pygame.display.set_caption('Atasözü Eşleştirme Oyunu')
clock = pygame.time.Clock()
font = pygame.font.SysFont('Calibri', 20, False, False)
canDraw = True

rect1 = pygame.rect.Rect((100, 100), (225, 100))
rect2 = pygame.rect.Rect((100, 250), (225, 100))
rect3 = pygame.rect.Rect((100, 400), (225, 100))

rect_meaning1 = pygame.rect.Rect((525, 100), (225, 100))
rect_meaning2 = pygame.rect.Rect((525, 250), (225, 100))
rect_meaning3 = pygame.rect.Rect((525, 400), (225, 100))

words = [['Mart kapıdan baktırır,', 'kazma kürek yaktırır'], ['Otu çek, köküne bak'], ['Etle tırnak arasına girilmez']]
words_alt = words

num = random.randint(0, len(words) - 1)

screen.fill('#63a0b0')

pygame.draw.rect(screen, '#93b858', rect1)
pygame.draw.rect(screen, '#93b858', rect2)
pygame.draw.rect(screen, '#93b858', rect3)

pygame.draw.rect(screen, '#bfc965', rect_meaning1)
pygame.draw.rect(screen, '#bfc965', rect_meaning2)
pygame.draw.rect(screen, '#bfc965', rect_meaning3)

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

    while canDraw:
        if len(words[num]) > 1:
            display_text(words[num][0], (rect1.centerx, rect1.centery - 15))
            display_text(words[num][1], (rect1.centerx, rect1.centery + 15))
            words.remove(words[num])
        elif len(words[num]) == 1:
            display_text(words[num][0], rect1.center)
            words.remove(words[num])

        num_alt = num

        while num == num_alt:
            num = random.randint(0, len(words) - 1)

        if len(words[num]) > 1:
            display_text(words[num][0], (rect2.centerx, rect2.centery - 15))
            display_text(words[num][1], (rect2.centerx, rect2.centery + 15))
            words.remove(words[num])
        elif len(words[num]) == 1:
            display_text(words[num][0], rect2.center)
            words.remove(words[num])

        num_alt = num

        while num == num_alt:
            num = random.randint(0, len(words) - 1)

        if len(words[num]) > 1:
            display_text(words[num][0], (rect3.centerx, rect3.centery - 15))
            display_text(words[num][1], (rect3.centerx, rect3.centery + 15))
            words.remove(words[num])
        elif len(words[num]) == 1:
            display_text(words[num][0], rect3.center)
            words.remove(words[num])

        canDraw = False

    pygame.display.update()
    clock.tick(60)
 
Artık okunabilir olduğu için biraz baktım. Daha kullanmamışsınız ama o şekilde liste kopyalanmıyor.
Hocam paylaştığım kod ile çalıştırdım da tam olarak ekranda ne yapacağımı anlamaya çalışıyorum. Görüntü aşağıdaki gibi.
 

Dosya Ekleri

  • lorem.png
    lorem.png
    907 KB · Görüntüleme: 20
Hatayı tahmin mi edeceğiz? İlla pygame kurup çalıştırıp hatayı kendimiz mi görelim?

Hatayı paylaşsanız genel Python hatası ise anlaşılır. Kütüphane ile ilgili bir hata ise dokümantasyon bakılır.

Paylaştığınız kod birebir aynısı ise tek kademe girinti var. Daha fazla olmalı.
1 karakter girinti bırakanı ilk defa görüyorum.
Neredeki girintiden bahsediyorsunuz?
 
Hocam kısaca kod sizin paylaştığınız gibi değil benim paylaştığım gibi görünmeli. Boşluk karakteri değil Tab kullanılmalı.

Ben zaten boşluk ile değil Tab ile kodluyorum. Bir de attığınız kodu denedim fakat nedenini anlamadığım bir şekilde yanıt vermiyor.
 
İşlev eklememiş ki. Rastgele sırayla gösterilmesi var sadece. Ya da ben görmüyorum.
Biraz fonksiyon kullanılsa fena olmazdı. Çok fazla tekrar var.

Kodlamaya yeni yeni başladım hocam. OOP mi biraz daha geliştireyim daha fazla kafa yoracağım fonksiyonuydu classlarıydı.

Fonksiyon eklenecek sadece bu line hatasının neden kaynaklandığını bulamadım.
 

Yeni konular

Geri
Yukarı