在二维数组(棋盘游戏)中移动的最佳方法

3
我想知道在Java中移动二维数组的最简单方法是什么?我创建了一个二维数组来表示游戏棋盘并用它来跟踪游戏棋子的位置。如果我有一个16x16的二维数组,如何使玩家在棋盘上移动X个位置?
棋子将从以下位置移动:
[0][0] -> [0][16] - 向上
然后
[0][16] -> [16][16] - 右边
然后
[16][16] -> [16][0] - 向下
最后回到起始点[0][0]
[16][0] -> [0][0] - 左边
非常感谢您提供的任何帮助或建议!
编辑:真希望我能接受多个正确答案.... 唉;(

不确定你的问题是什么。你有物体在这些数组中移动吗?你是在内部还是外部跟踪这些对象的位置?发生了什么事? - Kon
2
你在这里想要实现什么非常不清楚。 - Jokab
抱歉我没有表述清楚,是的,我希望对象在数组中移动。但是请将2D数组想象成Monopoly棋盘游戏。我在它们的“GamePiece”类内部跟踪它们的位置。“BoardGame”类管理这些棋子并设置它们的位置。我只是不确定如何实现规则,以便如果玩家到达[0][16]空间,如何告诉它开始向下移动到[1][16]。 - IZI_Shadow_IZI
我认为没有必要使用2D数组(256个元素),因为大部分都是空的。为什么不使用1D数组(60个元素)呢?渲染和游戏机制是两个不同的事情。 - user2468700
实际上,游戏中有一些中心位置是玩家可以移动到的,我之前没有提到。 - IZI_Shadow_IZI
3个回答

2

根据您的评论,您可以使用以下伪代码实现对移动的限制。我不能百分之百确定这是否是您想要的,但希望它有些有用。

if (user tries to move right) {
    if (posX < 15 && posY == 0)
         //move right
    else
         //don't
}

if (user tries to move left) {
    if (posX > 0 && posY == 15)
         //move left
    else
         //don't
}

等等,这和你要查找的东西相似吗?限制数组遍历?根据你所说,我假设您的板只允许在数组边界上移动,因此以下O位置是合法的,而X是非法的:

OOOOOOOOOOOOOOO
OXXXXXXXXXXXXXO
OXXXXXXXXXXXXXO
...
OXXXXXXXXXXXXXO
OOOOOOOOOOOOOOO

是的,边界问题。所以我想如果我到达右侧边界并且还有几个位置要移动,我将不得不计算剩余要移动的位置,并在切换到向下移动后相应地移动。 - IZI_Shadow_IZI
你不必一定要在内存中保留剩余移动位置的计数。你的移动逻辑所需的一切都存储在游戏棋子的X和Y位置变量中。实现一个moveNext()算法来为你处理工作。你可以重载该方法,使用一个moveNext(int k) { } 方法,它本身调用moveNext() k次,以将游戏棋子向前移动k个位置,并为你处理轮换和其他所有事项。 - Kon

2
你可以使用两个变量来记录玩家的位置,比如说xy
如果这是一个圆形棋盘游戏(从我理解的角度来看是这样),你可以编写一个函数。
advance_one_space() { //let's suppose it turns clockwise and your array is board[y][x]
    if ( y==0 && x<15 ) 
        x++;
    else if ( y<15 && x==15 ) 
        y++;
    else if ( y==15 && x>0 ) 
        x--;
    else if ( y>0 && x==0 ) 
        y--;
}

调用这个函数60次会使游戏进行一轮,可能会获得200美元 :-)

如果您想向前移动n个空格:

advance(n) {
    advance_one_space();
    if (n>1)
        advance(n-1);
}

1
根据您在原问题中的评论,我了解到这是一个语义问题。
从玩家的角度来看,棋盘不是矩阵,正如您所暗示的那样,它只是一条直线,在最后一个位置(16 * 4 = 64)之后“传送”玩家到第一个位置。
而从GameEngine的角度来看,这是将在线上的位置转换为矩阵边框上的单元格的问题。
因此,请考虑您的GamePiece对象具有一个position属性,初始化为0。BoardGame具有boardSide属性,初始化为16,另一个属性boardLength等于boardSide * 4。
现在,每次玩家尝试移动时,您必须确保它不会“掉落”棋盘,然后将其正确地定位在屏幕上。
代码就像这样:
// When updating the game state
private void move(GamePiece piece, int spaces) {
    int destination = piece.position + spaces;
    if (destination >= BoardGame.boardLength) {
        destination -= BoardGame.boardLength;
    }
    piece.position = destination;
}

// When updating the game view
private void updateView() {
    (...)
    // Considering you store the game pieces on the gamePieces collection
    for (GamePiece p: gamePieces) {
        int side = Math.floor(p.position % BoardGame.boardSide); // Either 0, 1, 2 or 3
        switch (side) {
            case 0: // Top
                // Place Piece method takes: the piece, the X position and the Y position
                BoardGame.placePiece(p, BoardGame.boardSide - p.position, 0);
                break;
            case 1: // Right

                break;
            case 2: // Bottom

                break;
            case 3: // Left
                break;
        }
    }
    (...)
}

附言:我现在非常匆忙,无法完整地完成代码。希望这有所帮助,但我会稍后回来尝试完成它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接