用Python实现2048游戏:核心逻辑与算法详解
2048是一款经典的数字益智游戏,玩法简单却蕴含巧妙的算法思想。本文将带你用Python从零实现2048的核心逻辑,理解滑动、合并、随机生成等关键算法。
## 一、游戏规则
2048在一个4×4的棋盘上进行。玩家通过上下左右滑动,将相同数字的方块合并,每次滑动后会在随机空格处生成一个新的数字(2或4)。当棋盘无法再移动时游戏结束,目标是合成2048。
## 二、数据结构
棋盘用一个4×4的二维列表表示,0代表空格:
board = [[0]*4 for _ in range(4)]
## 三、核心算法:滑动与合并
四个方向的移动都可以归约为“向左移动”,只需通过旋转矩阵实现方向转换。向左移动的核心逻辑分为三步:
1. 压缩:去掉每行中的0,把非零数字移到左侧;
2. 合并:相邻且相同的数字合并为双倍,得分累加;
3. 再压缩:合并后再次去掉中间的0。
def move_left(row):
new_row = [x for x in row if x != 0]
score = 0
i = 0
while i < len(new_row) - 1:
if new_row[i] == new_row[i+1]:
new_row[i] *= 2
score += new_row[i]
new_row.pop(i+1)
i += 1
new_row += [0] * (4 - len(new_row))
return new_row, score
注意:合并后的方块在本轮内不能再次合并,例如[2,2,4,4]左移后应为[4,8,0,0],而不是[8,4,0,0]。上面的实现通过索引递进避免了重复合并。
## 四、方向转换
右移 = 左右翻转后左移再翻转;上移 = 转置后左移再转置;下移 = 转置后右移再转置。矩阵转置和翻转都可以用列表推导式轻松实现。
## 五、随机生成新方块
每次有效滑动后,从所有空格中随机选一个位置,90%概率生成2,10%概率生成4。
import random
def add_random_tile(board):
empty = [(r,c) for r in range(4) for c in range(4) if board[r][c]==0]
if empty:
r,c = random.choice(empty)
board[r][c] = 4 if random.random() < 0.1 else 2
## 六、游戏结束判定
当棋盘填满且任意相邻格子都不相等时,游戏结束。判断时只需检查:是否存在空格,或者存在横向/纵向相邻相等的格子。
## 七、总结
2048的核心算法可以归纳为:压缩、合并、再压缩三步走,配合矩阵变换统一四个方向。掌握这套思路,你可以轻松实现网页版、终端版甚至带AI自动求解的2048。动手试试吧!
- 点赞
- 收藏
- 关注作者
评论(0)