Jak zaprogramować grę w Pythonie za pomocą Pygame (ze zdjęciami)

Spisu treści:

Jak zaprogramować grę w Pythonie za pomocą Pygame (ze zdjęciami)
Jak zaprogramować grę w Pythonie za pomocą Pygame (ze zdjęciami)

Wideo: Jak zaprogramować grę w Pythonie za pomocą Pygame (ze zdjęciami)

Wideo: Jak zaprogramować grę w Pythonie za pomocą Pygame (ze zdjęciami)
Wideo: 3 sposoby odczytu danych z pliku na maturze z informatyki (Python i C++) 2024, Kwiecień
Anonim

To jest wprowadzenie do Pygame dla osób, które już znają Pythona. Ten artykuł nauczy Cię, jak zbudować prostą grę, w której gracz będzie unikał odbijających się piłek.

Kroki

Część 1 z 8: Instalacja Pygame

Krok 1. Pobierz Pygame

Znajdź go dla swojej platformy na stronie

Krok 2. Uruchom instalator

Krok 3. Sprawdź, czy instalacja zadziałała

Otwórz terminal Pythona. Wpisz „importuj pygame”. Jeśli nie widzisz żadnych błędów, Pygame został pomyślnie zainstalowany.

    importuj pygame

Część 2 z 8: Konfigurowanie podstawowego okna

Krok 1. Otwórz nowy plik

Krok 2. Importuj Pygame

Pygame to biblioteka zapewniająca dostęp do funkcji graficznych. Więcej informacji na temat działania tych funkcji można znaleźć na stronie Pygame.

    import pygame z pygame.locals import *

Krok 3. Ustaw rozdzielczość okna

Będziesz tworzyć zmienną globalną dla rozdzielczości ekranu, aby można było się do niej odwoływać w kilku częściach gry. Można go również łatwo znaleźć na górze pliku, dzięki czemu można go później zmienić. W przypadku zaawansowanych projektów lepszym pomysłem byłoby umieszczenie tych informacji w osobnym pliku.

    rozdzielczość = (400, 300)

Krok 4. Zdefiniuj niektóre kolory

Kolory w pygame to (RBGA, które wahają się w wartościach od 0 do 255. Wartość alfa (A) jest opcjonalna, ale inne kolory (czerwony, niebieski i zielony są obowiązkowe).

    biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0)

Krok 5. Zainicjuj ekran

Użyj zmiennej rozdzielczości, która została zdefiniowana wcześniej.

    ekran = pygame.display.set_mode(rozdzielczość)

Krok 6. Zrób pętlę gry

Powtarzaj określone czynności w każdej klatce naszej gry. Utwórz pętlę, która zawsze będzie się powtarzać, aby przejść przez wszystkie te czynności.

    podczas gdy prawda:

Krok 7. Pokoloruj ekran

    screen.fill(biały)

Krok 8. Wyświetl ekran

Jeśli uruchomisz program, ekran zmieni kolor na biały, a następnie program się zawiesi. Dzieje się tak, ponieważ system operacyjny wysyła zdarzenia do gry, a gra nic z nimi nie robi. Gdy gra otrzyma zbyt wiele nieobsługiwanych zdarzeń, zawiesi się.

    while True: … pygame.display.flip()

Krok 9. Obsługuj zdarzenia

Uzyskaj listę wszystkich zdarzeń, które miały miejsce w każdej klatce. Będziesz się troszczył tylko o jedno wydarzenie, o zakończenie. Dzieje się tak, gdy użytkownik zamyka okno gry. Zapobiegnie to również zawieszaniu się naszego programu z powodu zbyt wielu zdarzeń.

    while True: … dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit()

ProgramPygameCzęść1
ProgramPygameCzęść1

Krok 10. Wypróbuj

Oto jak powinien teraz wyglądać kod:

    importuj pygame z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame.display.set_mode(rozdzielczość) while True: screen.fill(white) pygame.display.flip() dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit()

Część 3 z 8: Tworzenie obiektu gry

Krok 1. Utwórz nową klasę i konstruktora

Ustaw wszystkie właściwości obiektu. Podajesz również wartości domyślne dla wszystkich właściwości.

    class Ball: def _init_(self, xPos = rozdzielczość[0] / 2, yPos = rozdzielczość[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka"

Krok 2. Zdefiniuj sposób rysowania obiektu

Użyj właściwości, które zostały zdefiniowane w konstruktorze, aby narysować kulkę jako okrąg, a także przekazać powierzchnię do funkcji, na której narysujesz obiekt. Powierzchnią będzie obiekt ekranowy, który został utworzony wcześniej przy użyciu rozdzielczości.

    def draw(self, surface): pygame.draw.circle(surface, black, (self.x, self.y), self.radius)

Krok 3. Stwórz instancję klasy i powiedz pętli gry, aby rysowała piłkę w każdej pętli

    ball = Ball() while True: … ball.draw(screen)

Krok 4. Przesuń obiekt

Utwórz funkcję, która zaktualizuje położenie obiektu. Wywołaj tę funkcję w każdej pętli gry.

    class Ball: … def update(self): self.x += self.dx self.y += self.dy

Krok 5. Ogranicz liczbę klatek na sekundę

Piłka będzie się poruszać bardzo szybko, ponieważ pętla gry toczy się setki razy na sekundę. Użyj zegara Pygame, aby ograniczyć liczbę klatek na sekundę do 60 fps.

    clock = pygame.time. Clock() while True: … clock.tick(60)

Krok 6. Trzymaj piłkę na ekranie

Dodaj kontrole w funkcji aktualizacji, aby odwrócić kierunek piłki, jeśli uderzy ona w jedną z krawędzi ekranu.

    class Ball: … def update(self): … if (self.x <= 0 lub self.x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1

ProgramPygamePart2
ProgramPygamePart2

Krok 7. Wypróbuj

Oto jak powinien teraz wyglądać kod:

    importuj pygame z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame.display.set_mode(rozdzielczość) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka" def draw(self, surface): pygame.draw.circle(surface, black, (self.x, self.y), self.radius) def update(self): self.x += self.dx self.y += self.dy if (self.x <= 0 lub self.x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1 ball = Ball() clock = pygame.time. Clock() podczas True: screen. fill(biały) ball.draw(screen) ball.update() pygame.display.flip() clock.tick(60) dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit ()

Część 4 z 8: Organizacja gry

Krok 1. Użyj zajęć, aby wszystko zorganizować

Gra stanie się bardziej skomplikowana. Użyj technik zorientowanych obiektowo, aby uporządkować swój kod.

Krok 2. Zmień pętlę gry w klasę

Ponieważ nasza gra zawiera teraz dane, w tym obiekty i funkcje gry, sensowne jest przekształcenie pętli gry w klasę.

    klasa gra():

Krok 3. Dodaj konstruktora

Tutaj stworzysz instancje niektórych obiektów gry, stworzysz nasz ekran i zegar oraz zainicjujesz Pygame. Aby korzystać z niektórych funkcji, takich jak tekst lub dźwięk, należy zainicjować Pygame.

    class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode(rozdzielczość) self.clock = pygame.time. Clock()

Krok 4. Obsługa zdarzeń w funkcji

    class game(): … def handleEvents(self): dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit()

Krok 5. Ustaw pętlę gry w funkcję

Wywołaj funkcję obsługi zdarzeń w każdej pętli.

    class game(): … def run(self): while True: self.handleEvents() self.screen.fill(white) self.clock.tick(60) pygame.display.flip()

Krok 6. Obsługuj wiele obiektów gry

W tej chwili ten kod musi wywoływać draw i aktualizować nasz obiekt w każdej klatce. Byłoby bałagan, gdybyś miał dużo obiektów. Dodajmy nasz obiekt do tablicy, a następnie zaktualizujmy i narysujmy wszystkie obiekty w tablicy w każdej pętli. Teraz możesz łatwo dodać kolejny obiekt i nadać mu inną pozycję początkową.

    class game(): def _init_(self): … self.gameObjects = self.gameObjects.append(Ball()) self.gameObjects.append(Ball(100)) … def run(self): while True: self.handleEvents() dla gameObj w self.gameObjects: gameObj.update() self.screen.fill(white) dla gameObj w self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.trzepnięcie()

ProgramPygamePart3
ProgramPygamePart3

Krok 7. Wypróbuj

Oto jak powinien teraz wyglądać kod:

    importuj pygame z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame.display.set_mode(rozdzielczość) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka" def draw(self, surface): pygame.draw.circle(surface, black, (self.x, self.y), self.radius) def update(self): self.x += self.dx self.y += self.dy if (self.x <= 0 lub self.x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1 class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode(rozdzielczość) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(Ball()) self.gameObjects.append(Ball(100)) def handleEvents(self): dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit() def run(self): while True: self.handleEvent s() dla gameObj w self.gameObjects: gameObj.update() self.screen.fill(white) dla gameObj w self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display. flip() gra().uruchom()

Część 5 z 8: Dodawanie obiektu gracza

Krok 1. Stwórz klasę gracza i konstruktora

Utworzysz kolejny okrąg kontrolowany przez myszkę. Zainicjuj wartości w konstruktorze. Jedyną ważną wartością jest promień.

    class Player: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad

Krok 2. Zdefiniuj sposób rysowania obiektu gracza

Będzie to ten sam sposób, w jaki narysowałeś inne obiekty w grze.

    class Player: … def draw(self, surface): pygame.draw.circle(surface, red, (self.x, self.y), self.radius)

Krok 3. Dodaj kontrolę myszy dla obiektu gracza

W każdej klatce sprawdź położenie myszy i ustaw położenie obiektów graczy do tego punktu.

    class Player: … def update(self): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1]

Krok 4. Dodaj obiekt gracza do gameObjects

Utwórz nową instancję odtwarzacza i dodaj ją do listy.

    class game(): def _init_(self): … self.gameObjects.append(Player())

ProgramPygamePart4
ProgramPygamePart4

Krok 5. Wypróbuj

Oto jak powinien teraz wyglądać kod:

    importuj pygame z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame.display.set_mode(rozdzielczość) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka" def draw(self, surface): pygame.draw.circle(surface, black, (self.x, self.y), self.radius) def update(self): self.x += self.dx self.y += self.dy if (self.x <= 0 lub self.x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1 class Gracz: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" def draw(self, surface): pygame.draw.circle(surface, red, (self.x, self.y), self.radius) def update (self): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] class game(): def _init_(self): pygame.init() self.screen = pygame.zestaw.wyświetlaczy_ mode(rozdzielczość) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(Gracz()) self.gameObjects.append(Piłka()) self.gameObjects.append(Piłka(100))) def handleEvents(self): dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit() def run(self): while True: self.handleEvents() dla gameObj w self.gameObjects: gameObj.update() self.screen.fill(white) dla gameObj w self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip() game(). biegać()

Część 6 z 8: Wywoływanie interakcji obiektów z graczem

Krok 1. Zmień funkcje aktualizacji

Aby obiekty mogły wchodzić w interakcje, muszą mieć do siebie dostęp. Dodajmy kolejny parametr do aktualizacji, który zostanie przekazany na liście gameObjects. Musisz dodać go zarówno do obiektu gracza, jak i obiektów piłki. Jeśli masz dużo obiektów w grze, dziedziczenie może pomóc w utrzymaniu tych samych sygnatur metod.

    class Ball: … def update(self, gameObjects): … class Player: … def update(self, gameObjects):

Krok 2. Sprawdź kolizje między graczem a piłkami

Przejrzyj wszystkie obiekty gry i sprawdź, czy typ obiektu to piłka. Następnie użyj promieni dwóch obiektów i wzoru na odległość, aby sprawdzić, czy się zderzają. Koła są naprawdę łatwe do sprawdzenia kolizji. To największy powód, dla którego nie użyłeś w tej grze innego kształtu.

    class Player: … def update(self, gameObjects): … for gameObj in gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (obiekt gry.promień + własny.promień)**2:

ProgramPygamePart5
ProgramPygamePart5

Krok 3. Zakończ grę, jeśli gracz zostanie trafiony

Na razie zakończmy grę.

    if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: pygame.quit()

Krok 4. Wypróbuj

Oto jak powinien teraz wyglądać kod:

    importuj pygame z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame.display.set_mode(rozdzielczość) class Ball: def _init_(self, xPos = resolution[0] / 2, yPos = resolution[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka" def draw(self, surface): pygame.draw.circle(surface, black, (self.x, self.y), self.radius) def update(self, gameObjects): self.x += self.dx self.y += self.dy if (self.x <= 0 lub self.x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1 class Odtwarzacz: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" def draw(self, surface): pygame.draw.circle(surface, red, (self.x, self.y), self.radius) def update(self, gameObjects): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] for gameObj in gameObjects: if gameObj.type == "piłka": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: pygame.quit() class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode(rozdzielczość) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(Player()) self.gameObjects.append(Ball()) self.gameObjects.append(Ball(100)) def handleEvents(self): dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit () def run(self): while True: self.handleEvents() dla gameObj w self.gameObjects: gameObj.update(self.gameObjects) self.screen.fill(white) dla gameObj w self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip() game().run()

Część 7 z 8: Dodawanie kontrolera gier do tworzenia obiektów

Krok 1. Utwórz klasę kontrolera gier

Kontrolery gier odpowiadają za „uruchomienie” gry. Różni się od naszej klasy gry, która jest odpowiedzialna za rysowanie i aktualizowanie wszystkich naszych obiektów. Kontroler będzie co jakiś czas dodawać kolejną piłkę do ekranu, aby utrudnić grę. Dodaj konstruktora i zainicjuj kilka podstawowych wartości. Interwał będzie to czas przed dodaniem kolejnej piłki.

    class GameController: def _init_(self, interval = 5): self.inter = interwał self.next = pygame.time.get_ticks() + (2 * 1000) self.type = "kontroler gry"

Krok 2. Dodaj funkcję aktualizacji

Dzięki temu sprawdzisz, ile czasu minęło od momentu dodania piłki lub od rozpoczęcia gry. Jeśli czas jest dłuższy niż interwał, zresetujesz czas i dodasz piłkę.

    class GameController: … def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball())

Krok 3. Daj kulkom losowe prędkości

Będziesz musiał używać liczb losowych, aby za każdym razem gra była inna. Jednak prędkości kulek są teraz liczbą zmiennoprzecinkową, a nie liczbą całkowitą.

    class GameController: … def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball(xVel=losowy()*2, yVel=losowy()*2))

Krok 4. Napraw funkcję rysowania

Funkcja rysowania nie akceptuje pływaków. Zamieńmy pozycję kuli na liczby całkowite, zanim kulki zostaną wylosowane.

    class Ball: … def draw(self, surface): pygame.draw.circle(surface, black, (int(self.x), int(self.y)), self.radius)

Krok 5. Zdefiniuj metodę rysowania dla kontrolera gier

Ponieważ jest to obiekt gry, główna pętla spróbuje go narysować. Będziesz musiał zdefiniować funkcję rysowania, która nic nie robi, aby gra się nie zawieszała.

    class GameController: … def draw(self, screen): pass

Krok 6. Dodaj kontroler gier do gameObjects i usuń 2 kulki

Gra powinna teraz odradzać piłkę co pięć sekund.

    class game(): def _init_(self): … self.gameObjects = self.gameObjects.append(GameController()) self.gameObjects.append(Player())

ProgramPygamePart6
ProgramPygamePart6

Krok 7. Wypróbuj

Oto jak powinien teraz wyglądać kod:

    import pygame z random import random z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame. display.set_mode(rozdzielczość) class Piłka: def _init_(self, xPos = rozdzielczość[0] / 2, yPos = rozdzielczość[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka" def draw(self, surface): pygame.draw.circle(surface, black, (int(self. x), int(self.y)), self.radius) def update(self, gameObjects): self.x += self.dx self.y += self.dy if (self.x <= 0 lub self. x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1 class Player: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" def draw(self, surface): pygame.draw.circle(surface, red, (self.x), self.y), self.radius) def update(self, gameObjects): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] dla gameObj w grze Obiekty: if gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)* *2: pygame.quit() class GameController: def _init_(self, interval = 5): self.inter = interwał self.next = pygame.time.get_ticks() + (2 * 1000) self.type = "kontroler gier " def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball(xVel=random) ()*2, yVel=random()*2)) def draw(self, screen): pass class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode(rozdzielczość) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(GameController()) self.gameObjects.append(Player()) def handleEvents(self): dla zdarzenia w pygame.event.get(): if event.type == QUIT: pygame.quit() def run(self): while True: self.handleEvents() dla gameObj w self.gameObjects: gameObj.update(self.gameObjects) self.screen.fill(biały) dla gameObj w self.gameO obiekty: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip() game().run()

Część 8 z 8: Dodawanie wyniku i koniec gry

Krok 1. Dodaj wynik do klasy kontrolera gier

Utwórz obiekt czcionki i zmienną punktacji. Będziesz narysować czcionkę w każdej klatce, aby wyświetlić punktację i zwiększyć punktację w każdej klatce podczas aktualizacji.

    class GameController: def _init_(self, interval = 5): … self.score = 0 self.scoreText = pygame.font. Font(Brak, 12) def update(self, gameObjects): … self.score += 1 def draw (self, screen): screen.blit(self.scoreText.render(str(self.score), True, black), (5, 5))

Krok 2. Zmodyfikuj sposób zakończenia gry

Pozbądźmy się wyjścia, gdy gracz wykryje kolizję. Zamiast tego ustawisz zmienną w odtwarzaczu, którą gra może sprawdzić. Gdy gameOver jest ustawione, przestań aktualizować obiekty. To zamrozi wszystko na swoim miejscu, aby gracz mógł zobaczyć, co się stało i sprawdzić swój wynik. Zwróć uwagę, że obiekty są nadal rysowane, ale nie są aktualizowane.

    class Player: def _init_(self, rad = 20): … self.gameOver = False def update(self, gameObjects): … for gameObj in gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: self.gameOver = True class game(): def _init_(self): … self.gameOver = False def run(self): while True: self.handleEvents() jeśli nie self.gameOver: for gameObj w self.gameObjects: gameObj.update(self.gameObjects) if gameObj.type == "player": self.gameOver = gameObj.gameOver

ProgramPygameFinal
ProgramPygameFinal

Krok 3. Wypróbuj

Oto jak powinien teraz wyglądać gotowy kod:

    importuj pygame z losowego importuj losowo z pygame.locals import * rozdzielczość = (400, 300) biały = (255, 255, 255) czarny = (0, 0, 0) czerwony = (255, 0, 0) screen = pygame. display.set_mode(resolution) class Piłka: def _init_(self, xPos = rozdzielczość[0] / 2, yPos = rozdzielczość[1] / 2, xVel = 1, yVel = 1, rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "piłka" def draw(self, surface): pygame.draw.circle(surface, black, (int(self. x), int(self.y)), self.radius) def update(self, gameObjects): self.x += self.dx self.y += self.dy if (self.x <= 0 lub self. x >= rozdzielczość[0]): self.dx *= -1 if (self.y <= 0 lub self.y >= rozdzielczość[1]): self.dy *= -1 class Player: def _init_(self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "gracz" self.gameOver = False def draw(self, surface): pygame.draw.circle(surface, red, (self.x, self.y), self.radius) def update(self, gameObjects): cord = pygame.mouse.get_pos() self.x = cord[0] self.y = cord[1] dla gameObj w gameObjects: if gameObj.type == "piłka": if (gameObj.x - self.x)**2 + (gameObj.y - self.y)**2 <= (gameObj.radius + self.radius)**2: self.gameOver = True class GameController: def _init_(self, interwał = 5): self.inter = interwał self.next = pygame.time.get_ticks() + (2 * 1000) self. type = "kontroler gry" self.score = 0 self.scoreText = pygame.font. Font(Brak, 12) def update(self, gameObjects): if self.next < pygame.time.get_ticks(): self.next = pygame.time.get_ticks() + (self.inter * 1000) gameObjects.append(Ball(xVel=random()*2, yVel=random()*2)) self.score += 1 def draw(self, screen): screen.blit(self.scoreText.render(str(self.score), True, black), (5, 5)) class game(): def _init_(self): pygame.init() self.screen = pygame.display.set_mode(rozdzielczość) self.clock = pygame.time. Clock() self.gameObjects = self.gameObjects.append(GameController()) self.gameObjects.append(Player()) self.gameOver = False def handleEvents(self): dla zdarzenia w pygame.event.get(): if ev ent.type == QUIT: pygame.quit() def run(self): while True: self.handleEvents() jeśli nie self.gameOver: dla gameObj w self.gameObjects: gameObj.update(self.gameObjects) if gameObj. type == "player": self.gameOver = gameObj.gameOver self.screen.fill(white) dla gameObj w self.gameObjects: gameObj.draw(self.screen) self.clock.tick(60) pygame.display.flip () gra().uruchom()

Zalecana: