Bu örneğin amacı, ekranı rastgele bir enkaz (oval) yığınıyla dolduran ve daha sonra kullanıcının kalıntı parçalarını tıklayıp kaldırmasına olanak tanıyan bir program yazmaktır. Bu program, sınıfta öğrendiğimiz birçok tekniği uygulamanıza izin verir. Fonksiyonlar, for döngüleri, grafikler, rasgele sayılar, fare ve belki daha fazlasını kullanacaksınız!

İlk adım, enkazı oluşturmak. Enkaz parçalarının ne kadar büyük olabileceğine ve ekranda kaç parça bulunabileceğine dair limitleri sabitlerle oluşturun. Her parça için, rastgele (random) bir boyuta, konuma ve renge sahip (oluşturduğunuz lmitler içerisinde) yeni bir oval oluşturun. Bunun her boyutta ekran için çalışması gerektiğini unutmayın. Kodunuzu daha kolay okunabilir yapmak için bunu birkaç fonksiyona bölmek isteyebilirsiniz!


Sonrasında, kullanıcıların enkazı ekrandan kaldırmalarını sağlamalıyız. Sonsuz bir döngü ekle ve kullanıcı bir objenin üstüne tıklayıp tıklamadığını kontrol edin. Eğer tıkladılarsa, o enkazı temizleyin (ekrandan kaldırın)!

Tıklanan objeyi almak

canvas.find_element_at(x, y) tuval işlevi, sağlanan (x, y) bağımsız değişkenindeki nesneyi alacaktır. Hiçbir nesne yoksa, "Yok" döndürür. Bir nesne üzerinde bazı eylemler gerçekleştirmek için (eğer varsa), aşağıdaki gibi bir şey yazabilirsiniz:

object = canvas.find_element_at(x, y)    # x and y are some coordinates
if object:    # If there was an object there...
    print("Obje (" + str(x) + ", " + str(y) + ") konumunda bulundu")
else:
    print("Obje bulunamadı")

Bonus!

Eğer isterseniz bonus olarak, tüm ekranın enkazdan temizlenmiş olduğu kontrol edecek bir yol ekleyebilirsiniz. Eğer öyleyse, kullanıcıya tebrikler de ve ekranı temizledikleri için teşekkür edin!

Çözüm

"""
File: debris_sweeper.py
-------------------
Puts a random collection of debris (ovals) on the screen
and then allows the user to click and remove the debris.
"""

from graphics import Canvas
import random

# minimum and maximum size of a piece of debris
MIN_DEBRIS_SIZE = 50
MAX_DEBRIS_SIZE = 150

# number of pieces of debris
NUM_DEBRIS_PIECES = 2


def main():
    canvas = Canvas()
    canvas.set_canvas_title("Debris Sweeper")

    create_debris(canvas)
    while True:
        clicks = canvas.get_new_mouse_clicks()
        for click in clicks:
            remove_debris(canvas, click.x, click.y)
        canvas.update()

    canvas.mainloop()


def create_debris(canvas):
    """
    Creates NUM_DEBRIS_PIECES pieces of "debris" (ovals) with random locations,
    sizes and colors.
    """
    for i in range(NUM_DEBRIS_PIECES):
        # Calculate a random location and size
        width = random.randint(MIN_DEBRIS_SIZE, MAX_DEBRIS_SIZE)
        height = random.randint(MIN_DEBRIS_SIZE, MAX_DEBRIS_SIZE)
        x = random.randint(0, canvas.get_canvas_width() - width)
        y = random.randint(0, canvas.get_canvas_height() - height)

        # Create with a random color
        piece = canvas.create_oval(x, y, x + width, y + height)
        canvas.set_color(piece, canvas.get_random_color())


def remove_debris(canvas, x, y):
    """
    Removes the debris (if any) at the given location.  If multiple pieces
    of debris are at this location, removes the one on the top.
    """
    item = canvas.find_element_at(x, y)
    if item:
        canvas.delete(item)


if __name__ == "__main__":
    main()