源码:
- 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游戏。