使用字符串数组在Java中创建2D(映射)数组

时间:2015-10-13 01:56:18

标签: java arrays string multidimensional-array maps

如何在Java中创建2D字符数组?我正在研究这个适用于我的地图目标,你可以移动一个角色,虽然没有找到任何有用的东西。我以前在C ++中做过这个(有点帮助),虽然不知道如何使用Java。

对于C ++版本,我开始使用一维字符串数组:

    "#######.#.~~~####.##.......~~~..##.~~....H....######..#######",
    "#####..T.#~~~..##.H......~~~...#..T.~~.........######.###....",
    "######..~~~~#######...#..~~~.........~~~.##.###..#####.###...",
    "...###..~~~.######...##H.~~~.@........~~.#.####...##.H.###...",
    ".#####..~~.~~###C.....#..~~~.....#...~~~..###..#....##....#..",
    "######....~~~.~.##....#..~~~.....#....~~~.#######C...........",
    "#######.H..~.~~~~#....#..~~~.....###...~~~.##########........",
    "########.H...~~~~~.....~~~......H..##....~~~.H######...T...##",

(你是@符号) 然后能够将每个字符串分成单独的字符,其中包含2个嵌套for循环,将其分解为基本上可以移动角色的2D数组。

这是一个很好的方法,如果是这样的话? (我现在花了10个小时试图让基本版本工作)。有没有更好的方法呢?我想稍后用这样的地图创建一个非常复杂的游戏,但需要帮助提出如何。

3 个答案:

答案 0 :(得分:1)

您可以通过

在Java中创建2D数组
char[][] arr = new char[number of rows][number of columns];

例如,

char[][] arr = new char[2][3];

将创建一个2行高,3列宽的数组。因此,您可以通过更改行让角色在网格中上下移动,并通过更改列来左右移动。

答案 1 :(得分:1)

this问题的答案正是您想要的,但整数。

setInterval

但我真的建议您使用Object来使用某些解决方案。因为您使用的是Java。

我不知道你的项目,但我想这是一款基于磁贴的2D游戏。你可以有一个Tile类,它具有位置信息和t​​ile的所有属性。

可以使用另一种方法来考虑可扩展性和性能。

答案 2 :(得分:1)

您的String需要2D数组吗?为什么不存储像“ABCDEFGHI”这样的字符串并像访问3x3 2D数组一样访问它?

x,y “坐标”映射到索引

public class Char2DDemo
{
    public static int ROWS = 3;
    public static int COLS = 3;

    public static class Char2D
    {
        private StringBuilder sb = null;
        private int ROWS;
        private int COLS;

        public Char2D(String str, int rows, int cols)
        {
            this.sb = new StringBuilder(str);
            this.ROWS = rows;
            this.COLS = cols;
        }

        public StringBuilder getSb()
        {
            return sb;
        }

        public int getRowCount()
        {
            return ROWS;
        }

        public int getColCount()
        {
            return COLS;
        }

        public int xy2idx(int x, int y)
        {
            int idx = y * getRowCount() + x;
            return idx;
        }

        public int idx2x(int idx)
        {
            int x = idx % getRowCount();
            return x;
        }

        public int idx2y(int idx)
        {
            int y = (idx - idx2x(idx)) / getRowCount();
            return y;
        }

        public Character getCh(int x, int y)
        {
            return getSb().charAt(xy2idx(x, y));
        }

        public void setCh(Character ch, int x, int y)
        {
            getSb().setCharAt(xy2idx(x, y), ch);
        }
    }

    public static void main(String[] args) throws java.lang.Exception
    {
        String test = "ABC"
                    + "DEF"
                    + "GHI";

        Char2D c2d = new Char2D(test, 3, 3);

        System.out.println("Before " + c2d.getSb());
        System.out.println("at [2][2] " + c2d.getCh(2, 2));
        c2d.setCh('J', 0, 0);
        c2d.setCh('K', 2, 2);
        c2d.setCh('M', 1, 1);        
        System.out.println("After " + c2d.getSb());
        System.out.println("at [1][0] " + c2d.getCh(1, 0));
    }
}

输出:

Before ABCDEFGHI
at [2][2] I
After JBCDMFGHK
at [1][0] B