Cách triển khai tính năng lưu và tải trong PyGame

Học cách kết hợp tính năng lưu và tải tiến trình game cho trải nghiệm game liền mạch rất đơn giản. Dưới đây là hướng dẫn triển khai tính năng này trong PyGame.

Phát triển game

Trong phát triển game hiện đại, tính năng lưu & tải tiến trình game rất quan trọng, góp phần nâng cao trải nghiệm người dùng và tính hấp dẫn cho trò chơi. PyGame - một thư viện phổ biến trong sáng tạo game 2D bằng Python, cung cấp các công cụ cần thiết để triển khai tính năng lưu và tải dễ dàng.

Tạo game đơn giản

Trước khi bắt đầu, đảm bảo bạn đã cài pip trên thiết bị. Sau khi cài pip, chạy lệnh dưới đây để cài mô đun pygame:

pip install pygame

Để minh hoạ cách xây dựng hệ thống lưu và tải trong PyGame, bắt đầu bằng cách tạo một game đơn giản.

Trong game này, người chơi sẽ có khả năng di chuyển sang trái và phải. Đây là đoạn code mẫu thể hiện cấu trúc game cơ bản:

import pygame

# Khởi tạo Pygame
pygame.init()

# Thiết lập cửa sổ game
window_width = 800
window_height = 600
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("Save and Load System Tutorial")

# Các biến game
player_x = 400
player_y = 500
player_speed = 5

# Vòng lặp game
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_x -= player_speed
    if keys[pygame.K_RIGHT]:
        player_x += player_speed

    # Xóa màn hình
    window.fill((0, 0, 0))

    # Vẽ người chơi
    pygame.draw.rect(window, (255, 255, 255), (player_x, player_y, 50, 50))

    # Update màn hình
    pygame.display.flip()

# Thoát game
pygame.quit()

Quản lý trạng thái game và tính ổn định của dữ liệu

Trước khi tạo tính năng lưu và tải, bạn cần thiết lập một cách quản lý trạng thái game và ổn định dữ liệu. Một phương pháp tiếp cận phổ biến ở đây là dùng từ điển Python để lưu dữ liệu game liên quan. Đây là một ví dụ về cách bạn có thể chỉnh sửa code trước đó để bao gồm quản lý trạng thái game:

# Các biến game
game_state = {
    'player_x': 400,
    'player_y': 500
}

# Vòng lặp game
running = True
while running:
    # ...

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        game_state['player_x'] -= player_speed
    if keys[pygame.K_RIGHT]:
        game_state['player_x'] += player_speed

    # ...

    pygame.display.flip()

Xây dựng tính năng lưu và tải

Để kích hoạt tiến trình lưu và tải game, bạn có thể dùng mô đun pickle được tích hợp sẵn của Python, cho phép tuần tự hóa và giải tuần tự hóa các đối tượng Python. Tạo một file mới tên save-game.py và thêm code bằng những update bên dưới:

game_state = {
    'player_x': player_x,
    'player_y': player_y
}

# Lưu trạng thái game
def save_game_state(game_state, file_name):
    try:
        with open(file_name, 'wb') as file:
            pickle.dump(game_state, file)
            print("Game state saved successfully!")
    except IOError:
        print("Error: Unable to save game state.")

# Tải trạng thái game
def load_game_state(file_name):
    try:
        with open(file_name, 'rb') as file:
            game_state = pickle.load(file)
            print("Game state loaded successfully!")
            return game_state
    except (IOError, pickle.UnpicklingError):
        print("Error: Unable to load game state.")

# Vòng lặp game
running = True
while running:

    # ...

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_x -= player_speed
        game_state['player_x'] = player_x
    if keys[pygame.K_RIGHT]:
        player_x += player_speed
        game_state['player_x'] = player_x

    if keys[pygame.K_s]:
        save_game_state(game_state, 'save_game.pickle')
    if keys[pygame.K_l]:
        game_state = load_game_state('save_game.pickle')
        player_x = game_state['player_x']
    
    # ...

# ...

Kết quả:

Tạo lưu và tải PyGame

Thiết kế giao diện người dùng để lưu các vị trí

Để cung cấp giao diện lưu và tải, bạn có thể hiện các vị trí lưu, cho phép người chơi chọn tiến trình muốn lưu hoặc tải. Ở ví dụ này, các tùy chọn được hiện trong console nhưng bạn có thể dùng framework GUI của Python để tạo giao diện thân thiện người dùng hơn.

Tạo danh sách save_slots đại diện cho các vị trí lưu sẵn có. Ngoài ra, thêm biến selected_slot để theo dõi vị trí được người chơi lựa chọn.

Hiện các vị trí lưu có sẵn khi người chơi nhấn nút lưu (K_s). Người chơi có thể chọn một vị trí bằng cách nhấn phím số tương ứng (K_1, K_2 hoặc K_3). Nếu một vị trí được chọn, trạng thái game được lưu vào một file được đặt tên sau vị trí đã lưu.

Tương tự, khi người chơi nhấn nút tải (K_l), hiện các vị trí lưu. Người chơi có thể chọn một vị trí bằng cách nhấn phím số tương ứng (K_1, K_2, hoặc K_3). Nếu một vị trí được chọn, trạng thái game được lưu vào một file có tên theo vị trí đã chọn.

Tương tự, khi người chơi nhấn nút tải (K_l), hiện các vị trí lưu. Người chơi có thể chọn một vị trí bằng cách nhấn phím K_a, K_b, hoặc K_c để tải trạng thái game. Ngoài ra, bạn có thể dùng đầu vào cảm ứng thay vì input bàn phím cho vị trí chọn. Nếu chọn một vị trí, trạng thái game được tải từ file tương ứng.

Tạo một file tên interface.py và thêm code này với các update bên dưới:

# Các biến game
save_slots = ['Slot 1', 'Slot 2', 'Slot 3']
selected_slot = None

# Lặp game
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s:
                # Show save slots
                selected_slot = None
                for i, slot in enumerate(save_slots):
                    print(f"Save Slot {i+1}: {slot}")
                print("Choose a slot to save the game.")

            if event.key == pygame.K_l:
               print("Select Slot:- a - Slot 1 , b - Slot 3, c - Slot 3")
               # Show save slots
               selected_slot = None
                for i, slot in enumerate(save_slots):
                    print(f"Save Slot {i+1}: {slot}")
                print("Choose a slot to load the game.")

            if event.key in [pygame.K_1, pygame.K_2, pygame.K_3]:
                # Save or load game based on the selected slot
                slot_index = event.key - pygame.K_1
                selected_slot = save_slots[slot_index]
                
                save_game_state(game_state, f"{selected_slot}.pickle")
                print(f"Game saved in {selected_slot}!")

            if event.key in [pygame.K_a, pygame.K_b, pygame.K_c]:
               
               slot_index = event.key - pygame.K_a
               selected_slot = save_slots[slot_index]
               game_state = load_game_state(f"{selected_slot}.pickle")
               player_x = game_state['player_x']
               print(f"Game loaded from {selected_slot}!")
    # ...

    pygame.display.flip()

# ...

Kết quả:

Kết quả tạo lưu game

Xử lý các lựa chọn ghi đè

Để cung cấp các lựa chọn ghi đè những bản lưu hiện tại, bạn có thể tạo một cảnh báo nhắc người chơi xác nhận trước khi ghi đè file đã lưu. Tạo một file mới tên overwriting-save.py và chỉnh sửa code bằng những bản update bên dưới:

# Lưu trạng thái game
def save_game_state(game_state, file_name):
    if os.path.exists(file_name):
        # Prompt for confirmation to overwrite existing save file
        overwrite = input("Save file already exists. Do you want to overwrite? (y/n): ")
        if overwrite.lower() != 'y':
            print("Save cancelled.")
            return

    try:
        with open(file_name, 'wb') as file:
            pickle.dump(game_state, file)
            print("Game state saved successfully!")
    except IOError:
        print("Error: Unable to save game state.")

# ...

# Tải trạng thái game
def load_game_state(file_name):
    if not os.path.exists(file_name):
        print("Error: Save file does not exist.")
        return None

    try:
        with open(file_name, 'rb') as file:
            game_state = pickle.load(file)
            print("Game state loaded successfully!")
            return game_state
    except (IOError, pickle.UnpicklingError):
        print("Error: Unable to load game state.")
        return None

# ...

Ở code trên, trước khi lưu trạng thái game, bạn kiểm tra xem liệu file lưu đã tồn tại hay chưa bằng os.path.exists(). Nếu nó đã tồn tại, bạn nhắc người chơi xác nhận ghi đè file lưu hiện có. Nếu người chơi chọn không ghi đè, tác vụ lưu sẽ bị hủy.

Tương tự, trước khi tải trạng thái game, bạn kiểm tra xem liệu file lưu đã tồn tại hay chưa bằng os.path.exists(). Nếu nó chưa có, bạn thông báo lỗi cho người chơi.

Trên đây là cách tạo tính năng lưu và tải trong PyGame. Hi vọng bài viết hữu ích với các bạn.

Thứ Hai, 26/06/2023 16:32
51 👨 431
0 Bình luận
Sắp xếp theo