欢迎访问宙启技术站
智能推送

用Python实现K_RIGHT键实现的2048小游戏

发布时间:2024-01-15 06:36:06

下面是一个使用Python实现的2048小游戏代码示例。

import curses
from random import randrange, choice
from collections import defaultdict

# 初始化游戏盘
def init_grid(n):
    grid = [[0] * n for _ in range(n)]
    # 随机生成两个初始数字
    add_new(grid)
    add_new(grid)
    return grid

# 在空位置上随机生成一个2或4
def add_new(grid):
    n = len(grid)
    empty_cells = [(x, y) for x in range(n) for y in range(n) if grid[x][y] == 0]
    if len(empty_cells) == 0:
        return
    (x, y) = choice(empty_cells)
    grid[x][y] = 2 if randrange(100) < 90 else 4

# 获取可移动方向
def get_moves(grid):
    n = len(grid)
    moves = []
    for move in range(4):
        temp_grid = [row[:] for row in grid]
        if move == 0:  # 左
            temp_grid = move_left(temp_grid)
        elif move == 1:  # 上
            temp_grid = move_up(temp_grid)
        elif move == 2:  # 右
            temp_grid = move_right(temp_grid)
        elif move == 3:  # 下
            temp_grid = move_down(temp_grid)
        if temp_grid != grid:  # 可以移动
            moves.append((move, temp_grid))
    return moves

# 判断游戏是否结束
def is_game_over(grid):
    return len(get_moves(grid)) == 0

# 移动操作
def move_left(grid):
    new_grid = []
    for row in grid:
        new_row = []
        last_merged = False
        for i in range(len(row)):
            if row[i] != 0:
                if new_row and not last_merged and new_row[-1] == row[i]:
                    new_row[-1] *= 2
                    last_merged = True
                else:
                    new_row.append(row[i])
                    last_merged = False
        new_row += [0] * (len(row) - len(new_row))
        new_grid.append(new_row)
    return new_grid

# 向右移动
def move_right(grid):
    return invert(move_left(invert(grid)))

# 向上移动
def move_up(grid):
    return transpose(move_left(transpose(grid)))

# 向下移动
def move_down(grid):
    return transpose(move_right(transpose(grid)))

# 矩阵转置
def transpose(grid):
    return [list(row) for row in zip(*grid)]

# 翻转矩阵
def invert(grid):
    return [row[::-1] for row in grid]

# 画出游戏界面
def draw_grid(stdscr, grid):
    stdscr.clear()
    for y in range(len(grid)):
        for x in range(len(grid[y])):
            stdscr.addstr(y * 2, x * 4, str(grid[y][x]).center(3))
    stdscr.refresh()

# 游戏主循环
def main(stdscr):
    # 设置窗口
    curses.curs_set(0)
    stdscr.nodelay(1)

    # 初始化游戏盘
    grid = init_grid(4)

    while True:
        draw_grid(stdscr, grid)

        # 获得用户输入
        key = stdscr.getch()

        if key == curses.KEY_LEFT:
            grid = move_left(grid)
        elif key == curses.KEY_RIGHT:
            grid = move_right(grid)
        elif key == curses.KEY_UP:
            grid = move_up(grid)
        elif key == curses.KEY_DOWN:
            grid = move_down(grid)

        if is_game_over(grid):
            stdscr.addstr(10, 0, "游戏结束!按任意键退出。")
            stdscr.getch()
            break

        add_new(grid)

# 运行游戏
curses.wrapper(main)

要运行该代码,你需要在Python环境下安装curses模块。curses是一个用于终端屏幕操作的Python模块。

运行游戏后,你可以使用方向键来移动格子,如果格子无法再移动,则游戏结束并显示游戏结束的提示信息。

希望这个示例对你理解如何使用Python实现2048小游戏有所帮助。