当前位置: 首页 > article >正文

【python写个可以运行的2048小游戏】

写一个完整的2048小游戏在Python中是一个相对复杂的任务,因为它涉及到用户界面、事件处理、游戏逻辑等多个方面。为了简化这个过程,我们可以使用Python的图形库,比如pygame。下面是一个简单的2048游戏的实现。

首先,确保你已经安装了pygame库。如果没有安装,可以使用以下命令安装:

pip install pygame

然后,你可以使用以下代码来创建一个简单的2048游戏:

import pygame
import random
import sys

# 初始化pygame
pygame.init()

# 常量定义
TILE_SIZE = 60
GRID_SIZE = 4
WINDOW_SIZE = GRID_SIZE * TILE_SIZE
FPS = 15
FONT_SIZE = 30
BG_COLOR = (235, 235, 235)
TILE_COLORS = [(255, 255, 255, 0), (238, 228, 218), (237, 224, 200), (242, 177, 121),
               (245, 149, 99), (246, 124, 95), (246, 94, 59), (237, 207, 114),
               (237, 201, 81), (234, 153, 81), (226, 112, 61), (235, 69, 69),
               (189, 54, 51)]

# 初始化游戏板
def initialize_grid():
    grid = [[0] * GRID_SIZE for _ in range(GRID_SIZE)]
    add_new_tile()
    add_new_tile()
    return grid

# 添加新瓦片
def add_new_tile():
    empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if grid[i][j] == 0]
    if empty_cells:
        i, j = random.choice(empty_cells)
        grid[i][j] = 4 if random.random() < 0.9 else 2

# 合并瓦片
def merge_tiles(grid):
    merged = False
    for i in range(GRID_SIZE):
        new_row = []
        for j in range(GRID_SIZE):
            if j < GRID_SIZE - 1 and grid[i][j] == grid[i][j + 1] and grid[i][j] != 0:
                new_row.append(grid[i][j] * 2)
                grid[i][j + 1] = 0
                merged = True
            else:
                new_row.append(grid[i][j])
        while len(new_row) < GRID_SIZE:
            new_row.append(0)
        grid[i] = new_row
    return merged

# 滑动瓦片(向左)
def slide_left(grid):
    for i in range(GRID_SIZE):
        new_row = [val for val in grid[i] if val != 0]
        while len(new_row) < GRID_SIZE:
            new_row.append(0)
        grid[i] = new_row
    return True

# 游戏主逻辑
def main_logic(grid):
    merged = False
    # 向左滑动
    if slide_left(grid):
        merged = merge_tiles(grid) or merged
    # 向下滑动(通过转置矩阵)
    grid_T = list(zip(*grid))
    if slide_left(grid_T):
        merged = merge_tiles(list(zip(*grid_T))) or merged
        grid = list(zip(*grid_T))
    # 向右滑动(通过翻转矩阵然后向左滑动)
    grid_reversed = [row[::-1] for row in grid]
    if slide_left(grid_reversed):
        merged = merge_tiles(list(map(list, zip(*grid_reversed[::-1])))) or merged
        grid = [row[::-1] for row in list(zip(*grid_reversed[::-1]))]
    # 向上滑动(通过转置、翻转、再向左滑动)
    grid_T_reversed = [row[::-1] for row in grid_T]
    if slide_left(grid_T_reversed):
        merged = merge_tiles(list(zip(*grid_T_reversed[::-1]))) or merged
        grid_T = list(zip(*grid_T_reversed[::-1]))
        grid = list(zip(*grid_T))
    if merged:
        add_new_tile()
    return grid

# 绘制游戏板
def draw_grid(screen, grid):
    for i in range(GRID_SIZE):
        for j in range(GRID_SIZE):
            value = grid[i][j]
            color = TILE_COLORS[value] if value > 0 else (255, 255, 255, 0)
            pygame.draw.rect(screen, color, (j * TILE_SIZE, i * TILE_SIZE, TILE_SIZE, TILE_SIZE))
            if value > 0:
                font = pygame.font.Font(None, FONT_SIZE)
                text = font.render(str(value), True, (0, 0, 0))
                text_rect = text.get_rect(center=(j * TILE_SIZE + TILE_SIZE // 2, i * TILE_SIZE + TILE_SIZE // 2))
                screen.blit(text, text_rect)

# 主游戏循环
def main():
    screen = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
    pygame.display.set_caption('2048')
    clock = pygame.time.Clock()
    grid = initialize_grid()

    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 in (pygame.K_LEFT, pygame.K_a):
                    grid = main_logic([row[::-1] for row in grid][::-1])
                elif event.key in (pygame.K_RIGHT, pygame.K_d):
                    grid = main_logic(grid)
                elif event.key in (pygame.K_UP, pygame.K_w):
                    grid = main_logic(list(zip(*grid))[::-1])
                elif event.key in (pygame.K_DOWN, pygame.K_s):
                    grid = main_logic(list(zip(*grid)))

        screen.fill(BG_COLOR)
        draw_grid(screen, grid)
        pygame.display.flip()
        clock.tick(FPS)

if __name__ == "__main__":
    main()

这个代码实现了一个基本的2048游戏,包括:

  • 初始化游戏板并添加两个随机瓦片。
  • 处理用户输入(方向键或WASD键)以滑动瓦片。
  • 合并相同瓦片并生成新的瓦片。
  • 使用pygame绘制游戏板和瓦片。

你可以运行这个代码,并使用方向键或WASD键来移动瓦片。希望这个示例能够帮助你理解如何实现2048游戏!


http://www.kler.cn/a/517185.html

相关文章:

  • 分布式存储的技术选型之HDFS、Ceph、MinIO对比
  • css之多边形 clip-path
  • 使用Visual Studio Code配置C/C++开发环境的全面指南
  • 计算机网络三张表(ARP表、MAC表、路由表)总结
  • MATLAB中alphanumericsPattern函数用法
  • windows下部署安装 ELK,nginx,tomcat日志分析
  • 利用Java爬虫获取eBay商品详情:代码示例与教程
  • 解锁跨平台通信:Netty、Redis、MQ和WebSocket的奇妙融合
  • snippets router pinia axios mock
  • 【整理】js逆向工程
  • linux如何修改密码,要在CentOS 7系统中修改密码
  • 【Uniapp-Vue3】页面和路由API-navigateTo及页面栈getCurrentPages
  • VSCode+Continue实现AI辅助编程
  • 数据表中的数据查询
  • Chromium 132 编译指南 Mac 篇(六)- 编译优化技巧
  • Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)
  • Android笔记:android 动态设置backgroundTint
  • 【多视图学习】显式视图-标签问题:多视图聚类的多方面互补性研究
  • 1、ceph的安装——方式一ceph-ansible
  • 搜狐Android开发(安卓)面试题及参考答案