2016-06-13 6 views
1

Извините, если это тривиально для большинства, но я просто не могу понять эту проблему!Вызов одного и того же метода несколько раз без перезаписывания предыдущих значений

Я создаю макет игры, где у меня есть начало, конец и прыжки. Есть порталы, где, если вы идете по белому порталу, вы продвигаетесь вперед, и есть черные, где вы идете назад. Я создал класс как POJO;

private int totalSize; 
private int minDice; 
private int maxDice; 
private int whitePortalStart; 
private int whitePortalEnd; 
private int blackPortalStart; 
private int blackPortalEnd; 
private int startPosition = 1; 
private int currentPosition; 

public GameObject(){} 

public int getTotalSize() { 
    return totalSize; 
} 

public void setTotalSize(int totalSize) throws Exception { 
    if(totalSize <= 0){ 
     throw new Exception("Can't have a total distance of less than or equal to 0"); 
    } else { 
     this.totalSize = totalSize; 
    } 
} 

public int getMinDice() { 
    return minDice; 
} 

public void setMinDice(int minDice) throws Exception { 
    if(minDice <= 0){ 
     throw new Exception("Can't have a min dice value of less than or equal to 0"); 
    } else { 
     this.minDice = minDice; 
    } 
} 

public int getMaxDice() { 
    return maxDice; 
} 

public void setMaxDice(int maxDice) throws Exception { 
    if(getMinDice() > maxDice){ 
     throw new Exception("Cant have minimum dice number greater than the larger dice number"); 
    } else { 
     this.maxDice = maxDice; 
    } 
} 

public int getWhitePortalStart() { 
    return whitePortalStart; 
} 

public void setWhitePortalStart(int whitePortalStart) throws Exception { 
    this.whitePortalStart = whitePortalStart; 
} 

public int getWhitePortalEnd() { 
    return whitePortalEnd; 
} 

public void setWhitePortalEnd(int whitePortalEnd) throws Exception { 
    this.whitePortalEnd = whitePortalEnd; 
} 

public int getBlackPortalStart() { 
    return blackPortalStart; 
} 

public void setBlackPortalStart(int blackPortalStart) throws Exception { 
    this.blackPortalStart = blackPortalStart; 
} 

public int getBlackPortalEnd() { 
    return blackPortalEnd; 
} 

public void setBlackPortalEnd(int blackPortalEnd) throws Exception { 
    this.blackPortalEnd = blackPortalEnd; 
} 

public GameObject builder(int n) throws Exception { 
    setTotalSize(n); 
    return this; 
} 

public GameObject whitePortal(int m, int o) throws Exception { 
    setWhitePortalStart(m); 
    setWhitePortalEnd(o); 
    return this; 
} 

public GameObject blackPortal(int o, int m) throws Exception { 
    setBlackPortalStart(o); 
    setBlackPortalEnd(m); 
    return this; 
} 

public GameObject dice(int i, int j) throws Exception { 
    setMinDice(i); 
    setMaxDice(j); 
    return this; 
} 

public int rollDice(){ 
    Random random = new Random(); 
    int min = getMinDice(); 
    int max = getMaxDice(); 

    return random.nextInt(max - min + 1) + min; 
} 

public void build(){ 
    int totalDistance = getTotalSize(); 
    currentPosition = startPosition; 

    while(currentPosition < totalDistance){ 
     int diceValue = rollDice(); 

     if(currentPosition + diceValue > getTotalSize()){ 
      System.out.println("CurrentPosition : " + (currentPosition + diceValue) + ", is larger than the total size of the road - " + totalSize); 
      continue; 
     } else if(currentPosition + diceValue == getWhitePortalStart()){ 
      System.out.println("You landed on a white portal. Advancing from position " + (currentPosition + diceValue) + " to " + getWhitePortalEnd()); 
      currentPosition = getWhitePortalEnd(); 
     } else if(currentPosition + diceValue == getBlackPortalStart()){ 
      System.out.println("You landed on a black portal. Moving from position " + (currentPosition + diceValue) + " to " + getBlackPortalEnd()); 
      currentPosition = getBlackPortalEnd(); 
     } else { 
      System.out.println("You landed on " + (currentPosition + diceValue)); 
      currentPosition += diceValue; 
     } 
    } 
} 

Так что в моем основном методе я называю это как создание и вызов этого класса;

WorldOfOz oz = new WorldOfOz(); 
    oz.go.builder(30) 
     .dice(1, 4) 
     .whitePortal(5, 12) 
     .blackPortal(13, 2) 
     .build(); 

Мой вопрос, когда я хочу добавить в более чем 1 whitePortal/blackPortal

WorldOfOz oz = new WorldOfOz(); 
    oz.go.builder(30) 
     .dice(1, 4) 
     .whitePortal(5, 12) 
     .whitePortal(18, 26) 
     .blackPortal(13, 2) 
     .build(); 

Значения 18 - 26 переопределение 5 - 12. Как я могу установить это так, что я могу иметь несколько белые и черные порталы?

ответ

5

Кажется, что вашей структуры данных недостаточно, чтобы решить эту проблему.

Вам необходимо определить коллекцию whitePortals и коллекцию blackPortals. Если вы это сделаете, вызовите метод whitePortal(5, 12), добавьте новый белый портал, устанавливающий значения белого портала только для белого портала.

Вам нужно определить класс Portal

public class Portal { 
    private int portalStart; 
    private int portalEnd; 
    ... 

    public Portal(int s, int e) { 
     this.portalStart = s; 
     this.portalEnd = e; 
    } 
} 

Тогда вы можете использовать его в GameObject следующим образом:

public GameObject { 
    List<Portal> whitePortals; 
    List<Portal> blackPortals; 


    public GameObject() { 
     whitePortals = new ArrayList<Portal>(); 
     blackPortals = new ArrayList<Portal>(); 
    } 

    public GameObject addWhitePortal(int m, int o) throws Exception { 
     whitePortals.add(new Portal(m, o)); 
     return this; 
    } 

    ... 

    // You need to change other methods to follow a different data structure 
} 
+0

Работал отлично, спасибо – Dan

0

Ну, вы можете использовать следующий подход:

  1. Ввести новый тип «Портал» с атрибутами начала и конца
  2. Заменить белый/черный портал атрибутов в классе со списками для белых и черных порталов (или любой другой тип коллекции вы любите)
  3. Заменить getWhite/Черные методы с доступом к спискам
  4. Refactor whitePortal и blackPortal метод для создания новых экземпляры объекта портала и добавить их в соответствующую коллекцию

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

Также, предполагая, что порталы являются коллекциями, вам, вероятно, необходимо добавить вспомогательные методы для работы на них. В зависимости от ваших фактических потребностей.

public class Portal 
{ 
    private int start; 
    private int end; 

    public Portal(int start, int end) { ... } 
    public getStart() {...} 
    public getEnd() {...} 
    public setStart(int end) {...} 
    public setEnd(int start) {...} 
} 

public class GameObject 
{ 
    ... 
    private List<Portal> whitePortals = new ArrayList<Portal>(); 
    private List<Portal> blackPortals = new ArrayList<Portal>(); 
    ... 

    public GameObject whitePortal(int m, int o) throws Exception { 
    whitePortals.add(new Portal(m, o)); 
    return this; 
    } 

    public GameObject blackPortal(int o, int m) throws Exception { 
    blackPortals.add(new Portal(m, o)); 
    return this; 
    } 
    ... 
} 
Смежные вопросы