关于CS61b sp21中proj0的问题

博主在实现2048游戏的tilt函数时遇到输入问题,发现输入被系统误识别为中文字符。通过排查和修改,将方向键调整为WSAD,解决了游戏响应不灵敏的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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键,方便写代码(注意,输入英文默认的是大写字母)

 完美解决!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值