• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z własną grą w PyGame

0 głosów
823 wizyt
pytanie zadane 6 sierpnia 2019 w Python przez akinhet Nowicjusz (170 p.)
Witam,

jakiś czas temu zacząłem uczyć się Pythona (od września idę do technikum informatycznego). Zaczęło się od książeczki z Komputer Świata o nauce właśnie Pythona. Znajdowała się tam instrukcja mówiąca o tym jak zrobić grę o helikopterze latającym w jaskini. Wykonałem ją, ale trochę nie spodobały mi się założenia gry(przeszkody pojawiały się randomowo, ale tylko wokół jednej linii, a punkty były przyznawane za poruszanie się w górę i w dół), więc zacząłem przy niej grzebać. Teoretycznie większość rzeczy udało mi się osiągnąć(kontrola prędkości postaci, ograniczony, a nie ciągły ruch po wciśnięciu przycisku, ciekawsze pojawianie się przeszkód), jednak pojawił się dosyć niespodziewany problem: po przegraniu i próbie zagrania ponownie, w miejscu w którym wszystkie przeszkody powinny być w jednej linii, pojawiają się słupy o losowej wysokości, zabijające gracza praktycznie od razu. Nie mam pojęcia skąd mogą się one brać, bo na starcie gry wszystko jest ok. Bardzo proszę o sprawdzenie, gdzie może być ewentualny błąd. Byłbym również wdzięczny za wszelkie inne uwagi dotyczące zarówno kodu jak i samej gry.

Kod: https://github.com/akinhet/Helicopterrr

1 odpowiedź

0 głosów
odpowiedź 6 sierpnia 2019 przez adrian17 Mentor (355,180 p.)

Nie wiem czy to akurat to, ale te dwa miejsca się rzucają w oko:

                                        for o in obstacles:
                                                obstacles.remove(o)
                for o in obstacles:
                        if o.x <= -o.width:
                                obstacles.remove(o)
                                obstacles.append(Obstacle(wid,wid/20))
                                points = points + 1

To raczej nie robi tego co myślisz. Przykład:

In [1]: a = [1, 2, 3, 4, 5, 6]                                                                                                                                                                                      

In [2]: for x in a: 
   ...:     a.remove(x) 
   ...:                                                                                                                                                                                                             

In [3]: a                                                                                                                                                                                                           
Out[3]: [2, 4, 6]

W szczególności to pierwsze powinno dać się zastąpić przez zwykłe `obstacles.clear()`.

komentarz 6 sierpnia 2019 przez akinhet Nowicjusz (170 p.)
Ok, dzięki wielkie, teraz faktycznie działa :D. A tak w ogóle to mógłbyś mi wytłumaczyć dlaczego się tak dzieje, jak w tym przykładzie?
komentarz 6 sierpnia 2019 przez adrian17 Mentor (355,180 p.)

Jasne.

No to po kolei:

a = [1, 2, 3, 4, 5, 6]
x = a[0] # pierwsza iteracja
a.remove(x) # teraz a == [2, 3, 4, 5, 6]
x = a[1] # druga iteracja, x == 3
a.remove(x) # teraz a == [2, 4, 5, 6]
x = a[2] # trzecia iteracja, x == 5
a.remove(x) # teraz a == [2, 4, 6]
# a[3] nie ma, koniec pętli

 

komentarz 6 sierpnia 2019 przez akinhet Nowicjusz (170 p.)

AAA, ok faktycznie. Nie wpadłbym na to. Dzięki wielkie smiley.

Podobne pytania

0 głosów
0 odpowiedzi 480 wizyt
pytanie zadane 27 października 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
0 odpowiedzi 538 wizyt
pytanie zadane 29 stycznia 2023 w Python przez Kubas23 Użytkownik (630 p.)
0 głosów
0 odpowiedzi 521 wizyt
pytanie zadane 19 lipca 2019 w Python przez Patryk01 Obywatel (1,270 p.)

93,733 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...