关于CS61b sp21中proj0的问题

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

 完美解决!

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 这个问题似乎是以非文编码的方式显示的,但我理解你的意思。 Matlab函数的使用方法可以通过以下步骤来实现: 1. 首先,将函数文件保存在Matlab工作目录或路径下; 2. 然后,使用Matlab命令窗口或脚本调用函数; 3. 在调用函数时,输入所需的参数。 4. 运行代码并查看结果。 需要注意的是,对于每个函数,其输入参数和返回结果的格式都可能不同,因此需要仔细阅读函数的文档或者帮助手册。 ### 回答2: m_proj函数是Matlab用于绘制地图投影的函数,它有多种使用方法。下面就介绍几种常用的用法。 1.绘制地图 使用m_proj函数可以绘制地图,首先要设置地图投影方式和经纬度范围,例如: m_proj('mercator','longitudes',[100 140],'latitudes',[20 45]); 这里使用了mercator投影方式,经度范围为100度到140度,纬度范围为20度到45度。 2.绘制地图上的点和线段 有了地图之后,可以在地图上绘制点和线段,例如: m_plot(lon,lat,'g','linewidth',2) lon和lat是要绘制点或线段的经纬度数据,'g'指定了绘制的颜色为绿色,'linewidth'指定了线段的宽度为2。 3.绘制地图上的文本标注 在地图上添加文本标注也很方便,例如: m_text(lon,lat,'这是一个文本标注','fontsize',14) lon和lat指定了标注的位置,'这是一个文本标注'是要添加的文本内容,'fontsize'指定了字体大小为14。 4.绘制地图上的填充物 可以使用m_patch函数来在地图上添加填充物,例如: m_patch(lon,lat,'r') lon和lat是要添加填充物的经纬度数据,'r'指定了填充的颜色为红色。 总之,m_proj函数是Matlab非常常用的地图绘制函数,掌握了它的用法,可以轻松地绘制出各种有趣的地图。 ### 回答3: m_proj是matlab的一个函数,主要用于绘制地图。它可以绘制出全球地图以及各种地图投影方式,同时支持各种常用的地图数据格式。m_proj函数的语法如下: m_proj(projection type,'lon',[min max],'lat',[min max],[optional parameters]) 其projection type指定了地图投影方式,可以是'robinson'、'mercator'、'stereo'、'hammer'等;'lon',[min max]和'lat',[min max]指定了经度和纬度的范围,[optional parameters]为可选参数。 m_proj函数的使用步骤如下: 1. 设置投影方式:m_proj('projection type')。 2. 设置经纬度范围:m_proj('lon',[min max],'lat',[min max])。 3. 准备地图数据:使用m_edata函数加载地图数据,或手动设置经纬度值和数据值。 4. 绘制地图:使用m_pcolor、m_contourf等函数绘制地图。 5. 设置标注和标题:使用m_grid、m_text等函数设置标注和标题。 m_proj函数的可选参数有很多,包括设置地图边界线条粗细、颜色、设置缩放比例、设置颜色之间的映射等。通过调整这些参数可以得到各种精美的地图效果。 在使用m_proj函数绘制地图时,要注意投影方式和经纬度范围的设置,以及地图数据的处理。此外,还可以根据实际需求增加更多的可选参数,以实现更加复杂的地图绘制效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值