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)