Python 实现2048完整思路及代码
2048 游戏的基本规则如下:每次控制所有方块向同一个方向运动,两个相同数字的方块撞在一起之后合并成为它们的和,每次操作之后会在空白的方格处随机生成一个 2 或者 4,最终得到一个 2048 的方块就算玩家胜利。如果格子全部填满并且相邻的格子都不相同也就是无法移动,则玩家失败。
以下是一个用 Python 实现的 2048 游戏的简单示例:
import random
# 创建游戏面板和初始数字
grid = [[0 for _ in range(4)] for _ in range(4)]
# 在空白位置随机生成新的数字
def generate_new_tile():
available_cells = []
for i in range(4):
for j in range(4):
if grid[i][j] == 0:
available_cells.append((i, j))
if available_cells:
x, y = random.choice(available_cells)
grid[x][y] = random.choice([2, 4])
# 在控制台打印游戏面板
def print_grid():
for i in range(4):
for j in range(4):
print('{:6d}'.format(grid[i][j]), end='\t')
print()
print()
# 处理移动操作
def move(direction):
# 左移
if direction.lower() == 'a':
for i in range(4):
data = [cell for cell in grid[i] if cell != 0]
for idx,p in enumerate(data[1:], 1):
if p == data[idx - 1]:
data[idx - 1]= p * 2
data[idx]=0
data = [cell for cell in data if cell != 0]
data+= [0] * (4 - len(data))
grid[i] = data
# 右移
elif direction.lower() == 'd':
for i in range(4):
data = [cell for cell in grid[i] if cell != 0][::-1]
for idx,p in enumerate(data[1:], 1):
if p == data[idx - 1]:
data[idx - 1]= p * 2
data[idx]=0
data = [cell for cell in data if cell != 0]
data+= [0] * (4 - len(data))
grid[i] = data[::-1]
# 上移
elif direction.lower() == 'w':
for j in range(4):
data = [grid[i][j] for i in range(4) if grid[i][j] != 0]
for idx,p in enumerate(data[1:], 1):
if p == data[idx - 1]:
data[idx - 1]= p * 2
data[idx]=0
data = [cell for cell in data if cell != 0]
data+= [0] * (4 - len(data))
for i in range(4):
grid[i][j] = data[i]
# 下移
elif direction.lower() == 's':
for j in range(4):
data = [grid[i][j] for i in range(4) if grid[i][j] != 0][::-1]
for idx,p in enumerate(data[1:], 1):
if p == data[idx - 1]:
data[idx - 1]= p * 2
data[idx]=0
data = [cell for cell in data if cell != 0]
data+= [0] * (4 - len(data))
data=data[::-1]
for i in range(4):
grid[i][j] = data[i]
else:
raise Exception('输入非法')
# 检查游戏是否胜利
def check_win():
for i in range(4):
for j in range(4):
if grid[i][j] == 2048:
return True
return False
# 检查游戏是否失败
def check_game_over():
for i in range(4):
for j in range(4):
if grid[i][j] == 0:
return False
if i < 3 and grid[i][j] == grid[i + 1][j]:
return False
if j < 3 and grid[i][j] == grid[i][j + 1]:
return False
return True
# 游戏主循环
def game_main():
# 游戏开始时生成两个新数字
generate_new_tile()
generate_new_tile()
# 打印初始面板
print_grid()
while True:
try:
direction = input("输入移动方向 (WASD): ")
# 处理移动操作
move(direction)
# 生成新数字
generate_new_tile()
# 打印更新后的面板
print_grid()
# 检查游戏是否胜利
if check_win():
print("你赢了!")
break
# 检查游戏是否失败
if check_game_over():
print("游戏结束,你输了。")
break
except Exception as e:
if str(e)=='输入非法':
print('无法识别,请重新输入。')
else:
raise e
# 运行游戏
if __name__ == "__main__":
game_main()
执行上述代码,便可在控制台进行游戏,用户通过输入WASD
来控制格子的移动方向,当无法正确识别移动方向时,程序会让用户重新输入。