chatgpt写程序-python小游戏-2048-pygame

发布时间 2023-03-23 13:35:13作者: Brinshy

闲的没事,用chatpgt弄了个小游戏,2048,利用pygame实现,无额外贴图。

只需要告诉他写个python游戏2048,只用pygame实现,不要额外贴图。然后在他暂停后说请继续,最后会有一些bug,把报错告诉他,慢慢改,10分钟就可以完成。

效果如下图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

具体代码如下:

import pygame
import random

# 游戏界面的尺寸
WIDTH = 400
HEIGHT = 400

# 游戏界面的背景颜色
BACKGROUND_COLOR = (187, 173, 160)
TEXT_COLOR = (119, 110, 101)
GAME_OVER_COLOR = (0, 0, 0)

# 格子的尺寸和间距
CELL_SIZE = 80
CELL_MARGIN = 10
TILE_SIZE = 100
TILE_MARGIN = 10
GAME_OVER_FONT_SIZE = 72
SIZE = 500

# 数字方块的颜色和字体
TILE_COLORS = {
    0: (204, 192, 179),
    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),
    4096: (174, 207, 48)
}
pygame.font.init()
TILE_FONT = pygame.font.SysFont("Arial", 40, bold=True)


def draw_text(surface, text, color, x, y):
    """
    在指定位置绘制文本
    """
    text_surface = TILE_FONT.render(text, True, color)
    text_rect = text_surface.get_rect()
    text_rect.center = (x, y)
    surface.blit(text_surface, text_rect)


def draw_tile(surface, x, y, value):
    """
    在指定位置绘制数字方块
    """
    color = TILE_COLORS[value]
    pygame.draw.rect(surface, color, (x, y, CELL_SIZE, CELL_SIZE))
    if value != 0:
        text_color = (255, 255, 255) if value < 8 else (119, 110, 101)
        draw_text(surface, str(value), text_color, x + CELL_SIZE / 2, y + CELL_SIZE / 2)


def draw_board(surface, board):
    """
    绘制游戏界面上的数字方块
    """
    for row in range(4):
        for col in range(4):
            x = col * CELL_SIZE + (col + 1) * CELL_MARGIN
            y = row * CELL_SIZE + (row + 1) * CELL_MARGIN
            draw_tile(surface, x, y, board[row][col])


def generate_tile(board):
    """
    在空白格子中随机生成数字方块
    """
    available_cells = []
    for row in range(4):
        for col in range(4):
            if board[row][col] == 0:
                available_cells.append((row, col))
    if available_cells:
        row, col = random.choice(available_cells)
        board[row][col] = 2
        return True
    else:
        return False


def move_tiles(board, direction):
    """
    根据方向移动数字方块
    """
    moved = False
    if direction == "left":
        for row in range(4):
            for col in range(1, 4):
                if board[row][col] != 0:
                    for k in range(col):
                        if board[row][k] == 0 and no_obstacles(board, row, k, row, col):
                            board[row][k] = board[row][col]
                            board[row][col] = 0
                            moved = True
                            break
                        elif board[row][k] == board[row][col] and no_obstacles(board, row, k, row, col):
                            board[row][k] *= 2
                            board[row][col] = 0
                            moved = True
                            break
    elif direction == "right":
        for row in range(4):
            for col in range(2, -1, -1):
                if board[row][col] != 0:
                    for k in range(3, col, -1):
                        if board[row][k] == 0 and no_obstacles(board, row, col, row, k):
                            board[row][k] = board[row][col]
                            board[row][col] = 0
                            moved = True
                            break
                        elif board[row][k] == board[row][col] and no_obstacles(board, row, col, row, k):
                            board[row][k] *= 2
                            board[row][col] = 0
                            moved = True
                            break
    elif direction == "up":
        for col in range(4):
            for row in range(1, 4):
                if board[row][col] != 0:
                    for k in range(row):
                        if board[k][col] == 0 and no_obstacles(board, k, col, row, col):
                            board[k][col] = board[row][col]
                            board[row][col] = 0
                            moved = True
                            break
                        elif board[k][col] == board[row][col] and no_obstacles(board, k, col, row, col):
                            board[k][col] *= 2
                            board[row][col] = 0
                            moved = True
                            break
    elif direction == "down":
        for col in range(4):
            for row in range(2, -1, -1):
                if board[row][col] != 0:
                    for k in range(3, row, -1):
                        if board[k][col] == 0 and no_obstacles(board, row, col, k, col):
                            board[k][col] = board[row][col]
                            board[row][col] = 0
                            moved = True
                            break
                        elif board[k][col] == board[row][col] and no_obstacles(board, row, col, k, col):
                            board[k][col] *= 2
                            board[row][col] = 0
                            moved = True
                            break
    return moved


def no_obstacles(board, row1, col1, row2, col2):
    """
    判断两个位置之间是否有障碍物(即是否有数字方块)
    """
    if row1 == row2:
        for col in range(col1 + 1, col2):
            if board[row1][col] != 0:
                return False
    elif col1 == col2:
        for row in range(row1 + 1, row2):
            if board[row][col1] != 0:
                return False
    return True


def game_over(board):
    """
    判断游戏是否结束
    """
    for row in range(4):
        for col in range(4):
            if board[row][col] == 0:
                return False
    for row in range(4):
        for col in range(3):
            if board[row][col] == board[row][col + 1]:
                return False
    for col in range(4):
        for row in range(3):
            if board[row][col] == board[row + 1][col]:
                return False
    return True


def add_new_tile(board):
    # 查找所有空白的方格
    empty_tiles = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]

    # 如果没有空白的方格,返回 False
    if len(empty_tiles) == 0:
        return False

    # 随机选择一个空白的方格,并随机放入数字 2 或 4
    row, col = random.choice(empty_tiles)
    board[row][col] = random.choice([2, 4])

    return True


def get_tile_color(value):
    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),
    }
    return colors.get(value, (0, 0, 0))


def get_font_size(value):
    if value < 100:
        return 64
    elif value < 1000:
        return 48
    else:
        return 36


def main():
    # 初始化游戏界面
    pygame.init()
    screen = pygame.display.set_mode((SIZE, SIZE))
    pygame.display.set_caption("2048 Game")

    # 初始化游戏板
    board = [[0] * 4 for i in range(4)]
    add_new_tile(board)
    add_new_tile(board)

    while True:
        # 处理事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                moved = False
                if event.key == pygame.K_LEFT:
                    moved = move_tiles(board, "left")
                elif event.key == pygame.K_RIGHT:
                    moved = move_tiles(board, "right")
                elif event.key == pygame.K_UP:
                    moved = move_tiles(board, "up")
                elif event.key == pygame.K_DOWN:
                    moved = move_tiles(board, "down")
                if moved:
                    add_new_tile(board)

        # 绘制游戏界面
        screen.fill(BACKGROUND_COLOR)
        for row in range(4):
            for col in range(4):
                x = col * TILE_SIZE + TILE_MARGIN * (col + 1)
                y = row * TILE_SIZE + TILE_MARGIN * (row + 1)
                tile_color = get_tile_color(board[row][col])
                pygame.draw.rect(screen, tile_color, (x, y, TILE_SIZE, TILE_SIZE))
                if board[row][col] != 0:
                    font_size = get_font_size(board[row][col])
                    font = pygame.font.Font(None, font_size)
                    text = font.render(str(board[row][col]), True, TEXT_COLOR)
                    text_rect = text.get_rect()
                    text_rect.center = (x + TILE_SIZE / 2, y + TILE_SIZE / 2)
                    screen.blit(text, text_rect)

        # 判断游戏是否结束
        if game_over(board):
            font = pygame.font.Font(None, GAME_OVER_FONT_SIZE)
            text = font.render("Game Over!", True, GAME_OVER_COLOR)
            text_rect = text.get_rect()
            text_rect.center = (SIZE / 2, SIZE / 2)
            screen.blit(text, text_rect)

        pygame.display.update()


if __name__ == "__main__":
    main()