Java 字符数组中的意外字符

Java 字符数组中的意外字符,java,arrays,Java,Arrays,我试图理解这个特殊的程序,但是我很难理解这个特殊方法的作用 该方法采用用户输入的param字符串播放器,且必须采用(字母)(数字)形式,其中字母范围为a-g,数字范围为1-8,考虑到船舶将放置在8x8板上。所以字符串的一个例子是“A6”、“E2”等等 还有private char[]board=new char[8][8] 和pShip=0 我知道此方法将使用用户输入的字符串并尝试将其放置到8x8板上,但49和65从何而来 /** * Sets a player ship on

我试图理解这个特殊的程序,但是我很难理解这个特殊方法的作用

该方法采用用户输入的param
字符串播放器
,且必须采用(字母)(数字)形式,其中字母范围为a-g,数字范围为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++;
    }

这些是ASCII码:49代表1,65代表字母“A”。代码计算每个数字的ascii值与该步骤中大写字母之间的差值。这些是ascii代码:49表示1,65表示字母“A”。代码计算每个数字的ascii值与大写字母之间的差值,在该步骤中编写代码的程序员只是将一组ascii坐标转换为整数偏移量,以便在数组中使用。不幸的是,代码中没有任何内容可以验证
playerShip.charAt(1)
或0将返回有效字符

这样做的原因是大写字母a的ASCII码是0x41或65。从大写字母中减去65将产生整数偏移量。我让你们来计算49在ASCII中是什么


尽管至少有一条评论提到开发人员选择使用“神奇数字”,这几乎总是不明智的,在这种情况下,我怀疑他假设任何阅读他的代码的开发人员都熟悉这种将字符转换为整数值的方法。

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

这样做的原因是大写字母a的ASCII码是0x41或65。从大写字母中减去65将产生整数偏移量。我让你们来计算49在ASCII中是什么


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

此方法正在转换给定的(字母数)将坐标串入板矩阵中的相应位置,并将其设置为“s”(这似乎是定义的值,表示船的一部分位于该板位置)

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


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

此方法是转换给定的(字母数)将坐标串入板矩阵中的相应位置,并将其设置为“s”(这似乎是定义的值,表示船的一部分位于该板位置)

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


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

这正是您不应该使用“魔法”的原因编程检查时的数字:
(char)65
代表什么?它会是大写字母A吗?……是的,49?您可以看看
char
s的魔力在哪里得到解释。这正是为什么在编程检查时不应该使用“魔力”数字的原因:
(char)是什么65
表示?是否大写A?……是的,49?您可以看看
char
s的魔力在哪里得到解释。