【问题标题】:How to convert a chess co-ordinate into row, column for 2D array [closed]如何将国际象棋坐标转换为二维数组的行、列[关闭]
【发布时间】:2018-11-06 18:22:05
【问题描述】:

我完全被难住了,想知道是否有人知道如何将国际象棋中的用户输入“a1”转换为二维数组中的 [][]?

【问题讨论】:

  • 为什么不试试呢?请参阅 [askl],但编码问题应该有 minimal reproducible example。国际象棋坐标始终是列-行对,并且它们始终是每个字符的单个字符,最多两个字符。一种天真的方法是将坐标拆分为一列和一行,并将其用作二维数组的索引(在将列和行转换为实际索引之后 - 你如何做到这一点取决于你,但一种简单的方法是按原样使用行,并通过简单的 A -> 1、B -> 2 转换将列转换为索引。小心基于 0 和 1 的索引!

标签: java arrays chess


【解决方案1】:

以下代码向您展示了如何进行所需的转换:

String str = "g3";
System.out.println(str.charAt(0) - 'a');
System.out.println(str.charAt(1) - '1');

将打印

6
2

所以
str.charAt(0) - 'a' 转换字母
str.charAt(1) - '1' 转换数字

【讨论】:

  • 但是这将如何处理所有的字母?(谢谢你的回复顺便说一句!)
  • @MarinaCalder 方法 charAt(0) 在字符串的第 0th 索引处返回字符,但在像 charAt(0)-'a' 这样的算术运算中组合时返回字符的 ASCII 码。因此,如果字符为'a',则为charAt(0)-'a'->'a'-'a'->0,如果字符为'b',则为charAt(0)-'a'->'b'-'a'->1,...,如果字符为'h',则为charAt(0)-'a'->'h'-'a'->7。所以它适用于所有字母。
  • 我非常感谢你的解释!
【解决方案2】:

首先,考虑字符代码点按字母顺序排列。由于 Java 中的字符表示为无符号整数,因此您可以从另一个字符中减去 'a' 的代码点,以查看它与 'a' 的距离:'a'-'a' = 0'b'-'a' = 1'c'-'a' = 2 等等。假设一个双字符字符串的第一个字符是 a..h 范围内的小写字母,你可以像这样得到你的第一个“坐标”:

int hPos = coord.charAt(0)-'a';

你可以对数字做同样的事情:

int vPos = coord.charAt(1)-'1';

此外,Java supplies a way to extract a digit from a numeric codepoint. 由于a..h 被认为是 base-18 中的数字,您也可以使用这种方法:

int hPos = Character.digit(coord.charAt(0), 18) - 10;
int vPos = Character.digit(coord.charAt(1), 10) - 1;

【讨论】:

  • 我正在尝试从用户输入转换任何国际象棋坐标
【解决方案3】:

由于棋盘定义明确,另一种方法是使用枚举。例如:

    public static void main(String[] args) {
        ChessPosition cp = ChessPosition.valueOf("A1");
        System.out.println(cp);

        cp = ChessPosition.valueOf("H8");
        System.out.println(cp);
    }

    public enum ChessPosition {

        A1(0, 0),
        // ...
        H8(7, 7);


        private final int row;
        private final int column;

        private ChessPosition(int row, int column) {
            this.row = row;
            this.column = column;
        }

        public int getRow() {
            return row;
        }

        public int getColumn() {
            return column;
        }

        public String toString() {
            return name() + " row=" + getRow() + ", column=" + getColumn();
        }
    }

【讨论】:

  • 非常有用!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多