Cách lập trình trò chơi bằng Python với Pygame (có Hình ảnh)

Mục lục:

Cách lập trình trò chơi bằng Python với Pygame (có Hình ảnh)
Cách lập trình trò chơi bằng Python với Pygame (có Hình ảnh)

Video: Cách lập trình trò chơi bằng Python với Pygame (có Hình ảnh)

Video: Cách lập trình trò chơi bằng Python với Pygame (có Hình ảnh)
Video: File I/O trong Python | Mở, viết , ghi đè , đọc file 2024, Có thể
Anonim

Đây là phần giới thiệu về Pygame dành cho những người đã biết Python. Bài viết này sẽ hướng dẫn bạn các bước để xây dựng một trò chơi đơn giản có người chơi né tránh những quả bóng nảy.

Các bước

Phần 1/8: Cài đặt Pygame

Bước 1. Tải xuống Pygame

Tìm nó cho nền tảng của bạn từ

Bước 2. Chạy trình cài đặt

Bước 3. Xác minh rằng cài đặt đã hoạt động

Mở một thiết bị đầu cuối Python. Nhập "nhập pygame". Nếu bạn không thấy bất kỳ lỗi nào thì Pygame đã được cài đặt thành công.

    nhập pygame

Phần 2/8: Thiết lập cửa sổ cơ bản

Bước 1. Mở một tệp mới

Bước 2. Nhập Pygame

Pygame là một thư viện cung cấp quyền truy cập vào các chức năng đồ họa. Nếu bạn muốn biết thêm thông tin về cách hoạt động của các chức năng này, bạn có thể tra cứu chúng trên trang web Pygame.

    nhập pygame từ nhập pygame.locals *

Bước 3. Đặt độ phân giải của cửa sổ

Bạn sẽ tạo một biến chung cho độ phân giải màn hình để có thể được tham chiếu trong một số phần của trò chơi. Bạn cũng có thể dễ dàng tìm thấy ở đầu tệp để có thể thay đổi nó sau này. Đối với các dự án nâng cao, đưa thông tin này vào một tệp riêng biệt sẽ là một ý tưởng tốt hơn.

    độ phân giải = (400, 300)

Bước 4. Xác định một số màu sắc

Màu sắc trong pygame là (RBGA có giá trị từ 0 đến 255. Giá trị alpha (A) là tùy chọn nhưng các màu khác (đỏ, xanh lam và xanh lục là bắt buộc).

    trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0)

Bước 5. Khởi tạo màn hình

Sử dụng biến độ phân giải đã được xác định trước đó.

    screen = pygame.display.set_mode (độ phân giải)

Bước 6. Thực hiện một vòng lặp trò chơi

Lặp lại các hành động nhất định trong mỗi khung hình của trò chơi của chúng tôi. Tạo một vòng lặp sẽ luôn lặp lại để chuyển qua tất cả các hành động này.

    trong khi Đúng:

Bước 7. Tô màu cho màn hình

    screen.fill (trắng)

Bước 8. Hiển thị màn hình

Nếu bạn chạy chương trình, màn hình sẽ chuyển sang màu trắng và sau đó chương trình sẽ bị treo. Điều này là do hệ điều hành đang gửi các sự kiện đến trò chơi và trò chơi không làm bất cứ điều gì với chúng. Một khi trò chơi nhận được quá nhiều sự kiện không được xử lý, nó sẽ bị treo.

    trong khi Đúng:… pygame.display.flip ()

Bước 9. Xử lý các sự kiện

Nhận danh sách tất cả các sự kiện đã xảy ra trong mỗi khung. Bạn sẽ chỉ quan tâm đến một sự kiện, sự kiện thoát. Điều này xảy ra khi người dùng đóng cửa sổ trò chơi. Điều này cũng sẽ ngăn chương trình của chúng tôi bị treo do có quá nhiều sự kiện.

    while True:… cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit ()

ProgramPygamePart1
ProgramPygamePart1

Bước 10. Hãy dùng thử

Đây là mã sẽ trông như thế nào bây giờ:

    nhập pygame từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame.display.set_mode (độ phân giải) trong khi True: screen.fill (trắng) pygame.display.flip () cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit ()

Phần 3/8: Tạo đối tượng trò chơi

Bước 1. Tạo một lớp và phương thức khởi tạo mới

Đặt tất cả các thuộc tính của đối tượng. Bạn cũng đang cung cấp các giá trị mặc định cho tất cả các thuộc tính.

    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 = "ball"

Bước 2. Xác định cách vẽ đối tượng

Sử dụng các thuộc tính đã được xác định trong hàm tạo để vẽ quả bóng dưới dạng hình tròn cũng như truyền một bề mặt vào hàm để vẽ đối tượng. Bề mặt sẽ là đối tượng màn hình đã được tạo bằng độ phân giải trước đó.

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

Bước 3. Tạo một thể hiện của lớp cũng như yêu cầu vòng lặp trò chơi vẽ quả bóng trong mỗi vòng lặp

    ball = Ball () trong khi True:… ball.draw (màn hình)

Bước 4. Làm cho đối tượng di chuyển

Tạo một hàm sẽ cập nhật vị trí của đối tượng. Gọi hàm này trong mọi vòng lặp trò chơi.

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

Bước 5. Giới hạn tốc độ khung hình

Quả bóng sẽ di chuyển rất nhanh vì vòng lặp của trò chơi đang chạy hàng trăm lần một giây. Sử dụng đồng hồ của Pygame để giới hạn tốc độ khung hình ở mức 60 khung hình / giây.

    clock = pygame.time. Clock () trong khi Đúng:… clock.tick (60)

Bước 6. Giữ bóng trên màn hình

Thêm kiểm tra trong chức năng cập nhật để đảo ngược hướng của quả bóng nếu nó chạm vào một trong các cạnh màn hình.

    class Ball:… def update (self):… if (self.x <= 0 or self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 hoặc self.y > = Resolution [1]): self.dy * = -1

ProgramPygamePart2
ProgramPygamePart2

Bước 7. Hãy dùng thử

Đây là mã sẽ trông như thế nào bây giờ:

    nhập pygame từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame.display.set_mode (độ phân giải) lớp Bóng: def _init _ (tự, xPos = độ phân giải [0] / 2, yPos = độ phân giải [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 = "ball" 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 hoặc self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 ball = Ball () clock = pygame.time. Clock () while True: screen. fill (trắng) ball.draw (màn hình) ball.update () pygame.display.flip () clock.tick (60) cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit ()

Phần 4/8: Tổ chức trò chơi

Bước 1. Sử dụng các lớp học để sắp xếp mọi thứ

Trò chơi sẽ trở nên phức tạp hơn. Sử dụng các kỹ thuật hướng đối tượng để tổ chức mã của bạn.

Bước 2. Tạo vòng lặp trò chơi thành một lớp

Vì trò chơi của chúng tôi hiện có dữ liệu bao gồm các đối tượng và chức năng trò chơi của bạn, nên việc biến vòng lặp trò chơi của bạn thành một lớp là rất hợp lý.

    trò chơi lớp ():

Bước 3. Thêm một hàm tạo

Tại đây bạn sẽ khởi tạo một số đối tượng trò chơi, tạo màn hình và đồng hồ của chúng tôi và khởi tạo Pygame. Pygame cần được khởi tạo để sử dụng một số tính năng nhất định như văn bản hoặc âm thanh.

    class game (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (Resolution) self.clock = pygame.time. Clock ()

Bước 4. Xử lý các sự kiện trong một hàm

    class game ():… def handleEvents (self): cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit ()

Bước 5. Làm cho vòng lặp trò chơi trở thành một chức năng

Gọi hàm xử lý sự kiện mỗi vòng lặp.

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

Bước 6. Xử lý nhiều đối tượng trò chơi

Ngay bây giờ đoạn mã này phải gọi draw và update trên mỗi frame đối tượng của chúng ta. Điều này sẽ trở nên lộn xộn nếu bạn có nhiều đồ vật. Hãy thêm đối tượng của chúng ta vào một mảng, sau đó cập nhật và vẽ tất cả các đối tượng trong mảng mỗi vòng lặp. Bây giờ bạn có thể dễ dàng thêm một đối tượng khác và đặt cho nó một vị trí bắt đầu khác.

    class game (): def _init _ (self):… self.gameObjects = self.gameObjects.append (Ball ()) self.gameObjects.append (Ball (100))… def run (self): while True: self.handleEvents () cho gameObj trong self.gameObjects: gameObj.update () self.screen.fill (trắng) cho gameObj trong self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip ()

ProgramPygamePart3
ProgramPygamePart3

Bước 7. Hãy dùng thử

Đây là mã sẽ trông như thế nào bây giờ:

    nhập pygame từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame.display.set_mode (độ phân giải) lớp Bóng: def _init _ (tự, xPos = độ phân giải [0] / 2, yPos = độ phân giải [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 = "ball" 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 hoặc self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class game (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (Resolution) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Ball ()) self.gameObjects.append (Ball (100)) def handleEvents (self): cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvent s () cho gameObj trong self.gameObjects: gameObj.update () self.screen.fill (trắng) cho gameObj trong self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display. trò chơi flip () (). run ()

Phần 5/8: Thêm đối tượng người chơi

Bước 1. Tạo một lớp trình phát và hàm tạo

Bạn sẽ tạo một vòng tròn khác được điều khiển bởi chuột. Khởi tạo các giá trị trong hàm tạo. Bán kính là giá trị quan trọng duy nhất.

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

Bước 2. Xác định cách vẽ đối tượng người chơi

Nó sẽ giống như cách bạn vẽ các đối tượng trò chơi khác.

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

Bước 3. Thêm điều khiển chuột cho đối tượng người chơi

Trong mọi khung hình, hãy kiểm tra vị trí của chuột và đặt vị trí của các đối tượng của người chơi vào điểm đó.

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

Bước 4. Thêm một đối tượng người chơi vào gameObjects

Tạo một phiên bản trình phát mới và thêm nó vào danh sách.

    trò chơi lớp (): def _init _ (self):… self.gameObjects.append (Player ())

ProgramPygamePart4
ProgramPygamePart4

Bước 5. Hãy dùng thử

Đây là mã sẽ trông như thế nào bây giờ:

    nhập pygame từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame.display.set_mode (độ phân giải) lớp Bóng: def _init _ (tự, xPos = độ phân giải [0] / 2, yPos = độ phân giải [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 = "ball" 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 hoặc self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Người chơi: 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.display.set_ mode (độ phân giải) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Player ()) self.gameObjects.append (Ball ()) self.gameObjects.append (Ball (100)) def handleEvents (self): for event in pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () for gameObj in self.gameObjects: gameObj.update () self.screen.fill (trắng) cho gameObj trong self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () game (). chạy()

Phần 6/8: Làm cho các đối tượng tương tác với người chơi

Bước 1. Thay đổi các chức năng Cập nhật

Để các đối tượng tương tác, chúng sẽ cần có quyền truy cập vào nhau. Hãy thêm một tham số khác vào Cập nhật để chuyển vào danh sách gameObjects. Bạn sẽ phải thêm nó vào cả đối tượng người chơi và đối tượng Ball. Nếu bạn có nhiều đối tượng trò chơi, kế thừa có thể giúp bạn giữ nguyên tất cả các chữ ký phương thức của mình.

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

Bước 2. Kiểm tra va chạm giữa người chơi và bóng

Đi qua tất cả các đồ vật trong trò chơi và kiểm tra xem loại đồ vật đó có phải là quả bóng không. Sau đó, sử dụng bán kính của hai vật thể và công thức khoảng cách để kiểm tra xem chúng có đang va chạm hay không. Các vòng kết nối thực sự dễ dàng để kiểm tra va chạm. Đây là lý do lớn nhất mà bạn không sử dụng một số hình dạng khác cho trò chơi này.

    class Player:… def update (self, gameObjects):… cho gameObj trong gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) ** 2:

ProgramPygamePart5
ProgramPygamePart5

Bước 3. Kết thúc trò chơi nếu người chơi bị "dính đòn"

Hãy thoát khỏi trò chơi ngay bây giờ.

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

Bước 4. Hãy dùng thử

Đây là Mã sẽ trông như thế nào bây giờ:

    nhập pygame từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame.display.set_mode (độ phân giải) lớp Bóng: def _init _ (tự, xPos = độ phân giải [0] / 2, yPos = độ phân giải [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 = "ball" 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 hoặc self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 hoặc self.y> = Resolution [1]): self.dy * = -1 class Người chơi: 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) cập nhật def (self, gameObjects): wire = pygame.mouse.get_pos () self.x = cord [0] self.y = cord [1] cho gameObj trong gameObjects: if gameObj.type == "ball": 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 (Resolution) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Player ()) self.gameObjects.append (Ball ()) self.gameObjects.append (Ball (100)) def handleEvents (self): cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () for gameObj in self.gameObjects: gameObj.update (self.gameObjects) self.screen.fill (trắng) cho gameObj trong self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () game (). run ()

Phần 7/8: Thêm bộ điều khiển trò chơi để tạo đối tượng

Bước 1. Tạo một lớp điều khiển trò chơi

Người điều khiển trò chơi chịu trách nhiệm "chạy" trò chơi. Nó khác với lớp trò chơi của chúng tôi, lớp chịu trách nhiệm vẽ và cập nhật tất cả các đối tượng của chúng tôi. Bộ điều khiển sẽ định kỳ thêm một quả bóng khác vào màn hình để làm cho trò chơi khó hơn. Thêm một hàm tạo và khởi tạo một số giá trị cơ bản. Khoảng thời gian sẽ là khoảng thời gian trước khi một quả bóng khác được thêm vào.

    class GameController: def _init _ (self, khoảng = 5): self.inter = khoảng self.next = pygame.time.get_ticks () + (2 * 1000) self.type = "game controller"

Bước 2. Thêm chức năng cập nhật

Thao tác này sẽ kiểm tra bao nhiêu thời gian đã trôi qua kể từ thời điểm một quả bóng được thêm vào hoặc từ khi trận đấu bắt đầu. Nếu thời gian nhiều hơn khoảng thời gian, bạn sẽ đặt lại thời gian và thêm một quả bóng.

    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 ())

Bước 3. Cho các quả bóng vận tốc ngẫu nhiên

Bạn sẽ cần sử dụng các số ngẫu nhiên để làm cho trò chơi trở nên khác biệt. Tuy nhiên, vận tốc của các quả bóng bây giờ là một số dấu phẩy động thay vì một số nguyên.

    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 = random () * 2, yVel = random () * 2))

Bước 4. Sửa chức năng vẽ

Chức năng vẽ sẽ không chấp nhận phao. Hãy chuyển đổi vị trí của quả bóng thành số nguyên trước khi các quả bóng được rút ra.

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

Bước 5. Xác định phương pháp rút thăm cho bộ điều khiển trò chơi

Vì nó là một đối tượng trò chơi, nên vòng lặp chính sẽ cố gắng vẽ nó. Bạn sẽ cần phải xác định một chức năng hòa không làm gì để trò chơi không bị treo.

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

Bước 6. Thêm bộ điều khiển trò chơi vào gameObjects và loại bỏ 2 quả bóng

Trò chơi bây giờ sẽ xuất hiện một quả bóng sau mỗi năm giây.

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

ProgramPygamePart6
ProgramPygamePart6

Bước 7. Hãy dùng thử

Đây là mã sẽ trông như thế nào bây giờ:

    nhập pygame từ nhập ngẫu nhiên ngẫu nhiên từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame. class display.set_mode (độ phân giải) Bóng: 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 = "ball" 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 hoặc self. x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Người chơi: 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] cho gameObj trong trò chơi Đối tượng: 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, khoảng = 5): self.inter = khoảng self.next = pygame.time.get_ticks () + (2 * 1000) self.type = "trình điều khiển trò chơi "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 (độ phân giải) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (GameController ()) self.gameObjects.append (Player ()) def handleEvents (self): cho sự kiện trong pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () for gameObj in self.gameObjects: gameObj.update (self.gameObjects) self.screen.fill (trắng) cho gameObj trong self.gameO bjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () game (). run ()

Phần 8/8: Thêm điểm và kết thúc trận đấu

Bước 1. Thêm điểm cho lớp người điều khiển trò chơi

Tạo một đối tượng phông chữ và một biến điểm. Bạn sẽ vẽ phông chữ trong mọi khung hình để hiển thị điểm số và tăng điểm số mỗi khung hình trong bản cập nhật.

    class GameController: def _init _ (self, khoảng = 5):… self.score = 0 self.scoreText = pygame.font. Font (None, 12) def update (self, gameObjects):… self.score + = 1 def hòa (self, screen): screen.blit (self.scoreText.render (str (self.score), True, black), (5, 5))

Bước 2. Sửa đổi cách trò chơi kết thúc

Hãy thoát khỏi trạng thái thoát khi người chơi phát hiện ra va chạm. Thay vào đó, bạn sẽ đặt một biến trong trình phát mà trò chơi có thể kiểm tra. Khi gameOver được đặt, hãy ngừng cập nhật các đối tượng. Điều này sẽ đóng băng mọi thứ tại chỗ để người chơi có thể xem những gì đã xảy ra và kiểm tra điểm số của họ. Lưu ý rằng các đối tượng vẫn đang được vẽ, chỉ là chưa được cập nhật.

    class Player: def _init _ (self, rad = 20):… self.gameOver = Sai cập nhật def (self, gameObjects):… cho gameObj trong 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 () if not self.gameOver: for gameObj in self.gameObjects: gameObj.update (self.gameObjects) if gameObj.type == "player": self.gameOver = gameObj.gameOver

ProgramPygameFinal
ProgramPygameFinal

Bước 3. Hãy dùng thử

Đây là mã đã hoàn thành bây giờ trông như thế nào:

    nhập pygame từ nhập ngẫu nhiên ngẫu nhiên từ nhập pygame.locals * độ phân giải = (400, 300) trắng = (255, 255, 255) đen = (0, 0, 0) đỏ = (255, 0, 0) screen = pygame. class display.set_mode (độ phân giải) Bóng: 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 = "ball" 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 hoặc self. x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Người chơi: def _init _ (self, rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" 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] cho gameObj trong 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 GameController: def _init _ (self, khoảng = 5): self.inter = khoảng self.next = pygame.time.get_ticks () + (2 * 1000) self. type = "game controller" self.score = 0 self.scoreText = pygame.font. Font (Không có, 12) cập nhật def (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 (Resolution) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (GameController ()) self.gameObjects.append (Player ()) self.gameOver = False def handleEvents (self): cho sự kiện trong pygame.event.get (): if ev ent.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () if not self.gameOver: for gameObj in self.gameObjects: gameObj.update (self.gameObjects) if gameObj. gõ == "player": self.gameOver = gameObj.gameOver self.screen.fill (màu trắng) cho gameObj trong self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () trò chơi (). run ()

Đề xuất: