【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游戏!