Hướng dẫn lập trình game Rắn với thư viện pygame

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()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_LEFTK_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_widthdis_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!




Về trituenhantao.io

Trituenhantao.io là trang web chia sẻ thông tin, kiến thức, kinh nghiệm học tập và triển khai các chương trình và dự án sử dụng trí tuệ nhân tạo trên thế giới.
Xem tất cả các bài viết của trituenhantao.io →