用python写一个2048游戏
时间: 2023-12-22 07:05:38 浏览: 29
可以使用Python语言和Pygame库来编写2048游戏。以下是一个基本的示例代码:
```python
import pygame
import random
# 游戏面板尺寸
SCREEN_SIZE = [400, 400]
# 方格大小
BOX_SIZE = 100
# 方格颜色
COLORS = {
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)
}
# 初始化游戏面板
def init_board():
board = [[0 for i in range(4)] for j in range(4)]
add_random_box(board)
add_random_box(board)
return board
# 随机添加方块
def add_random_box(board):
empty_tiles = [(row, col) for row in range(4) for col in range(4) if board[row][col] == 0]
if empty_tiles:
row, col = random.choice(empty_tiles)
board[row][col] = 2 if random.random() < 0.9 else 4
# 移动方块
def move_boxes(board, dx, dy):
for row in range(4):
lst = [board[row][col] for col in range(4)]
lst = slide_and_merge(lst, dx)
for col in range(4):
board[row][col] = lst[col]
for col in range(4):
lst = [board[row][col] for row in range(4)]
lst = slide_and_merge(lst, dy)
for row in range(4):
board[row][col] = lst[row]
# 合并相同方块
def slide_and_merge(lst, direction):
if direction == 1: # 向右或向下
lst = lst[::-1]
i = 3
while i > 0:
if lst[i] == lst[i-1] and lst[i] != 0:
lst[i] *= 2
lst[i-1] = 0
i -= 1
i = 3
new_lst = [0, 0, 0, 0]
for val in lst:
if val != 0:
new_lst[i] = val
i -= 1
if direction == 1:
new_lst = new_lst[::-1]
return new_lst
# 游戏是否结束
def is_game_over(board):
for row in range(4):
for col in range(4):
if board[row][col] == 0:
return False
if col < 3 and board[row][col] == board[row][col+1]:
return False
if row < 3 and board[row][col] == board[row+1][col]:
return False
return True
# 显示游戏面板
def draw_board(board, screen):
font = pygame.font.Font(None, 64)
for row in range(4):
for col in range(4):
rect = pygame.Rect(col*BOX_SIZE, row*BOX_SIZE, BOX_SIZE, BOX_SIZE)
color = COLORS[board[row][col]]
pygame.draw.rect(screen, color, rect)
if board[row][col] != 0:
text = font.render(str(board[row][col]), 1, (255, 255, 255))
textpos = text.get_rect(center=rect.center)
screen.blit(text, textpos)
# 主程序
def main():
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("2048")
board = init_board()
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
move_boxes(board, -1, 0)
elif event.key == pygame.K_RIGHT:
move_boxes(board, 1, 0)
elif event.key == pygame.K_UP:
move_boxes(board, 0, -1)
elif event.key == pygame.K_DOWN:
move_boxes(board, 0, 1)
add_random_box(board)
if is_game_over(board):
game_over = True
screen.fill((187, 173, 160))
draw_board(board, screen)
pygame.display.flip()
pygame.quit()
if __name__ == "__main__":
main()
```
需要先安装Pygame库,然后执行代码即可开始游戏。可使用箭头键来移动方块,合并相同数字的方块,当没有空位时或者无法继续移动时游戏结束。