• Python的2042小游戏及其详解


    源码:

    1. import random
    2. import os
    3. # 游戏界面尺寸
    4. SIZE = 4
    5. # 游戏结束标志
    6. GAME_OVER = False
    7. # 初始化游戏界面
    8. board = [[0] * SIZE for _ in range(SIZE)]
    9. # 随机生成一个初始方块
    10. def add_random_tile():
    11. empty_tiles = [(i, j) for i in range(SIZE) for j in range(SIZE) if board[i][j] == 0]
    12. if empty_tiles:
    13. i, j = random.choice(empty_tiles)
    14. board[i][j] = random.choice([2, 4])
    15. # 绘制游戏界面
    16. def draw_board():
    17. os.system('cls' if os.name == 'nt' else 'clear')
    18. print("2042小游戏")
    19. print("---------------------")
    20. for row in board:
    21. for num in row:
    22. print(f"{num:4}", end=" ")
    23. print()
    24. print("---------------------")
    25. # 检查游戏是否结束
    26. def check_game_over():
    27. for i in range(SIZE):
    28. for j in range(SIZE):
    29. if board[i][j] == 0:
    30. return False
    31. if i < SIZE - 1 and board[i][j] == board[i + 1][j]:
    32. return False
    33. if j < SIZE - 1 and board[i][j] == board[i][j + 1]:
    34. return False
    35. return True
    36. # 处理方向键输入
    37. def handle_input():
    38. key = input("请输入方向键(w上,s下,a左,d右):")
    39. if key == "w":
    40. move_up()
    41. elif key == "s":
    42. move_down()
    43. elif key == "a":
    44. move_left()
    45. elif key == "d":
    46. move_right()
    47. # 合并相同数字的方块
    48. def merge_tiles(line):
    49. merged = [False] * SIZE
    50. merged_line = []
    51. for i in range(SIZE):
    52. if i < SIZE - 1 and line[i] == line[i + 1] and not merged[i]:
    53. merged_line.append(line[i] * 2)
    54. merged[i] = True
    55. elif line[i] != 0:
    56. merged_line.append(line[i])
    57. merged_line.extend([0] * (SIZE - len(merged_line)))
    58. return merged_line
    59. # 将游戏界面向上移动
    60. def move_up():
    61. global board
    62. new_board = []
    63. for j in range(SIZE):
    64. line = [board[i][j] for i in range(SIZE)]
    65. merged_line = merge_tiles(line)
    66. new_board.append(merged_line)
    67. board = [[new_board[i][j] for i in range(SIZE)] for j in range(SIZE)]
    68. add_random_tile()
    69. # 将游戏界面向下移动
    70. def move_down():
    71. global board
    72. new_board = []
    73. for j in range(SIZE):
    74. line = [board[i][j] for i in range(SIZE - 1, -1, -1)]
    75. merged_line = merge_tiles(line)
    76. new_board.append(merged_line[::-1])
    77. board = [[new_board[i][j] for i in range(SIZE)] for j in range(SIZE)]
    78. add_random_tile()
    79. # 将游戏界面向左移动
    80. def move_left():
    81. global board
    82. new_board = []
    83. for i in range(SIZE):
    84. line = board[i]
    85. merged_line = merge_tiles(line)
    86. new_board.append(merged_line)
    87. board = new_board
    88. add_random_tile()
    89. # 将游戏界面向右移动
    90. def move_right():
    91. global board
    92. new_board = []
    93. for i in range(SIZE):
    94. line = board[i][::-1]
    95. merged_line = merge_tiles(line)
    96. new_board.append(merged_line[::-1])
    97. board = new_board
    98. add_random_tile()
    99. # 游戏主循环
    100. while not GAME_OVER:
    101. draw_board()
    102. handle_input()
    103. GAME_OVER = check_game_over()
    104. draw_board()
    105. 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游戏。

  • 相关阅读:
    流量染色SDK设计的思考
    云原生之容器化:1、何谓Kubernetes?
    【待更新】【Rockchip】瑞芯微/rockchip 开发环境搭建|编译|烧录 开发实例
    如何将 Docker 镜像大小从 1.43 GB 减少到 22.4 MB
    【RocketMQ】主从同步实现原理
    【CGSSA-BP预测】基于混合混沌-高斯变异-麻雀算法优化BP神经网络回归预测研究(Matlab代码实现)
    R语言编写自定义函数对数据进行标准化、使用keras包构建深度学习自动编码器(autoencoder)、使用MSE指标评估自动编码器的效能(重构误差)
    Qt 学习(四) —— QButtonGroup抽象容器
    【Mybatis】基于Mybatis插件+注解,实现敏感数据自动加解密
    Docker常用命令
  • 原文地址:https://blog.csdn.net/m0_69824302/article/details/134451143