使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。

准备工作

在开始之前,请确保已安装Pygame库。可以通过以下命令安装:

pip install pygame

游戏设计

我们的游戏将包括以下几个部分:

  1. 初始化Pygame:设置游戏窗口和基本参数。
  2. 创建网格:生成一个随机颜色的方块网格。
  3. 实现交换和消除功能:允许玩家点击交换方块,并检测和消除匹配的方块。
  4. 更新游戏状态:处理方块下落和新方块生成。
  5. 显示分数:记录玩家的得分。

代码实现

以下是完整的代码实现:

import pygame
import random
import time

# 初始化Pygame
pygame.init()

# 设置屏幕大小
screen_width, screen_height = 600, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("消消乐")

# 定义颜色
COLORS = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 165, 0)]
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# 定义网格大小
GRID_SIZE = 8
BLOCK_SIZE = screen_width // GRID_SIZE

# 创建网格
grid = [[random.choice(COLORS) for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]

# 选中的方块
selected = None

def draw_grid():
    for row in range(GRID_SIZE):
        for col in range(GRID_SIZE):
            # 绘制方块
            pygame.draw.rect(screen, grid[row][col], 
                           (col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE))
            # 绘制边框
            pygame.draw.rect(screen, BLACK, 
                           (col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 1)
            
    # 如果有方块被选中,绘制高亮边框
    if selected:
        row, col = selected
        pygame.draw.rect(screen, WHITE, 
                        (col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 3)

def get_clicked_pos(pos):
    x, y = pos
    return y // BLOCK_SIZE, x // BLOCK_SIZE

def is_adjacent(pos1, pos2):
    row1, col1 = pos1
    row2, col2 = pos2
    return abs(row1 - row2) + abs(col1 - col2) == 1

def check_matches():
    matches = set()
    
    # 检查水平匹配
    for row in range(GRID_SIZE):
        for col in range(GRID_SIZE-2):
            if (grid[row][col] == grid[row][col+1] == grid[row][col+2] and 
                grid[row][col] is not None):
                matches.update([(row, col), (row, col+1), (row, col+2)])
    
    # 检查垂直匹配
    for row in range(GRID_SIZE-2):
        for col in range(GRID_SIZE):
            if (grid[row][col] == grid[row+1][col] == grid[row+2][col] and 
                grid[row][col] is not None):
                matches.update([(row, col), (row+1, col), (row+2, col)])
    
    return matches

def remove_matches(matches):
    # 移除匹配的方块
    for row, col in matches:
        grid[row][col] = None
    
    # 方块下落
    for col in range(GRID_SIZE):
        empty_cells = []
        # 从下往上检查空格
        for row in range(GRID_SIZE-1, -1, -1):
            if grid[row][col] is None:
                empty_cells.append(row)
            elif empty_cells:
                # 将方块下移到最低的空位
                grid[empty_cells[0]][col] = grid[row][col]
                grid[row][col] = None
                empty_cells.pop(0)
                empty_cells.append(row)
        
        # 填充顶部空格
        for row in empty_cells:
            grid[row][col] = random.choice(COLORS)

def main():
    global selected
    running = True
    score = 0
    font = pygame.font.Font(None, 36)

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            
            elif event.type == pygame.MOUSEBUTTONDOWN:
                pos = get_clicked_pos(pygame.mouse.get_pos())
                if pos[0] < GRID_SIZE and pos[1] < GRID_SIZE:  # 确保点击在网格内
                    if selected is None:
                        selected = pos
                    else:
                        if is_adjacent(selected, pos):
                            # 交换方块
                            row1, col1 = selected
                            row2, col2 = pos
                            grid[row1][col1], grid[row2][col2] = grid[row2][col2], grid[row1][col1]
                            
                            # 检查是否有匹配
                            matches = check_matches()
                            if matches:
                                score += len(matches) * 10
                                remove_matches(matches)
                            else:
                                # 如果没有匹配,换回来
                                grid[row1][col1], grid[row2][col2] = grid[row2][col2], grid[row1][col1]
                        selected = None

        # 持续检查和消除匹配
        matches = check_matches()
        if matches:
            score += len(matches) * 10
            remove_matches(matches)
            pygame.time.wait(200)  # 添加短暂延迟使动画更流畅

        # 绘制游戏界面
        screen.fill(BLACK)
        draw_grid()
        
        # 显示分数
        score_text = font.render(f"分数: {score}", True, WHITE)
        screen.blit(score_text, (10, 10))
        
        pygame.display.flip()

    pygame.quit()

if __name__ == "__main__":
    main()

游戏玩法

  1. 选择方块:点击第一个方块选中它(会显示白色边框)。
  2. 交换方块:点击相邻的第二个方块进行交换。
  3. 消除匹配:如果形成三个或更多相同颜色的连续方块,它们会被消除。
  4. 方块下落:上方的方块会下落填充空缺,顶部会生成新的随机方块。
  5. 得分:每消除一个方块得10分。

结论

通过这篇博文,我们学习了如何使用Pygame创建一个简单的消消乐游戏。你可以在此基础上继续扩展功能,比如添加音效、特殊方块、关卡系统等。希望这能激发你对游戏开发的兴趣!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天进步2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值