3

我很好奇在 Java 中移动二维数组的最简单方法是什么?我为游戏板创建了一个二维数组,并使用它来跟踪游戏棋子的位置。因此,如果我有一个 16x16 二维数组,我该如何制作它,以便玩家可以在棋盘上移动 X 个空间。

我知道这些碎片将从:

[0][0] -> [0][16] - 顶部

然后

[0][16] -> [16][16] - 右侧

然后

[16][16] -> [16][0] - 底部

然后最后回到 [0][0] 的主空间。

[16][0] -> [0][0] - 左侧

任何帮助或建议将不胜感激!

编辑:我希望我能接受多个正确答案....叹息;(

4

3 回答 3

2

根据您的评论,您可以使用以下伪代码实现对移动的限制。我不是 100% 确定这是否是您想要的,但希望它会有所帮助

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
于 2013-07-11T17:36:19.037 回答
2

您可以在 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);
}
于 2013-07-11T17:44:41.953 回答
1

根据您对原始问题的评论,我理解这是语义问题。

从玩家的角度来看,棋盘不是矩阵,正如您所暗示的那样,它只是一条直线,恰好在最后一个位置(16 * 4 = 64)之后将玩家“传送”到第一个位置。

从 GameEngine 的角度来看,就是将线上的位置转换为矩阵边界上的单元格。

因此,假设您的GamePiece对象有一个position属性,用 0 初始化。 具有用 0初始化BoardGame的属性和另一个等于 的属性。boardSide16boardLengthboardSide * 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;
        }
    }
    (...)
}

PS:我现在很着急,无法正确完成代码。希望这会有所帮助,但我稍后会回来并尝试完成它。

于 2013-07-11T18:47:47.823 回答