用Python制作经典的2048游戏

2048是一款简单而又富有挑战性的益智游戏,玩家通过移动数字方块来合并相同的数字,最终目标是达到2048这一数字。今天,我们将通过Python编程来制作一个简单版本的2048游戏,让大家在动手实践中理解游戏的逻辑。

游戏规则简介

  1. 游戏在一个4x4的方格中进行。
  2. 每次移动时,相同数字的方块会合并成一个新数字(例如,2+2=4)。
  3. 玩家可以通过上下左右的方向键控制数字的移动。
  4. 每次移动后,随机生成一个新的数字(通常是2或者4)。

环境准备

首先,确保你已经安装了Python环境。我们将使用pygame库来实现图形界面。可以通过以下命令安装pygame

pip install pygame

游戏代码

下面是一个基本的2048游戏的实现代码:

import random
import pygame
import sys

# 定义常量
WIDTH, HEIGHT = 400, 400
GRID_SIZE = 4
GRID_PADDING = 10
BACKGROUND_COLOR = (187, 173, 160)
TILE_COLOR = {
    0: (205, 193, 180),
    2: (238, 228, 218),
    4: (237, 224, 200),
    8: (242, 177, 121),
    16: (245, 149, 99),
    32: (246, 124, 95),
    64: (246, 94, 59),
    128: (237, 207, 114),
    256: (237, 204, 97),
    512: (237, 200, 80),
    1024: (237, 197, 63),
    2048: (237, 194, 46),
}

# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2048 游戏")
font = pygame.font.Font(None, 55)


class Game2048:
    def __init__(self):
        self.grid = [[0]*GRID_SIZE for _ in range(GRID_SIZE)]
        self.add_new_tile()
        self.add_new_tile()

    def add_new_tile(self):
        empty_tiles = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if self.grid[i][j] == 0]
        if empty_tiles:
            i, j = random.choice(empty_tiles)
            self.grid[i][j] = 4 if random.random() > 0.9 else 2

    def draw_grid(self):
        screen.fill(BACKGROUND_COLOR)
        for i in range(GRID_SIZE):
            for j in range(GRID_SIZE):
                tile_value = self.grid[i][j]
                tile_color = TILE_COLOR[tile_value]
                pygame.draw.rect(screen, tile_color, (j * 100 + GRID_PADDING, i * 100 + GRID_PADDING, 100 - GRID_PADDING, 100 - GRID_PADDING))
                if tile_value != 0:
                    tile_surface = font.render(str(tile_value), True, (0, 0, 0))
                    screen.blit(tile_surface, (j * 100 + GRID_PADDING + 30, i * 100 + GRID_PADDING + 20))

    def compress(self):
        new_grid = [[0] * GRID_SIZE for _ in range(GRID_SIZE)]
        for i in range(GRID_SIZE):
            pos = 0
            for j in range(GRID_SIZE):
                if self.grid[i][j] != 0:
                    new_grid[i][pos] = self.grid[i][j]
                    pos += 1
        self.grid = new_grid

    def merge(self):
        for i in range(GRID_SIZE):
            for j in range(GRID_SIZE - 1):
                if self.grid[i][j] == self.grid[i][j + 1] and self.grid[i][j] != 0:
                    self.grid[i][j] *= 2
                    self.grid[i][j + 1] = 0

    def move_left(self):
        self.compress()
        self.merge()
        self.compress()
        self.add_new_tile()

    def move_right(self):
        self.grid = [row[::-1] for row in self.grid]
        self.move_left()
        self.grid = [row[::-1] for row in self.grid]

    def move_up(self):
        self.grid = [list(row) for row in zip(*self.grid)]
        self.move_left()
        self.grid = [list(row) for row in zip(*self.grid)]

    def move_down(self):
        self.grid = [list(row) for row in zip(*self.grid)]
        self.move_right()
        self.grid = [list(row) for row in zip(*self.grid)]

def main():
    game = Game2048()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    game.move_left()
                elif event.key == pygame.K_RIGHT:
                    game.move_right()
                elif event.key == pygame.K_UP:
                    game.move_up()
                elif event.key == pygame.K_DOWN:
                    game.move_down()

        game.draw_grid()
        pygame.display.update()


if __name__ == "__main__":
    main()

如何运行

将上述代码保存在一个Python文件中(例如2048.py),然后在终端中运行:

python 2048.py

控制说明

  • 使用键盘的方向键来控制方块的移动和合并。

可能的改进

本示例是一个简单的2104游戏实现,未来可以添加更多的功能,比如:

  • 游戏结束检测
  • 实现撤回功能
  • 记录最高分数
  • 增加音效和动画

结尾

希望通过这次的文章,你能对2048游戏的实现有更深入的理解。编写代码的过程不仅是实现功能的一种方式,更是学习和探索的旅程。祝你在学习Python的过程中顺利前行!如果你希望更系统地学习编程,欢迎关注文末赠书的相关信息,获取更多学习资源。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部