Python程序实现2048小游戏

以下是一个简单的 2048 游戏示例代码:
import pygame
import random

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (128, 128, 128)

# 屏幕尺寸
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400

# 方格大小
GRID_SIZE = 100

# 初始化 pygame
pygame.init()

# 创建屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("2048 游戏")

# 游戏网格
grid = [[0 for _ in range(4)] for _ in range(4)]

# 生成新数字
def generate_number():
    empty_cells = []
    for row in range(4):
        for col in range(4):
            if grid[row][col] == 0:
                empty_cells.append((row, col))
    if empty_cells:
        row, col = random.choice(empty_cells)
        grid[row][col] = 2 if random.random() < 0.9 else 4

# 检查是否可以移动
def can_move(direction):
    for row in range(4):
        for col in range(4):
            target_row, target_col = row, col
            if direction == "up":
                target_row -= 1
            elif direction == "down":
                target_row += 1
            elif direction == "left":
                target_col -= 1
            elif direction == "right":
                target_col += 1

            if target_row < 0 or target_row >= 4 or target_col < 0 or target_col >= 4:
                continue

            if grid[row][col] and grid[target_row][target_col] == grid[row][col]:
                return True
    return False

# 执行移动
def move(direction):
    moved = False
    if direction == "up":
        for col in range(4):
            merged = False
            for row in range(1, 4):
                if grid[row][col]!= 0:
                    for target_row in range(row - 1, -1, -1):
                        if grid[target_row][col] == 0:
                            grid[target_row][col] = grid[row][col]
                            grid[row][col] = 0
                            moved = True
                        elif grid[target_row][col] == grid[row][col] and not merged:
                            grid[target_row][col] *= 2
                            grid[row][col] = 0
                            merged = True
                            moved = True
                            break
    elif direction == "down":
        for col in range(4):
            merged = False
            for row in range(2, -1, -1):
                if grid[row][col]!= 0:
                    for target_row in range(row + 1, 4):
                        if grid[target_row][col] == 0:
                            grid[target_row][col] = grid[row][col]
                            grid[row][col] = 0
                            moved = True
                        elif grid[target_row][col] == grid[row][col] and not merged:
                            grid[target_row][col] *= 2
                            grid[row][col] = 0
                            merged = True
                            moved = True
                            break
    elif direction == "left":
        for row in range(4):
            merged = False
            for col in range(1, 4):
                if grid[row][col]!= 0:
                    for target_col in range(col - 1, -1, -1):
                        if grid[row][target_col] == 0:
                            grid[row][target_col] = grid[row][col]
                            grid[row][col] = 0
                            moved = True
                        elif grid[row][target_col] == grid[row][col] and not merged:
                            grid[row][target_col] *= 2
                            grid[row][col] = 0
                            merged = True
                            moved = True
                            break
    elif direction == "right":
        for row in range(4):
            merged = False
            for col in range(2, -1, -1):
                if grid[row][col]!= 0:
                    for target_col in range(col + 1, 4):
                        if grid[row][target_col] == 0:
                            grid[row][target_col] = grid[row][col]
                            grid[row][col] = 0
                            moved = True
                        elif grid[row][target_col] == grid[row][col] and not merged:
                            grid[row][target_col] *= 2
                            grid[row][col] = 0
                            merged = True
                            moved = True
                            break

    if moved:
        generate_number()

# 绘制网格
def draw_grid():
    for row in range(4):
        for col in range(4):
            pygame.draw.rect(screen, GRAY, [col * GRID_SIZE, row * GRID_SIZE, GRID_SIZE, GRID_SIZE], 1)
            if grid[row][col]!= 0:
                font = pygame.font.SysFont(None, 48)
                text = font.render(str(grid[row][col]), 1, WHITE)
                text_rect = text.get_rect(center=(col * GRID_SIZE + GRID_SIZE // 2, row * GRID_SIZE + GRID_SIZE // 2))
                screen.blit(text, text_rect)

# 游戏主循环
clock = pygame.time.Clock()
generate_number()
generate_number()

game_over = False
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        if can_move("up"):
            move("up")
    elif keys[pygame.K_DOWN]:
        if can_move("down"):
            move("down")
    elif keys[pygame.K_LEFT]:
        if can_move("left"):
            move("left")
    elif keys[pygame.K_RIGHT]:
        if can_move("right"):
            move("right")

    screen.fill(BLACK)
    draw_grid()

    pygame.display.flip()
    clock.tick(10)

# 退出程序
pygame.quit()
代码解释:

• grid 表示游戏网格,存储数字。

• generate_number 函数用于生成新的数字(2 或 4)到网格中。

• can_move 函数检查指定方向是否可以移动。

• move 函数根据方向执行移动操作,包括数字的移动和合并。

• draw_grid 函数绘制网格和数字。

• 在主循环中,处理事件,根据按键判断是否可以移动并执行移动操作,然后绘制画面。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍如何用 Python 编写 2048 小游戏2048 是一款基于滑动方块的数字游戏,玩家需要通过滑动4x4的方格,使得相同数字的方块相加,最终得到2048方块。 首先,需要安装 pygame 模块,可以使用以下命令进行安装: ```python pip install pygame ``` 然后,创建一个名为 `game.py` 的 Python 文件,并在其中编写以下代码: ```python import pygame import random # 设置游戏界面大小 WIDTH = 400 HEIGHT = 400 # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) GRAY = (128, 128, 128) RED = (255, 0, 0) # 初始化 Pygame pygame.init() # 创建游戏界面 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("2048 Game") # 设置字体 font = pygame.font.SysFont("Arial", 32, bold=True) # 定义游戏数据 board = [[0] * 4 for _ in range(4)] score = 0 # 随机生成一个新方块 def new_block(): x = random.randint(0, 3) y = random.randint(0, 3) while board[x][y] != 0: x = random.randint(0, 3) y = random.randint(0, 3) board[x][y] = 2 if random.random() < 0.9 else 4 # 绘制游戏界面 def draw_board(): screen.fill(WHITE) for i in range(4): for j in range(4): pygame.draw.rect(screen, BLACK, (10 + j * 90, 10 + i * 90, 80, 80), 0) if board[i][j] != 0: text = font.render(str(board[i][j]), True, BLACK) screen.blit(text, (45 + j * 90 - text.get_width() // 2, 45 + i * 90 - text.get_height() // 2)) pygame.display.update() # 判断游戏是否结束 def is_gameover(): for i in range(4): for j in range(4): if board[i][j] == 0: return False if j < 3 and board[i][j] == board[i][j+1]: return False if i < 3 and board[i][j] == board[i+1][j]: return False return True # 处理游戏事件 def handle_events(): global score for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: for j in range(4): for i in range(1, 4): if board[i][j] != 0: k = i while k > 0 and board[k-1][j] == 0: k -= 1 if k > 0 and board[k-1][j] == board[i][j]: board[k-1][j] *= 2 score += board[k-1][j] board[i][j] = 0 elif k != i: board[k][j] = board[i][j] board[i][j] = 0 new_block() elif event.key == pygame.K_DOWN: for j in range(4): for i in range(2, -1, -1): if board[i][j] != 0: k = i while k < 3 and board[k+1][j] == 0: k += 1 if k < 3 and board[k+1][j] == board[i][j]: board[k+1][j] *= 2 score += board[k+1][j] board[i][j] = 0 elif k != i: board[k][j] = board[i][j] board[i][j] = 0 new_block() elif event.key == pygame.K_LEFT: for i in range(4): for j in range(1, 4): if board[i][j] != 0: k = j while k > 0 and board[i][k-1] == 0: k -= 1 if k > 0 and board[i][k-1] == board[i][j]: board[i][k-1] *= 2 score += board[i][k-1] board[i][j] = 0 elif k != j: board[i][k] = board[i][j] board[i][j] = 0 new_block() elif event.key == pygame.K_RIGHT: for i in range(4): for j in range(2, -1, -1): if board[i][j] != 0: k = j while k < 3 and board[i][k+1] == 0: k += 1 if k < 3 and board[i][k+1] == board[i][j]: board[i][k+1] *= 2 score += board[i][k+1] board[i][j] = 0 elif k != j: board[i][k] = board[i][j] board[i][j] = 0 new_block() # 显示游戏结束界面 def show_gameover(): gameover_text = font.render("Game Over", True, RED) gameover_rect = gameover_text.get_rect() gameover_rect.center = (WIDTH // 2, HEIGHT // 2) screen.blit(gameover_text, gameover_rect) pygame.display.update() # 主循环 def main(): global score # 初始化游戏数据 new_block() new_block() draw_board() # 游戏循环 while True: handle_events() draw_board() if is_gameover(): show_gameover() break # 显示最终得分 score_text = font.render("Score: " + str(score), True, BLACK) score_rect = score_text.get_rect() score_rect.center = (WIDTH // 2, HEIGHT // 2 + 40) screen.blit(score_text, score_rect) pygame.display.update() # 等待退出 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 启动游戏 if __name__ == "__main__": main() ``` 这个程序采用了 Pygame 模块来实现游戏界面的绘制和事件处理。其中,`board` 列表存储了游戏数据,`score` 变量存储了当前得分。`new_block` 函数用于在空闲的方格中随机生成新的方块。`draw_board` 函数用于绘制游戏界面,`is_gameover` 函数用于判断游戏是否结束,`handle_events` 函数用于处理游戏事件,`show_gameover` 函数用于显示游戏结束界面,`main` 函数是游戏的主循环。 您可以运行这个程序,即可开始玩 2048 小游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值