python 实现 2048 小游戏

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来控制格子的移动方向,当无法正确识别移动方向时,程序会让用户重新输入。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值