CS61b sp21的proj0要求实现2048游戏的四个函数,分别是
public static boolean emptySpaceExists(Board b)
public static boolean maxTileExists(Board b)
public static boolean atLeastOneMoveExists(Board b)
public boolean tilt(Side side)
前三个都运行正常,测试用例全部通过。
但最后一个我在进行自己测试的时候发现按方向键没有反应,检查了代码逻辑,运行环境后发现都没有问题。
解决办法:
1.定位问题
在main文件中,有如下代码段
InputSource inp;
inp = new GUISource(gui, gen, TILE2_PROBABILITY,
options.getFirst("--log"));
Game game = new Game(model, inp);
try {
while (game.playing()) {
game.playGame();
}
} catch (IllegalStateException excp) {
System.err.printf("Internal error: %s%n", excp.getMessage());
System.exit(1);
}
可以看到,有一个InputSource接口来完成输入的工作。接下来定位到Game文件,在playGame方法中有如下代码:
while (!moved) {
String cmnd = _source.getKey();
switch (cmnd) {
case "Quit":
_playing = false;
return;
case "New Game":
return;
case "Up": case "Down": case "Left": case "Right":
case "\u2190": case "\u2191": case "\u2192": case "\u2193":
if (!_model.gameOver() && _model.tilt(keyToSide(cmnd))) {
_model.notifyObservers(cmnd);
moved = true;
}
break;
default:
break;
}
}
程序通过getKey()方法接收键盘的输入,判断输入类型。接着进入到实现了InputSource接口的GUISource类。
String command = _source.readKey();
// System.out.println(command);
switch (command) {
case "↑" :
command = "Up";
break;
case "→" :
command = "Right";
break;
case "↓" :
command = "Down";
break;
case "←" :
command = "Left";
break;
default :
break;
}
程序判断输入类型的逻辑在这,那是不是因为case中的值不是我们真正输入的呢?所以才识别不到。
我打印了输入之后转换成的字符串:
按下方向键,居然打印出来的是中文!这应该是系统是中文的原因。
2.解决问题
问题已经找到,那我们把判断逻辑修改一下就可以,这里我是把上下左右箭头改成了WSAD键,方便写代码(注意,输入英文默认的是大写字母)
完美解决!