2048游戏无效移动逻辑调试求助:非法操作不生成新2并要求重新输入
问题排查与修复方案
核心问题原因
你当前的无效移动判断逻辑错误根源是:仅通过是否执行了末尾格子置0操作来判断移动是否有效,哪怕置0的位置原本就是空值、移动前后棋盘没有任何变化,也会被误判为有效移动,触发新方块生成。
修复方案
最稳妥的实现方式是移动前备份原始棋盘,移动完成后对比前后棋盘是否有差异,有差异才判定为有效移动,完全规避边界情况的判断遗漏。
具体修改步骤
- 移除四个方向(w/s/a/d)移动逻辑中,所有写在清空循环内的
isValid = True赋值语句 - 每个合法移动指令执行前,先备份当前棋盘
- 移动逻辑全部执行完成后,对比备份棋盘和当前棋盘,存在差异则设置
isValid = True,否则保持False
修改后的核心代码示例
isValid = True while True: if isValid: one = generate_piece(game_board, DEV_MODE) game_board[one['row']][one['column']] = one['value'] print_board(game_board) choice = input() if choice in ['w','s','a','d']: # 移动前备份原始棋盘 old_board = [row.copy() for row in game_board] isValid = False if choice == 'w': for col in range(4): tracker1 = 0 tracker2 = 0 for row in range(4): if game_board[row][col] == 0: continue if tracker2 == game_board[row][col]: game_board[tracker1][col] = 2 * tracker2 tracker1 = tracker1 + 1 tracker2 = 0 elif tracker2 == 0: tracker2 = game_board[row][col] else: game_board[tracker1][col] = tracker2 tracker1 = tracker1 + 1 tracker2 = game_board[row][col] if tracker2 != 0: game_board[tracker1][col] = tracker2 tracker1 = tracker1 + 1 for row in range(tracker1, 4): game_board[row][col] = 0 # s/a/d三个方向的移动逻辑和w同理,仅删除内部的isValid=True即可,其余逻辑保持不变 # ...... 保留你原有s/a/d的移动逻辑,仅移除其中的isValid = True语句 ...... # 移动完成后对比棋盘判断是否有效 isValid = old_board != game_board elif choice == 'q': print('Goodbye') break else: print('Invalid input.')
补充说明
这种方案不需要再考虑各种移动的边界场景,只要棋盘有任何数值、位置变化都会被判定为有效移动,完全符合2048的游戏规则。
内容的提问来源于stack exchange,提问作者user17421902
相关产品推荐
相关产品推荐

