pygame.init() là gì

Game Rắn săn mồi là một trong những game phổ biến, đây là trò chơi thể hiện đẳng cấp của những chiếc Nokia đời đầu. Tiếp nối chuỗi bài viết lập trình Python, trong bài viết này, hãy cùng trituenhantao.io lập trình game Rắn với thư viện pygame nhé. Bài hướng dẫn sẽ chỉ ra và giải thích chi tiết các ý tưởng để thực hiện điều này, nhưng nếu muốn có code hoàn chỉnh mà không cần hiểu các ý tưởng thì bạn có thể kéo xuống cuối bài viết.

Cài đặt môi trường

Bài hướng dẫn này yêu cầu về phần cứng đồ họa phục vụ cho việc hiển thị, do đó các bạn sẽ không thể sử dụng các máy tính chỉ hỗ trợ màn hình dòng lệnh hay Google colab để viết code mà cần sử dụng máy tính có hỗ trợ giao diện đồ họa.

Bước đầu tiên, chúng ta cần cài đặt pygame lên hệ thống. Thư viện này sẽ giúp chúng giảm tải rất nhiều trong việc quản lý phần cứng âm thanh, đồ họa và chỉ tập trung vào logic của game.

pip install pygame

Tạo cửa sổ

Để tạo cửa sổ sử dụng Pygame, ta sử dụng hàm display.set_mode() của thư viện này. Ở đầu và cuối đoạn code, ta cần sử dụng init() và quit() để khởi tạo và kết thúc môi trường. Hàm update() là hàm quan trọng sử dụng để cập nhật mọi thay đổi trên cửa sổ.

import pygame pygame.init() dis=pygame.display.set_mode((400,300)) #kích thước 400x300 pygame.display.update() pygame.quit() quit()

Vấn đề là khi chúng ta chạy đoạn code này, cửa sổ hiện ra và đóng lại ngay tức thì. Đây không phải điều chúng ta muốn, cửa sổ cần phải hiển thị cho đến khi ta click vào nút (x) để đóng nó một cách tường minh. Để làm như vậy, chúng ta sử dụng đoạn code sau:

game_over=False #Biến đánh dấu sự kiện kết thúc game while not game_over: for event in pygame.event.get(): if event.type==pygame.QUIT: game_over=True

Tạo hình con rắn

Giờ là nhân vật chính của chúng ta – con rắn. Khi bắt đầu game, con rắn chỉ là một điểm trên màn hình, do đó ta có thể dùng một ô vuông khác màu nền (trước mắt ta sẽ dùng màu xanh nước biển) để thể hiện nhân vật chính của chúng ta. Mỗi khi có thay đổi trên màn hình, đừng quên sử dụng hàm display.update() để cập nhật.

import pygame pygame.init() dis=pygame.display.set_mode((400,300)) blue=(0,0,255) game_over=False while not game_over: for event in pygame.event.get(): if event.type==pygame.QUIT: game_over=True pygame.draw.rect(dis,blue,[200,150,10,10])#con rắn pygame.display.update() pygame.quit() quit()

Di chuyển con rắn

Để có thể di chuyển con rắn, chúng ta cần thay đổi vị trí của ô vuông mà ta đã tạo. Việc này đơn giản là xóa màn hình và vẽ lại ô vuông mới bên cạnh vị trí cũ sau mỗi chu kỳ. Để làm được việc này, chúng ta sẽ sử dụng lớp time.Clock() của pygame. Ngoài ra, để điều khiển con rắn, chúng ta cũng cần sử dụng các phím mũi tên. May mắn là các sự kiện K_UP, K_DOWN, K_LEFT và K_RIGHT đều được cung cấp bởi pygame. Khi con rắn chạm vào viền cửa sổ, game kết thúc.

clock = pygame.time.Clock() while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0: game_over = True x1 += x1_change y1 += y1_change dis.fill(white) #xóa trắng màn hình pygame.draw.rect(dis, black, [x1, y1, snake_block, snake_block]) #vẽ lại con rắn pygame.display.update() clock.tick(snake_speed)

Tạo thức ăn cho rắn

Tiếp theo ta sẽ tạo thức ăn cho rắn, thức ăn là một ô vuông trên màn hình xuất hiện tại một vị trí ngẫu nhiên. Do đó, với dis_width và dis_height là chiều rộng và chiều cao của cửa sổ, snake_block là kích thước của ô vuông hiển thị con rắn, tọa độ của thức ăn có thể xác định bởi:

foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0

Khi rắn đớp mồi thành công, chiều dài của nó sẽ tăng lên. Thay vì biểu diễn con rắn là một khối, chúng ta sẽ cần sử dụng một danh sách lưu các khối. Trong mỗi lần cập nhật, ta nối thêm một khối vào phía đầu con rắn và xóa khối ở đuôi (trừ trường hợp rắn đớp mồi thành công). Nếu đầu của rắn trùng với một trong các khối ở phần thân của nó, game kết thúc.

pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block]) snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] for x in snake_List[:-1]: if x == snake_Head: game_over = True our_snake(snake_block, snake_List) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 Length_of_snake += 1

Hiển thị các thông báo

Tiếp theo, chúng ta sẽ hoàn thiện chương trình với các thông báo. Đầu tiên, khi con rắn chạm vào viền màn hình hoặc tự ăn chính nó, ta sẽ không thoát chương trình ngay mà hiển thị thông báo cho người dùng và cho phép họ lựa chọn chơi ván mới. Để lập trình được kịch bản này, ta sử dụng biến game_close để lưu trạng thái khi người dùng thua và biến game_over giờ chỉ được sử dụng để xác định hành động thoát game của người dùng.

while not game_over: while game_close == True: dis.fill(white) message("You Lost! Press Q-Quit or C-Play Again", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: gameLoop()

Tiếp theo, chúng ta sẽ thiết kế hàm để in điểm của người dùng lên góc trái bên trên của màn hình. Chúng ta sử dụng hàm blit của pygame để thực hiện điều này.

def Your_score(score): value = score_font.render("Your Score: " + str(score), True, yellow) dis.blit(value, [0, 0])

Hoàn thiện code

Bài hướng dẫn đã chỉ ra cho bạn những ý tưởng quan trọng nhất để thực hiện game rắn. Hãy dựa trên những ý tưởng đó để tự mình hoàn thiện code của chính bạn. Bạn sẽ học được rất nhiều từ bài tập này và cảm thấy tự hào về chính mình.

Ngoài ra bạn có thể tải file hoàn chỉnh snake.py để đối chiếu và so sánh. Để trang bị thêm kiến thức, chúng tôi xin gợi ý bạn đăng ký nhận tài liệu python miễn phí tại đây.

Nếu bạn thấy bài viết hữu ích, hãy chia sẻ cho mọi người. Chúc các bạn thành công!

Đây là thư viện mã nguồn mở trên ngôn ngữ Python dùng để lập trình video games. PyGame chứa đầy đủ các công cụ hỗ trợ lập trình game như đồ hoạt, hoạt hình, âm thanh, và sự kiện điều khiển.

Đồ hoạ và hoạt hình là hai phần không thể thiếu trong video games. PyGame giúp lập trình có thể tạo các nhân vật với hình ảnh. PyGame cũng đồng thời cung cấp các công cụ tích hợp hiệu ứng âm thanh cũng như nhạc nền cho game. Cuối cùng, các sự kiện điều khiển từ bàn phím, chuột cũng được được PyGame hỗ trợ một cách hiệu quả nhất

2. Một số game được xây dựng bằng Python

Rất nhiều games với thao tác phức tạp được lập trình bằng Python:

Plattformspiel

Pygame RPG Fighter

Truy cập các đường link phía trên, tải về và chạy trên Thonny để có thể trải nghiệm game

Ngoài ra chúng ta còn có thể tham khảo thêm các game khác được lập trình bằng ngôn ngữ Python tại đây: https://www.pygame.org/tags/all

Trại hè Lập trình 2021 với khoá học CS 101 về Python

ĐĂNG KÝ NGAY

II. Cách lập trình Game T-Rex Jump 

Game T-Rex Jump được lấy ý tưởng từ game trên Google Chrome giúp người chơi thư giãn trong khi không kết nối được với internet

pygame.init() là gì

Bước 1: Cài đặt Thonny và Pygame

  • Cài đặt Thonny
  • Cài đặt PyGame trong Thonny

Trong Thonny, chọn Tools -> Manage Packages -> Search “Pygame” -> Install

pygame.init() là gì

Bước 2: Hiểu cách game vận hành – Vòng lặp game (game loop)

Vòng lặp giống như “quả tim” của tất cả các video games. Khi một game bắt đầu, một vòng lặp sẽ được khởi động và sẽ chạy xuyên suốt quá trình chơi game cho đến khi người chơi thoát game. 

Trong mỗi vòng lặp, sẽ có 3 sự kiện chính xảy ra, đó là dữ liệu từ người chơi, cập nhật các thông số, và vẽ các nhân vật ra màn hình.

a. Dữ liệu từ người chơi (process input)

Đây là việc mà mỗi video game cần phải làm trong mỗi vòng lặp. Đó là lấy các sự kiện mà người chơi tác động vào trò chơi như nhấn phím space hay click chuột trái. 

VD: Đối với game T-Rex Jump này, thao tác của người dùng sẽ là nhấn phím space.

b. Cập nhật các thông số trong game (Update Game)

Đây là bước tiếp theo trong một vòng lặp là cập nhật các thông số của game như toạ độ của nhân vật, tốc độ của nhân vật, điểm số người chơi đang đạt được, …

VD: Trong game T-Rex Jump, toạ độ của T-Rex sẽ được thay đổi theo mỗi vòng lặp, hay toạ độ của các cây xương rồng sẽ di chuyển về hướng T-Rex

c. Vẽ (Draw or render)

Sau khi đã cập nhật xong các thông số của game, chúng ta cần “vẽ” tất cả các nhân vật ra ngoài cửa sổ game

VD: Sau khi kết thúc vòng lặp, chúng ta cần vẽ lại tất cả nhân vật với toạ độ mới.

Ngoài ra, một phần rất đặc biệt không thể thiếu trong PyGame là bộ đếm thời gian (clock). Bộ đếm thời gian giúp chúng ta điều khiển được tốc độ lặp của một vòng lặp đủ để tất cả các quá trình trên được hoàn thành trước khi chuyển sang một vòng lặp mới. 

Bước 3: Thực hiện lập trình: Các thành phần cơ bản của một dự án PyGame

3.1 Import các thư viện cần thiết

Với bài học đầu tiên này chúng ta chỉ cần import hai thư viện Python cần thiết là random và PyGame thôi nhé:

import pygame import random

3.2 Định nghĩa các hằng số trong game

Việc định nghĩa các hằng số trong các chương trình, đặc biệt là các chương trình video games, là điều rất quan trọng. Vì các hằng số này sẽ được dùng lại rất nhiều lần, khi có thay đổi gì về giá trị của các hằng số này, chúng ta chỉ cần thay đổi một vị trí duy nhất mà thôi. Lưu ý: các hằng số được viết in hoa để phân biệt với các biến số khác trong game

WIDTH = 360  # width of our game window HEIGHT = 480 # height of our game window FPS = 30 # frames per second

3.3 Khởi tạo cửa sổ game

pygame.init() pygame.display.set_caption("T-REX") screen = pygame.display.set_mode((WIDTH, HEIGHT))
  • Khởi tạo bộ đếm thời gian
clock = pygame.time.Clock()

3.4 Tạo vòng lặp game

Để định nghĩa vòng lặp game, chúng ta dùng while loop mà các thầy cô trong CS101 đã dạy cho chúng ta nhé.

running = True while running: # Du lieu tu nguoi choi # Cap nhat thong so cua game # Ve cac doi tuong ra man hinh game

3.5 Thiết lập tốc độ của bộ đếm thời gian (FPS)

Làm thế nào để điều được tốc độ của bộ đếm thời gian nhỉ?

running = True while running: clock.tick(FPS) # Du lieu tu nguoi choi # Cap nhat thong so cua game # Ve cac doi tuong ra man hinh game pygame.display.flip()

3.6 Thoát game

Chúng ta có thể thêm đoạn code xử lý sự kiện thoát game khi nhấn vào nút thoát cửa sổ game bằng đoạn code sau trong vòng lặp game của chúng ta nhé

for event in pygame.event.get(): # check for closing window if event.type == pygame.QUIT: running = False

3.7 Thành quả

Sau khi hoàn thành các bước trên, chúng ta sẽ được đoạn code như sau: 

import pygame import random WIDTH = 600 HEIGHT = 600 FPS = 30 # khung hinh tren giay pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() # Game loop running = True while running: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # Du lieu tu nguoi choi # Cap nhat thong so cua game # Ve cac doi tuong ra man hinh game pygame.display.flip() pygame.quit()

Chúng ta có thể chạy đoạn code trên nhưng chỉ nhìn thấy cửa sổ game màu đen thôi nhé.

Bước 4: Vẽ và tô màu cho đối tượng

4.1. Thiết lập màu sắc và mã màu

pygame.init() là gì

Trong lập trình game mã màu cũng là phần rất quan trọng vì nó giúp người chơi có thể phân biệt được các nhân vật khác nhau khi chúng cùng xuất hiện trong màn hình game. Một số mã màu quan trọng:

Để có thể dùng các màu trong Pygame, chúng ta nên khai báo chúng giống như các hằng số và chỉ gọi tên khi chúng ta cần dùng đến

BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255)

4.2 Thiết lập tọa độ của một đối tượng

Gốc toạ độ trong PyGame sẽ nằm ở góc trên bên trái của cửa sổ game nhé

VD: như hình vẽ bên dưới đối tượng hình chữ nhật sẽ có toạ độ là 50px theo trục X và 50px theo trục Y và có kích thước là 40×30.

pygame.init() là gì

4.3. Vẽ hình vuông, hình tròn trên cửa sổ game

Vẽ hình vuông màu đỏ ở toạ độ (50,50) và có kích thước 60×60 pixels

pygame.draw.rect(screen, RED,(50, 50, 60, 60))

Vẽ hình tròn màu xanh dương ở toạ độ (200,200) và có bán kính 75 pixels

pygame.draw.circle(screen, BLUE, (150,150), 75)

Bước 5: Thành quả: 

Hãy cùng kiểm tra code của các bạn có giống như bộ code của bài dưới đây không nhé [link]

import pygame import random WIDTH = 600 HEIGHT = 600 FPS = 30 # khung hinh tren giay WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("My Game") clock = pygame.time.Clock() # Game loop running = True while running: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # Du lieu tu nguoi choi # Cap nhat thong so cua game # Ve cac doi tuong ra man hinh game screen.fill(BLACK) pygame.draw.rect(screen, RED, (50, 50, 60, 60)) pygame.draw.circle(screen, BLUE, (200,200), 75) pygame.display.flip() pygame.quit()


pygame.init() là gì

Trại hè Lập trình 2021 với khoá học CS 101 về Python

ĐĂNG KÝ NGAY

Tham khảo

http://kidscancode.org/blog/2016/08/pygame_1-1_getting-started/

Chúc mừng các bạn đã hoàn thành bài lập trình game đầu tiên với ngôn ngữ PyGame!

Hãy đừng quên chia sẻ thành quả của mình với thầy cô và các bạn trên hệ thống STEAMese Profile nhé!

— — —

Người viết: Huy Nguyễn

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

📧Email:

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official