2015-11-07 3 views
2

поэтому игрок ia на 2-мерном массиве, когда я делаю действие, я хочу, чтобы игрок переместился на один из 8 доступных блоков вокруг него, приведенный ниже код перемещает его случайным образом, но делает это дваждыперемещается в новый экземпляр в 2-мерном массиве случайным образом

Карта Перед Moving

GrassGrassGrassGrass

Grass Rek GrassGrass

GrassGrassGrassGrass

Gr assGrassGrassGrass

Случайное движение

0 0 // Это не должно происходить

Карта После перемещения

GrassGrassGrassGrass

GrassGrassGrassGrass

GrassGrassGr assGrass

GrassGrassGrass Rek

import java.util.Random; 

public class command_Movment implements command_Move { 


inSwamp map = new inSwamp(); 
inSwamp rek = new Rek(); 
Random random = new Random(); 


int row = random.nextInt(3); 
int col = random.nextInt(3); 

@Override 
public Command move() { 

    for (int i = 0; i < map.grid.length; i++) { 
     for (int j = 0; j < map.grid[i].length; j++) { 

      if (map.grid[i][j] == rek.getName()) { 

       try { 
        map.grid[i][j] = "Grass"; 
        if (row == 0) { 
         i++; 
        } 
        if (row == 1) { 
         i--; 
        } 

        if (col == 0) { 
         j++; 
        } 
        if (col == 1) { 
         j--; 
        } 

        map.grid[i][j] = rek.getName(); 
        System.out.println(col + "  " + row); 

        break; 

       } catch (ArrayIndexOutOfBoundsException exception) { 
        if (row == 0) { 
         i--; 
        } 
        if (row == 1) { 
         i++; 
        } 

        if (col == 0) { 
         j--; 
        } 
        if (col == 1) { 
         j++; 
        } 
        map.grid[i][j] = rek.getName(); 
        System.out.println("Error"); 

        break; 
       } 



     } 
    } 


} 

    return null; 

} }

ответ

2

Во-первых, вы не должны использовать == для сравнения строк, вы должны использовать метод equals. поэтому замените if (map.grid[i][j] == rek.getName()) на if (map.grid[i][j].equals(rek.getName())).

Редактировать: ПОЖАЛУЙСТА, не используйте этикетку, чтобы сломать модульность программы! Пожалуйста, не используйте исключение ArrayIndexOutofBound для определения правильности индекса массива. Исключением должно быть НЕ. Сначала нужно проверить индекс.

Я обновил свою программу для вашего случайного перемещения: в основном, я хочу, чтобы вы: 1) произвольно перемещайтесь или двигайтесь вниз от исходного положения 2) если движение вверх или перемещение вниз превышает границу матрицы, т двигаться в этом направлении.

Следующая программа должна перемещать rek одному из своих 8 соседей случайным образом, не вызывая какого-либо ArrayIndexOutOfBoundException.

public Command move() { 
    // randomly determine the moving direction 
    // -1 means move left, 1 means move right 
    int horizontal_direction = Math.random() > 0.5 ? -1 : 1; 
    // -1 means move up, 1 mean move down 
    int vertical_direction = Math.random() > 0.5 ? -1 : 1; 

    for (int i = 0; i < map.grid.length; i++) { 
     for (int j = 0; j < map.grid[i].length; j++) { 

      if (map.grid[i][j].equals(rek.getName())) { 
       map.grid[i][j] = "Grass"; // replace rek's current position with Grass\ 

       // if the newRow exceeds the boundaries, don't move in that direction 
       int newRow = i + horizontal_direction; 
       if (newRow < 0 || newRow == map.grid.length) 
        newRow = i; 

       // if the newCol exceeds the boundaries, don't move in that direction 
       int newCol = j + vertical_direction; 
       if (newCol < 0 || newCol == map.grid[i].length) 
        newCol = j; 

       map.grid[newRow][newCol] = rek.getName(); // move rek to the new position 

       System.out.println(newRow + "  " + newCol); 
       break; 
      } 
     } 
    } 
    return null; 
} 
+0

Спасибо, я изменил их на .equals сейчас, и код не был нигде в сетке, только 8 доступных блоков вокруг rek. – Help

+0

@MichaelAlexanderDelaney обновил код, это должно соответствовать вашим требованиям. – Bon

0

Добавить ярлык как это ваш внешний цикл:

outer: 
for (int i = 0; i < map.grid.length; i++) { 
    ...... 
} 

А в попробовать блок, разорвать петлю этого путь:

map.grid[i][j] = rek.getName(); 
System.out.println(col + "  " + row); 

break outer; 
+0

Спасибо, что отлично поработал, никогда не знал об этой функции до – Help

+1

. Вы можете решить эту проблему иначе. Но такой вид «взлома» кажется полезным в такой ситуации. Вдохновленный инструкциями GOTO и JUMP TO сборки. –

+0

@JDev Я никогда не знал, что это существует на Java.Я проголосовал, потому что я согласен с вашим комментарием - это очень хаки и ломает модульность программы. – Bon

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