icantech
Code mẫu Python
5888
14/11/2023

Hướng dẫn code Python game rắn săn mồi với 8 bước đơn giản

Rắn săn mồi là lựa game vô cùng quen thuộc xuất hiện từ những năm 1970. Sau này, tựa game vẫn tiếp tục phổ biến trên các thiết bị di động với màn hình đen trắng. Tại đây, người chơi sẽ điều khiển rắn săn tránh vật cản và săn những con mồi để trở nên dài hơn. Trong bài viết này, ICANTECH sẽ hướng dẫn bạn code Python game rắn săn mồi với 8 bước đơn giản. Cùng theo dõi nhé!

1. Phân tích trò chơi rắn săn mồi

Để lập trình Python code game snake, hãy cùng ICANTECH phân tích trò chơi này như sau:

  • Ban đầu trên màn hình sẽ hiển thị một con rắn rất nhỏ (ngắn)
  • Con rắn này sẽ đi săn mồi
  • Mỗi lần con rắn ăn một miếng mồi thì rắn sẽ dài thêm một lượng nhất định
  • Trong trường hợp rắn tự cắn hoặc đâm vào biên thì trò chơi sẽ kết thúc
ran-san-moi

Như vậy, với cách phân tích trò chơi như trên chúng ta cần thực hiện các bước như sau:

  • Khởi tạo màn hình trò chơi
  • Tạo rắn 
  • Tạo chuyển động của rắn
  • Thêm con mồi
  • Tăng độ dài con rắn khi ăn được mồi
  • Sự kiện rắn đâm vào biên và hiện thông báo
  • Sự kiện con rắn cắn vào đuôi và hiện thông báo
  • Thông báo game thua và hiển thị kết quả
  • Ghi nhận điểm số

2. Hướng dẫn code Python game rắn săn mồi dành cho người mới bắt đầu

2.1. Khởi tạo màn hình trò chơi

Ở bước khởi màn hình, chúng ta sẽ lần lượt khai báo các thư viện cần thiết cho trò chơi: pygame, sys và random theo:

  • Khai báo thư viện
  • Định nghĩa về các màu sắc sẽ dùng trong trò chơi
  • Khởi tạo chương trình pygame, thêm thông số kích thước màn hình, tiêu đề trò chơi
  • Hiển thị màn hình trò chơi

Với các phân tích như vậy, chúng ta sẽ sử dụng các câu lệnh sau: 

import pygame, sys, random

WHITE = (255, 255, 255)

YELLOW = (255, 255, 102)

BLACK = (0, 0, 0)

RED = (213, 50, 80)

GREEN = (0, 255, 0)

BLUE = (50, 153, 213)

pygame.init()

screen_width = 600

screen_height = 400

title = 'Rắn săn mồi'

screen = pygame.display.set_mode((screen_width, screen_height))

pygame.display.set_caption(title)

2.2. Lập trình tạo rắn 

Thực tế con rắn là nhiều hình vuông ghép lại với nhau. Để vẽ các hình vuông trong Pygame, chúng ta sử dụng lệnh vẽ hình chữ nhật pygame.draw.rect() với chiều dài và chiều rộng bằng nhau.  

Mỗi hình vuông thể hiện là một khúc của con rắn có kích thước là 10x10 và các khúc của con rắn là 10x10 nên các tọa độ bắt đầu vẽ các khúc của rắn sẽ là bội của 10. 

Tiếp theo, ICANTECH sẽ tiến hành khai báo 2 biến toàn cục xác định toạ độ x và tọa độ y bắt đầu của con rắn (đầu rắn) và tiến hành khai báo tiếp biến toàn cục xác định độ dài một khúc (hình vuông) của rắn. 

Với các phân tích như vậy, chúng ta sẽ sử dụng các câu lệnh sau: 

snake_block = 10

x_head = 300

y_head = 200

x_head_change = 0

y_head_change = 0

clock = pygame.time.Clock()

2.3. Tạo chuyển động của rắn

Để di chuyển rắn, ICANTECH sẽ lần lượt cần tạo ra các sự kiện KEYDOWN của Pygame. Các sự kiện được sử dụng ở đây là K_UP, K_DOWN, K_LEFT và K_RIGHT tương ứng với các mũi tên trên bàn phím di chuyển lên, xuống, trái và phải của rắn.

Như vậy, chúng ta sẽ sử dụng các câu lệnh sau:

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            sys.exit()

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_LEFT:

                x_head_change = -10

                y_head_change = 0

            elif event.key == pygame.K_RIGHT:

                x_head_change = 10

                y_head_change = 0

            elif event.key == pygame.K_UP:

                y_head_change = -10

                x_head_change = 0

            elif event.key == pygame.K_DOWN:

                y_head_change = 10

                x_head_change = 0

Tiếp theo, chúng ta sẽ khai báo hai biến mới là x_head_change và y_head_change để xác định sự thay đổi của đầu rắn. 

Ví dụ tọa độ đầu di chuyển sang phải thì tọa độ x tăng 1 lượng là 10 tọa độ y sẽ không thay đổi, di chuyển xuống dưới thì tọa độ x không thay đổi tọa độ y tăng 1 lượng là 10.

Cuối cùng, ICANTECH tiến hành khai báo và cài đặt số lượng khung hình (FPS) trong một giây.

screen.fill(WHITE)

    x_head += x_head_change

    y_head += y_head_change

    pygame.display.update()

    clock.tick(12)

2.4. Thêm con mồi

Con mồi sẽ xuất hiện ngẫu nhiên trên màn hình hiển thị trò chơi. Vì mỗi bước đi của con rắn là 10 nên con mồi sẽ xuất hiện ở những vị trí có tọa độ là bội của 10. Như vậy, chúng ta sử dụng câu lệnh:

randFoodX = random.randrange(0, screen_width - 10)

surplusFoodX = randFoodX % 10

foodx = round(randFoodX - surplusFoodX)

randFoodY = random.randrange(0, screen_height - 10)

surplusFoodY = randFoodY % 10

foody = round(randFoodY - surplusFoodY)

print('foodx, foody', foodx, foody)

pygame.draw.rect(screen, BLUE, [foodx, foody, snake_block, snake_block]

Để con mồi xuất hiện ngẫu nhiên chúng ta dùng thư viện random lấy tọa độ x, y. Sau khi lấy được tọa độ x, y tiến hành tính toán làm tròn sao cho tọa độ x, y là bội của 10.

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            sys.exit()

        screen.fill(WHITE)

    pygame.draw.rect(screen, BLUE, [foodx, foody, snake_block, snake_block]) 

    pygame.draw.rect(screen, BLACK, [x_head, y_head, snake_block, snake_block])

    pygame.display.update()

2.5. Tăng độ dài rắn khi ăn được mồi

Để tăng độ dài của rắn khi ăn được mồi bạn lần lượt thực hiện khai báo một biến lưu dữ liệu độ dài của con rắn và một danh sách lưu tọa độ các khúc của con rắn.

snake_list = []

snake_length = 1

def show_snake(snake_block, snake_list):

    for x in snake_list:

        pygame.draw.rect(screen, BLACK, [x[0], x[1], snake_block, snake_block])

Tiếp theo, bạn tiến hành khai báo danh sách lưu toạ độ của đầu rắn và lần lượt  Xây dựng một hàm để vẽ con rắn lên màn hình game.

    snake_head = []

    snake_head.append(x_head)

    snake_head.append(y_head)

    snake_list.append(snake_head)

    if len(snake_list) > snake_length:

        del snake_list[0]

    show_snake(snake_block, snake_list)

Trong trường hợp rắn chạm vào con mồi thì sẽ tạo một con mồi khác ở vị trí mới.

    if x_head == foodx and y_head == foody:

        randFoodX = random.randrange(0, screen_width - 10)

        surplusFoodX = randFoodX % 10

        foodx = round(randFoodX - surplusFoodX)

        randFoodY = random.randrange(0, screen_height - 10)

        surplusFoodY = randFoodY % 10

        foody = round(randFoodY - surplusFoodY)

        snake_length += 1

2.6. Sự kiện rắn đâm vào biên 

Để kiểm tra rắn chạm biên, bạn cần sử dụng các câu lệnh sau:

 # kiểm tra chạm biên

    if (x_head >= screen_width) or (x_head < 0) or (y_head >= screen_height) or (y_head < 0):

        game_close = True

2.7. Sự kiện con rắn cắn vào đuôi

Khi rắn cắn vào thân hoặc đuôi thì gán biến game_close = True để dừng game lại. ICANTECH sẽ sử dụng câu lệnh sau:

 for x in snake_list[:-1]:

        if x == snake_head:

            game_close = True

2.8. Thông báo game thua và hiển thị kết quả

Khi trò chơi kết thúc và hiện thông báo, chúng ta sẽ thực hiện các bước sau đây:

  • Khai báo font chữ Arial.
  • Định nghĩa hàm hiển thị thông báo

arialFont = pygame.font.SysFont("Arial", 30)

def message(msg, color):

    mesg = arialFont.render(msg, True, color)

    textRect = mesg.get_rect()

    textRect.center = (300, 200)

    screen.blit(mesg, textRect)

  • Khai báo biến xác định thua game
  • Khi thua game bấm phím cách để chơi lại

game_close = False

while True:

    while game_close == True:

        screen.fill(BLUE)

        message("Thua rui! Bam phim cach choi lai", RED)

        pygame.display.update()

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                sys.exit()

            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_SPACE:

                    game_close = False

                    snake_list = []

                    snake_length = 1

                    x_head = 300

                    y_head = 200

2.9. Ghi nhận điểm số

Ở bước cuối cùng, bạn cần lập trình ghi nhận điểm số của người chơi trên màn hình. Số điểm mà người chơi đạt được chính là độ dài của rắn. Như vậy, chúng ta sẽ sử dụng các câu lệnh sau:

def show_score(score):

    value = arialFont.render("Score: " + str(score), True, BLACK)

    screen.blit(value, [0, 0])

3. Lời Kết

Như vậy, ICANTECH đã hướng dẫn bạn chi tiết các bước code game rắn săn mồi Python. Hi vọng các bạn sẽ áp dụng thành công những kiến thức ở trên để sáng tạo trò chơi rắn săn mồi của riêng mình. 

Ngoài ra nếu bạn đang quan tâm đến học lập trình game trên Python thì hãy tham khảo ngay khóa học lập trình Python Code Combat tại ICANTECH nha !

Nguồn ảnh: ICANTECH. 

Share
Tags
Code mẫu Python

Bài tương tự