Python gyerekeknek - űrhajós játék - lőjünk!

Kategória: Python gyerekeknek.

Áttekintés

Egyelőre csak menekülni tudunk. Most valósítsuk meg a visszalövést! Ezt is három lépésben valósítjuk meg:

  • Először megvalósítjuk a lövést.
  • Utána azt is, hogy eltalálja a szellemet.
  • Végül számoljuk a pontokat.

Lövés

A lövés lépései a következőek:

  • Szóköz lenyomásakor létrehozunk egy kört ott, ahol az űrhajó épp tartózkodik.
  • Lementjük a kör azonosítóját egy listába.
  • A fő ciklusban mozgatjuk felfelé.
  • Ha elértük a képernyő felső részét, akkor töröljük.

Hozzunk létre tehát az elején, a ghosts = [] alatt egy golyó tömböt:

bullets = []

A key_pressed() függvényen belül vizsgáljuk meg a szóköz lenyomását; ez esetben hozzunk létre egy sárga kört, helyezzük az űrhajó helyére, és mentsük is el:

    if event.char == ' ':
        rocketship_coords = canvas.coords(rocketship)
        position_x = rocketship_coords[0] - 10
        position_y = rocketship_coords[1] - 50
        bullet = canvas.create_oval(
            position_x,
            position_y,
            position_x + 20,
            position_y + 20,
            width=3,
            outline='black',
            fill='yellow'
        )
        bullets.append(bullet)

A fő ciklusban play() mozgassuk a golyót. Ha elértük a szélét, akkor a szellemeknél látott mechanizmussal tüntessük el és töröljüka listából:

    deleted_bullets = []
    for bullet in bullets:
        if canvas.coords(bullet)[1] > 0:
            canvas.move(bullet, 0, -1)
        else:
            canvas.delete(bullet)
            deleted_bullets.append(bullet)
    for deleted_bullet in deleted_bullets:
        bullets.remove(deleted_bullet)

Találat

Mindegyik lépésben le kell ellenőrizni minden golyó-szellem kombinációt, hogy van-e érintkezés. Az érintkezés vizsgálatot itt is a koordináták távolságával oldjuk meg. Ha történt érintkezés, akkor a golyót és a szellemet is törölni kell. Hasonló mechanizmust kell alkalmaznunk ahhoz, amikor a szellem eléri a játéktér szélét (play()):

    ghosts_to_delete = []
    bullets_to_delete = []
    for ghost_struct in ghosts:
        ghost = ghost_struct['ghost']
        ghost_coords = canvas.coords(ghost)
        for bullet in bullets:
            bullet_coords = canvas.coords(bullet)
            coord_diff_x = abs(bullet_coords[0] - ghost_coords[0])
            coord_diff_y = abs(bullet_coords[1] - ghost_coords[1])
            if coord_diff_x < 20 and coord_diff_y < 20:
                ghosts_to_delete.append(ghost_struct)
                bullets_to_delete.append(bullet)
    for ghost_to_delete in ghosts_to_delete:
        canvas.delete(ghost_to_delete['ghost'])
        ghosts.remove(ghost_to_delete)
    for bullet_to_delete in bullets_to_delete:
        canvas.delete(bullet_to_delete)
        bullets.remove(bullet_to_delete)

Pontszámítás

Számoljuk meg, hogy hány szellemet nyírtunk ki! Ehhez hozzunk létre egy globális változót, és állítduk be nullára:

score = 0

Az életeket kiíró információ alá írjuk ki a pontszámot:

score_str_label = Label(master=info_frame, text='Pontszám:')
score_str_label.grid(column=0, row=1)
score_nr_label = Label(master=info_frame, text=str(score))
score_nr_label.grid(column=1, row=1)

A play() függvénybe jelezzük, hogy módosítani szeretnénk ezt a változót:

    global score

Végül találatkor módosítsuk is ténylegesen:

                score = score + 1
                score_nr_label['text'] = str(score)
urhajo_golyo.png
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License