Python的2042小游戏及其详解

源码:

import random
import os

# 游戏界面尺寸
SIZE = 4

# 游戏结束标志
GAME_OVER = False

# 初始化游戏界面
board = [[0] * SIZE for _ in range(SIZE)]

# 随机生成一个初始方块
def add_random_tile():
    empty_tiles = [(i, j) for i in range(SIZE) for j in range(SIZE) if board[i][j] == 0]
    if empty_tiles:
        i, j = random.choice(empty_tiles)
        board[i][j] = random.choice([2, 4])

# 绘制游戏界面
def draw_board():
    os.system('cls' if os.name == 'nt' else 'clear')
    print("2042小游戏")
    print("---------------------")
    for row in board:
        for num in row:
            print(f"{num:4}", end=" ")
        print()
    print("---------------------")

# 检查游戏是否结束
def check_game_over():
    for i in range(SIZE):
        for j in range(SIZE):
            if board[i][j] == 0:
                return False
            if i < SIZE - 1 and board[i][j] == board[i + 1][j]:
                return False
            if j < SIZE - 1 and board[i][j] == board[i][j + 1]:
                return False
    return True

# 处理方向键输入
def handle_input():
    key = input("请输入方向键(w上,s下,a左,d右):")
    if key == "w":
        move_up()
    elif key == "s":
        move_down()
    elif key == "a":
        move_left()
    elif key == "d":
        move_right()

# 合并相同数字的方块
def merge_tiles(line):
    merged = [False] * SIZE
    merged_line = []
    for i in range(SIZE):
        if i < SIZE - 1 and line[i] == line[i + 1] and not merged[i]:
            merged_line.append(line[i] * 2)
            merged[i] = True
        elif line[i] != 0:
            merged_line.append(line[i])
    merged_line.extend([0] * (SIZE - len(merged_line)))
    return merged_line

# 将游戏界面向上移动
def move_up():
    global board
    new_board = []
    for j in range(SIZE):
        line = [board[i][j] for i in range(SIZE)]
        merged_line = merge_tiles(line)
        new_board.append(merged_line)
    board = [[new_board[i][j] for i in range(SIZE)] for j in range(SIZE)]
    add_random_tile()

# 将游戏界面向下移动
def move_down():
    global board
    new_board = []
    for j in range(SIZE):
        line = [board[i][j] for i in range(SIZE - 1, -1, -1)]
        merged_line = merge_tiles(line)
        new_board.append(merged_line[::-1])
    board = [[new_board[i][j] for i in range(SIZE)] for j in range(SIZE)]
    add_random_tile()

# 将游戏界面向左移动
def move_left():
    global board
    new_board = []
    for i in range(SIZE):
        line = board[i]
        merged_line = merge_tiles(line)
        new_board.append(merged_line)
    board = new_board
    add_random_tile()

# 将游戏界面向右移动
def move_right():
    global board
    new_board = []
    for i in range(SIZE):
        line = board[i][::-1]
        merged_line = merge_tiles(line)
        new_board.append(merged_line[::-1])
    board = new_board
    add_random_tile()

# 游戏主循环
while not GAME_OVER:
    draw_board()
    handle_input()
    GAME_OVER = check_game_over()

draw_board()
print("游戏结束!")

这段代码实现了一个简单的2048游戏。下面是对整体代码的分析:

1. 导入了`random`和`os`模块,用于生成随机数和清空命令行窗口。

2. 定义了常量`SIZE`,表示游戏界面的尺寸,这里是4x4的方格。

3. 定义了全局变量`GAME_OVER`,用于判断游戏是否结束。

4. 初始化游戏界面`board`,使用二维列表表示,初始时所有元素都为0。

5. 定义了函数`add_random_tile()`,用于在空白位置随机生成一个初始方块,值为2或4。

6. 定义了函数`draw_board()`,用于绘制游戏界面,清空命令行窗口后打印出当前界面的方块布局。

7. 定义了函数`check_game_over()`,用于检查游戏是否结束。遍历游戏界面的每个方块,如果存在空白方块或相邻方块有相同的值,则游戏未结束,否则游戏结束。

8. 定义了函数`handle_input()`,用于处理方向键的输入。根据用户输入的方向键(w上,s下,a左,d右),调用相应的移动函数。

9. 定义了函数`merge_tiles(line)`,用于合并一行或一列中相同数字的方块。遍历行或列中的每个方块,如果相邻的方块有相同的值且未合并过,则合并它们,生成新的合并后的行或列。

10. 定义了四个移动函数`move_up()`、`move_down()`、`move_left()`和`move_right()`,分别实现游戏界面的上、下、左、右移动。在移动前,将每一行或每一列提取出来,调用`merge_tiles()`合并相同数字的方块,然后将合并后的行或列重新放回游戏界面,并随机生成一个新的方块。

11. 使用`while`循环来不断绘制游戏界面、处理用户输入并检查游戏是否结束,直到游戏结束为止。

12. 最后绘制最终的游戏界面,并打印游戏结束提示。

整体而言,该代码通过不断更新游戏界面、处理用户输入和检查游戏状态的方式,实现了一个简单的2048游戏。

你可能感兴趣的:(游戏,整活系列,python入门教程,python,开发语言)