Заставить игрока двигаться по игровой сетке 2D-массивов - PullRequest
4 голосов
/ 08 февраля 2012

Я создаю игру, используя двумерный массив 10х10. Игрок начинает игру с левого верхнего угла, обозначенного буквой «P», и цель состоит в том, чтобы игрок избегал препятствий, чтобы добраться до сокровища, обозначенного буквой «T», расположенного в правом нижнем углу.

Как бы я мог заставить игрока передвигаться по сетке с помощью команд Вверх / Вниз / Влево / Вправо?

Буду ли я использовать цикл for для подсчета элементов массива, чтобы обозначить движение?

Вот что у меня есть:

import java.util.Scanner;
import java.util.Random;

public class Adventure {

public static void main(String[] args) {
    char grid[][]= new char[10][10];
    Scanner move = new Scanner(System.in);
    System.out.println("Here is the current game board:");
    System.out.println("-------------------------------");

    for(int i=0; i<grid.length; i++) {          
        for(int j=0; j<grid.length; j++) {
            double random = Math.random();
            if(random <=.05) {
                grid[i][j]='*';
            }
            else if(random > .06 && random <= .15) {
                grid[i][j]='X';
            }
            else {
                grid[i][j]='.';
            }
            grid[0][0]='P';
            grid[9][9]='T';
            System.out.print(grid[i][j]);
        }
        System.out.println("");         
    }           
        System.out.print("Enter your move (U/D/L/R)>");
}
}

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

Похоже, вы используете упорядочение по ряду строк, судя по тому, как печатает ваша доска.Исходя из этого, вот что вам нужно сделать:

  1. Во-первых, вам нужно где-то сохранить позицию игрока.Прямо сейчас он жестко запрограммирован на 0,0.
  2. Во-вторых, вам нужно прочитать в ход игрока.Это должно произойти в цикле, где вы получаете движение, проверяете, разрешено ли это движение, выполняете движение и отображаете результаты.
  3. В-третьих, вы должны иметь возможность рассчитывать новую позицию на основев пути.Up означает row -= 1.Право означает column += 1.И т. Д.
  4. Учитывая новые координаты, вы должны убедиться, что ход действителен.По крайней мере, вы должны помешать им сойти с доски, но вы также можете запретить им входить в квадрат с препятствием и т. Д.
  5. Как только вы узнаете, что ход действителен, вы должныобновите переменные, в которых вы храните текущие координаты.
  6. В конце цикла вам необходимо перерисовать доску.

В этом ее основная суть.Прямо сейчас вы делаете все в main(), и это нормально, но если бы это был я, я бы начал разбивать вещи на отдельные методы, такие как InitializeBoard(), GetNextMove(), CheckIfMoveIsValid(int r, int c) и так далее.Таким образом, main() становится высокоуровневым представлением вашего игрового цикла, а внутренности различных операций разделены на части и с ними легче работать.Это потребует хранения таких вещей, как игровая доска, в переменных класса, а не в локальных переменных, что на самом деле должно упростить обнаружение препятствий, чем было бы в настоящее время.

2 голосов
/ 08 февраля 2012

Вы должны следить за текущей позицией игрока и просто обновлять эти переменные.начальные значения будут (0,0), как вы сказали.

int px = 0;
int py = 0;

, когда ход сделан, обновите переменные соответственно:

grid[px][py] = <empty cell>;
switch (move) {
  case 'u': py += 1; break;
  case 'r': px += 1; break;
  ...
}
grid[px][py] = 'P';

конечно, вы не должны просто обновлятьсязначения «вслепую», вы должны вставить некоторую логику проверки, чтобы следовать правилам игры:

if (grid[px][py] != <obstacle> )
   // update player coordinates...
0 голосов
/ 08 февраля 2012

Все вышеперечисленные ответы великолепны.Вот несколько советов, которые я бы сделал:

Вместо двумерного массива char я бы создал пользовательский объект, такой как Space , и определил быдвумерный массив пространств (например, Space [] []).Для этого есть несколько причин:

  1. Пробел можно задавать различными способами (вместо одного символа).Например, Space [i] [j] .hasTreasure () может вернуть логическое значение, чтобы вы знали, нашли ли вы клад.
  2. Если вы хотите добавить функциональность позже, это так же просто, как добавитьатрибут вашего класса Space.Опять же, вы не ограничены одним персонажем здесь.

Еще к вашему вопросу о движении, я бы также порекомендовал несколько вещей.По аналогии с предложением redneckjedi о методе CheckIfMoveIsValid (), я бы передал сетку и направление движения в качестве параметров и вернул логическое значение.Чтобы избежать проблем с ArrayIndexOutOfBounds, я бы также предложил добавить ряд / столбец стен с каждой стороны.Я бы расширил сетку до 12x12 и поставил бы полосу блоков типа препятствий снаружи.Это гарантирует, что вы не сможете выйти за пределы сетки, поскольку удар по стене всегда будет возвращать «ложь» при действительном движении.

...