2013-07-11 2 views
3

Мне интересно, что было бы самым простым способом перемещения по 2-мерному массиву в Java? Я создал 2d-массив для игрового поля и использовал его, чтобы отслеживать позиции игровых предметов. Поэтому, если у меня есть массив 16x16 2d, как я могу это сделать, чтобы игроки могли перемещаться по доске X количество пробелов.Лучший способ передвижения 2-го массива (настольная игра)

Я знаю, что части будут двигаться от:

[0] [0] -> [0] [16] - TOP

затем

[0] [16] -> [ 16] [16] - Правая сторона

затем

[16] [16] -> [16] [0] - НИЖНИЙ

затем, наконец, ба ck в исходное пространство, являющееся [0] [0].

[16] [0] -> [0] [0] - ЛЕВАЯ СТОРОНА

Любая помощь или предложения будут высоко оценены!

EDIT: Я хотел бы принять несколько правильных ответов .... Вздох; (

+0

Не знаете, в чем ваш вопрос. У вас есть объекты, перемещающиеся по этим массивам? Вы отслеживаете позиции этих объектов внутри или снаружи? Что происходит? – Kon

+1

Непонятно, что вы пытаетесь сделать здесь. – Jokab

+0

Извините, я не уточнил, что хорошо, Да, я хочу, чтобы объекты перемещались по массиву. Но изобразите 2-й массив, как настольная игра Monopoly. Я отслеживаю там внутренние позиции там класса «GamePiece». Класс «BoardGame» управляет фрагментами и устанавливает их местоположения. Я просто не знаю, как реализовать правило, чтобы, если игрок попадает в космос [0] [16], как я могу сказать, чтобы он начал двигаться вниз к [1] ​​[16]. –

ответ

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 
+0

Да, границы, поэтому я предполагаю, что если я доберусь до границы правой стороны и все еще буду иметь несколько позиций для перемещения, мне нужно будет удерживать количество позиций, оставшихся для перемещения и перемещения соответственно, как только я сделаю переключатель для перемещения вниз. –

+0

Вам необязательно хранить в памяти количество позиций, оставшихся для перемещения. Все ваши потребности в логике движения хранятся в ваших переменных X и Y для ваших игровых предметов. Внедрите алгоритм moveNext(), который позаботится о работе для вас. Вы можете перегрузить метод методом moveNext (int k) {}, который сам вызывает moveNext() k-times, чтобы продвигать позицию игры k позиций, и она позаботится о поворотах и ​​обо всем остальном для вас. – Kon

2

Вы можете сохранить позицию игрока (ов) в двух переменных, скажем x и y.

Если это круглая настольная игра (от того, что я понимаю, что это), вы могли бы иметь функцию

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

Основываясь на ваш комментарий на вашем оригинальный вопрос я underst и что это вопрос семантики.

С точки зрения игрока, плата не является матрицей, как вы подразумевали, это просто прямая линия, которая случается, чтобы «телепортировать» игрока после последней позиции (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; 
     } 
    } 
    (...) 
} 

P.S .: я сейчас много в спешке и не может закончить код правильно. Надеюсь, это поможет, но я вернусь позже и попытаюсь закончить его.

 Смежные вопросы

  • Нет связанных вопросов^_^