char数组中的意外字符

时间:2017-09-21 17:56:17

标签: java arrays

我正在尝试理解这个特定的程序,但我很难理解这个特定方法的作用。

该方法采用用户输入的参数String playerShip,并且必须采用格式(字母)(数字),其中字母的范围可以是ag,数字的范围可以是1-8,考虑到船只将是放在8x8板上。所以字符串的一个例子是“A6”,“E2”等。

private char[][] board = new char[8][8];

pShip=0;

我知道这个方法将用户输入的字符串并尝试将其放在8x8板上,但49和65来自哪里?

  /**

     * Sets a player ship on the board by replacing an 's' into board array 
  * user-defined coordinates, increments playerShips for each ship added
     *
     * @param playerShip coordinates of player ship entered by user
     */

   public void setPlayerShips(String playerShip) {

        board[((int) playerShip.charAt(1)) - 49][((int) playerShip.charAt(0)) - 65] = 's';
        pShip++;
    }

3 个答案:

答案 0 :(得分:2)

这些是ASCII码:49表示1,65表示字母'A'。代码计算每个数字的ascii值与该步骤的大写字母之间的差异

答案 1 :(得分:1)

编写代码的程序员只是将一组ASCII坐标转换为整数偏移,以便在数组中使用。遗憾的是,代码中没有任何内容可以验证playerShip.charAt(1)或0将返回有效字符。

这样做的原因是大写A的ASCII码是0x41或65.从大写字母减去65会产生整数偏移。我留给你来解决用什么49的ASCII。

虽然至少有一条评论提到开发人员选择使用"魔术数字",这几乎总是不明智的,在这种情况下,我怀疑他认为任何阅读他的代码的开发人员都会熟悉这种将字符转换为整数值的方法。

答案 2 :(得分:0)

此方法将给定(字母数字)字符串坐标转换为电路板矩阵中的相应位置,并将其设置为“s”(这似乎是定义的值,表明该部分存在于该中董事会职位)。

正如其他人所提到的,为了将给定的字符(第一个,一个字母字符和第二个,一个数字字符)映射到0到7之间的值以索引板矩阵,程序员减去第一个字符的ASCII值有效范围。从AH开始,ASCII字符代码从65(A)变为72(H),因此当您选择该范围内的字母并减去65(A的整数值时,您将获得板矩阵可转位范围内的值( 0-7)。同样的事情适用于范围从1-8的第二个字符,这些字符的ASCII码范围从49(对于字符1)到56(对于字符8),因此程序员减去49以再次获得,一个从0到7的数字来索引板矩阵的另一个维度。

我建议你谷歌搜索“ASCII表”,这样你就可以看看ASCII编码的可打印和非打印字符如何映射到整数,因为它在所有编程语言中都被广泛使用,这是一个很好的理解一些字符串编码的内部工作原理。