Untitled

 avatar
unknown
plain_text
5 months ago
3.3 kB
9
Indexable
import pygame
import random
import time

# Initialize pygame
pygame.init()

# Set up screen dimensions and colors
WIDTH, HEIGHT = 400, 400
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
GREEN = (0, 255, 0)
FONT = pygame.font.SysFont('Arial', 30)

# Define grid properties
GRID_SIZE = 4  # 4x4 grid (15-puzzle)
TILE_SIZE = WIDTH // GRID_SIZE
FPS = 30  # Frames per second

# Create the screen object
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Sliding Puzzle Game")

# Generate the initial puzzle grid
def generate_puzzle():
    numbers = list(range(1, GRID_SIZE**2))
    numbers.append(None)  # Empty space
    random.shuffle(numbers)
    return [numbers[i:i + GRID_SIZE] for i in range(0, len(numbers), GRID_SIZE)]

# Draw the grid and tiles
def draw_grid(grid):
    screen.fill(WHITE)
    for y in range(GRID_SIZE):
        for x in range(GRID_SIZE):
            number = grid[y][x]
            rect = pygame.Rect(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE)
            pygame.draw.rect(screen, GRAY, rect)
            pygame.draw.rect(screen, BLACK, rect, 3)
            if number:
                text = FONT.render(str(number), True, BLACK)
                text_rect = text.get_rect(center=rect.center)
                screen.blit(text, text_rect)
            else:
                pygame.draw.rect(screen, WHITE, rect)

# Find the empty space (None)
def find_empty_space(grid):
    for y in range(GRID_SIZE):
        for x in range(GRID_SIZE):
            if grid[y][x] is None:
                return x, y
    return None

# Check if the puzzle is solved
def is_solved(grid):
    num = 1
    for y in range(GRID_SIZE):
        for x in range(GRID_SIZE):
            if y == GRID_SIZE - 1 and x == GRID_SIZE - 1:
                if grid[y][x] is not None:
                    return False
            elif grid[y][x] != num:
                return False
            num += 1
    return True

# Handle tile movement (swap with empty space)
def move_tile(grid, x, y):
    empty_x, empty_y = find_empty_space(grid)

    # Check if the move is valid (tiles are adjacent)
    if (abs(x - empty_x) == 1 and y == empty_y) or (abs(y - empty_y) == 1 and x == empty_x):
        # Swap the tile with the empty space
        grid[empty_y][empty_x], grid[y][x] = grid[y][x], grid[empty_y][empty_x]

# Main game loop
def main():
    grid = generate_puzzle()
    clock = pygame.time.Clock()
    running = True
    start_time = time.time()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x, mouse_y = pygame.mouse.get_pos()
                grid_x = mouse_x // TILE_SIZE
                grid_y = mouse_y // TILE_SIZE
                move_tile(grid, grid_x, grid_y)

        draw_grid(grid)

        # Check if the puzzle is solved
        if is_solved(grid):
            elapsed_time = time.time() - start_time
            solved_text = FONT.render(f"Solved! Time: {int(elapsed_time)}s", True, GREEN)
            screen.blit(solved_text, (10, HEIGHT - 40))

        pygame.display.flip()
        clock.tick(FPS)

    pygame.quit()

if __name__ == "__main__":
    main()
Editor is loading...
Leave a Comment