用Python制作经典的2048游戏
2048是一款简单而又富有挑战性的益智游戏,玩家通过移动数字方块来合并相同的数字,最终目标是达到2048这一数字。今天,我们将通过Python编程来制作一个简单版本的2048游戏,让大家在动手实践中理解游戏的逻辑。
游戏规则简介
- 游戏在一个4x4的方格中进行。
- 每次移动时,相同数字的方块会合并成一个新数字(例如,2+2=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的过程中顺利前行!如果你希望更系统地学习编程,欢迎关注文末赠书的相关信息,获取更多学习资源。