贪吃蛇游戏反向移动问题咨询:directionMoved变量作用逻辑求解
贪吃蛇directionMoved变量作用逻辑梳理
你提供的代码中directionMoved是存储贪吃蛇上一次已生效的移动方向的全局状态变量,它的作用是和本次新输入的方向做校验,避免蛇直接反向移动。
现有代码正常运行的逻辑
反方向拦截的核心规则是:新输入的移动方向,不能和上一次已经生效的移动方向相反。代码的判断逻辑可以拆解为:
- 初始化时蛇默认向右移动,所以
directionMoved初始值设为"R" - 每次收到键盘输入的方向
directionArrow.data时,都会和directionMoved中存储的上一次有效方向做校验:- 输入向上(U)时,只有上一次不是向下(D)才会生效
- 输入向右(R)时,只有上一次不是向左(L)才会生效
- 输入向左(L)时,只有上一次不是向右(R)才会生效
- 输入向下(D)时,只有上一次不是向上(U)才会生效
- 只有校验通过的方向才会更新到
directionMoved中,同时执行蛇头坐标更新逻辑
举个实际场景示例:
当前蛇正在向下移动,
directionMoved存储的值为"D",此时误触向上方向键,directionArrow.data为"U"。对应判断条件directionArrow.data.equals("U") && !(directionMoved.equals("D"))中,后半段判断!(D.equals(D))结果为false,整个条件不成立,本次向上的输入直接被忽略,不会触发移动,也就避免了反向咬到自己。
删除directionMoved后失效的原因
directionArrow.data只代表你本次按下的键盘输入,本身不存储蛇之前的移动状态。你删除directionMoved变量后,代码失去了判断反方向的参照基准,所有方向校验的条件都会失效,只要你按下方向键,不管当前蛇的移动方向是什么,都会直接执行移动逻辑,按下反方向时自然就会出现倒退咬自身的问题。
可选的代码优化方案
现有代码的多分支判断可以简化,减少重复代码:
public class Snake { String directionMoved; // 存储方向和对应相反方向的映射表 private static final Map<String, String> OPPOSITE_DIR = Map.of( "U", "D", "D", "U", "L", "R", "R", "L" ); Snake() { directionMoved = "R"; } processDirectionArrow (Event directionArrow) { String inputDir = directionArrow.data; // 只有输入方向不是当前方向的反方向,才执行移动逻辑 if (!inputDir.equals(OPPOSITE_DIR.get(directionMoved))) { directionMoved = inputDir; processHeadDirectionCoordinate(directionMoved); } } }
内容的提问来源于stack exchange,提问作者Weightlifting Without Limits
相关产品推荐
相关产品推荐

