Python2048 小游戏代码:从零开始打造经典数字拼图游戏

2048 游戏自诞生以来便风靡全球,其简单的规则与无限的可玩性让无数玩家沉迷。本文将带您了解如何用 Python 和 Pygame 库从零开发一款属于自己的 2048 小游戏,包含核心代码解析、游戏设计思路及优化建议,适合 Python 初学者作为实战项目参考。

一、开发准备:环境与工具

开发 2048 游戏需要以下环境和工具:

  • 编程语言:Python 3.7+(项目中使用的版本)
  • 游戏库:Pygame(用于图形界面和交互控制)
  • 开发工具:任何 Python IDE(如 PyCharm,项目中包含.idea 配置文件)

安装 Pygame 库的命令:

pip install pygame

二、游戏核心逻辑解析

2048 游戏的核心机制包括棋盘初始化数字移动合并新数字生成游戏结束判断,下面逐一解析关键代码实现。

1. 棋盘初始化

游戏开始时需要创建一个 4×4 的空棋盘(用二维列表表示),并随机生成初始数字(2 或 4):

def get_newboard():
    # 创建4x4的空棋盘,0表示空位
    newboard = []
    for y in range(boardsize):
        newboard.append([])
        for x in range(boardsize):
            newboard.append(0)
    return newboard

# 初始化棋盘并生成第一个数字
board = get_newboard()
randnum = random.randint(1, 2) * 2  # 随机生成2或4
randx = random.randint(0, boardsize - 1)
randy = random.randint(0, boardsize - 1)
board[randy][randx] = randnum

2. 数字移动与合并(以向上移动为例)

当玩家按下方向键时,数字需要向对应方向移动,相同数字碰撞时会合并并翻倍,这是游戏最核心的逻辑:

def move_allnum(board, direction):
    moved = False  # 标记是否有数字移动
    if direction == 1:  # 向上移动(对应方向键↑或W键)
        for x in range(boardsize):  # 按列处理
            added = False  # 标记当前列是否已合并过
            for y in range(boardsize):  # 从下往上遍历单元格
                if board[y][x] != 0:  # 遇到非空数字
                    # 向上寻找可合并或可移动的位置
                    for yy in range(y-1, -1, -1):
                        # 相同数字且未合并过,执行合并
                        if board[yy][x] == board[y][x] and added == False:
                            board[yy][x] *= 2  # 数字翻倍
                            board[y][x] = 0  # 原位置置空
                            score += board[yy][x]  # 更新分数
                            moved = True
                            added = True  # 同一轮中不可再次合并
                            break
                        # 遇到不同数字或已合并过,移动到前方位置
                        if (board[yy][x] != board[y][x] and board[yy][x] != 0) or added:
                            if yy + 1 != y:  # 位置不同才需要移动
                                board[yy+1][x] = board[y][x]
                                board[y][x] = 0
                                moved = True
                            break
    return moved

3. 新数字生成

每次有效移动后,需要在空位随机生成一个新的数字(2 或 4):

def add_newnum(board, direction):
    randnum = random.randint(1, 2) * 2  # 2或4
    if direction == 1:  # 向上移动后,新数字从底部生成
        optionalcolumns = []
        # 收集底部有空位的列
        for x in range(boardsize):
            if board[boardsize-1][x] == 0:
                optionalcolumns.append(x)
        chosecolumn = random.choice(optionalcolumns)
        # 在选中列的最上方空位生成数字
        for y in range(boardsize):
            if board[y][chosecolumn] == 0:
                board[y][chosecolumn] = randnum
                break

4. 游戏结束判断

当棋盘被数字填满且无法继续合并时,游戏结束:

def is_gameover():
    # 检查是否有空位
    for y in range(boardsize):
        for x in range(boardsize):
            if board[y][x] == 0:
                return False
    # 此处可补充检查相邻数字是否可合并的逻辑
    return True

三、界面设计与交互

游戏界面通过 Pygame 实现,包括棋盘绘制分数显示键盘交互

# 初始化Pygame
pygame.init()
screen = pygame.display.set_mode((winwidth, winheight))
pygame.display.set_caption('2048')

# 绘制数字方块
def draw_block(x, y):
    blockrect = pygame.Rect(
        margin_x + x*blocksize + 1,
        margin_y + y*blocksize + 1,
        blocksize - 2,
        blocksize - 2
    )
    # 绘制方块背景(不同数字可设置不同颜色)
    pygame.draw.rect(screen, (205, 79, 57 + board[y][x]), blockrect)
    # 绘制数字
    numfontsurface = numfont.render(str(board[y][x]), True, black)
    numfontrect = numfontsurface.get_rect(center=blockrect.center)
    screen.blit(numfontsurface, numfontrect)

键盘交互支持方向键(↑↓←→)和 WSAD 键控制,通过监听KEYDOWN事件实现:

if event.type == KEYDOWN:
    if event.key == K_UP or event.key == K_w:
        direction = 1  # 向上
        ismoved = move_allnum(board, direction)
        if ismoved:
            add_newnum(board, direction)  # 移动有效时生成新数字

四、功能扩展与优化建议

  1. 视觉优化:为不同数字设置独特颜色(如 2 = 浅黄色、4 = 浅橙色、8 = 红色等),提升游戏体验。
  2. 分数系统:记录当前分数和历史最高分,并在游戏结束时显示。
  3. 动画效果:为数字移动和合并添加过渡动画,增强视觉反馈。
  4. 难度调整:支持自定义棋盘大小(如 5×5),增加游戏挑战性。
  5. 存档功能:使用文件存储游戏进度,支持暂停和继续游戏。

五、总结

通过 Python 和 Pygame 开发 2048 游戏,不仅能深入理解二维列表操作、事件监听等编程概念,还能掌握游戏开发的基本思路。本文提供的代码框架可直接运行,您可以在此基础上根据需求进行扩展,打造个性化的 2048 游戏。

如果您对代码有任何疑问或优化建议,欢迎在评论区留言交流!

完整代码我放下方了,评论即可查看

允许main.py文件即可出现

图片[1]-Python2048 小游戏代码:从零开始打造经典数字拼图游戏
本站代码模板仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容