2016-07-01 3 views
-2

저는 게임과 유사한 프로그램을 작성하고 있으며 클래스는 항목으로 사용해야합니다. 일반적으로 항목으로 보관하지만 모든 사람이 의미하는 바를하기 시작하기 위해 게임 일 10 시간을 기다려야합니다. 한 번에 모든 수업의 요일을 업데이트 할 수있는 방법이 있습니까? 정적 메서드를 사용하려고했지만 인스턴스 변수를 사용할 수 없어 작동하지 않습니다. 아마도 새로운 인스턴스가 만들어 질 때마다 확장되는 코드를 작성하려고 생각했지만 그것에 대해 이해할 수있는 것을 찾을 수는 없습니다. 메서드에 추가 할 수있는 방법이 있습니까?이 항목을 아무것도 만들지 않습니까? 이것은 내가 지금 무엇을 가지고 :Java에서 동시에 여러 클래스 인스턴스를 업데이트하는 방법

public class Tree 
    { 
     private boolean fullGrown; 
     private int day; 
     private int APDay; //apples per day 
     private static int totalApples; 
     public Tree() 
     { 
      fullGrown = false; 
      day = 0; 
      APDay = (int) (Math.random()*2) + 4; 
     } 

     public void updateDay() 
     { 
      day = day + 1; 
      if (day == 10) fullGrown = true; 
      if (fullGrown == true) totalApples = totalApples + APDay; 
     } 

     public void skipGrowth() 
     { 
      fullGrown = true; 
     } 
    } 

이 작동하지만, 별도로 모든 인스턴스에 대해 하루 업데이트해야합니다. 나는 모든 인스턴스를 동시에 업데이트하는 방법이 필요하다. 이는 실제 인터페이스가 아닌 코드에서도 사용됩니다. 도움이 될 수 있습니다.

+0

목록을 사용하여 인스턴스를 반복합니다. [무엇을 시도 했습니까?] (http://whathaveyoutried.com)? – ManoDestra

+2

아마도 Observer 패턴을 구현할 수 있을까요? 당신의 모델에 당신의 수업을 "듣는다"(예 : 일). "days"가 업데이트되면 모델 (observable)은 모든 view-item (옵저버) https://en.wikipedia.org/wiki/Observer_pattern – alexbt

+0

을 올바르게 인식합니다. 이것이 게임 로직이라면 모든 플레이어가 동시에 아이템을 얻지 않는 한 모든 플레이어에 대해 단일 변수를 사용하는 것은 부적절합니다. 예를 들어 6 일과 같이 늦게 가입 한 일부 사람들은 처음 10 일 동안 4 일을 기다려야합니다. – WSimpson

답변

1

관찰자 및 공장 패턴이 여기에서 좋은 후보로 보입니다.

나는 아래의 코드가 나머지를 설명 희망 당신

public interface DayEventListener { 
     public void onDay10(DayEvent DayEvent); 

}

public class DayEvent { 

    //... pojo 

} 

public class AwesomeGame { 

     private List<DayEventListener> dayEventListenerList = new ArrayList<>(); 

     public void addDayListener(DayEventListener del) { 
      dayEventListener.add(del); 
     } 

     public void fireDay10Event(DayEvent de) { 
      for(DayEventListener del : dayEventListenerList) { 
       del.onDay10(de); 

     } 
} 


public class Item implements DayEventListener { 
    //All constructors should be private 

    public static Item buildItem() { 
     Item Item = new Item(); 
     awesomeGame.addDayEventListener(Item); 
     return item; 

    } 
} 
+0

굉장한 게임 기능을 업데이트하고 싶지 않다면 클래스 Item이 addDayListener를 사용해야한다고 생각합니다. 또한 목록 이름 dayEventListenerList는 addDayListener 함수에서 dayEventListener로 호출됩니다. 패턴을 잘 사용합니다. – WSimpson

+0

인터페이스를 사용할만큼 충분히 배웠지 만 약간의 연구를하고 이것을 사용할 것입니다. –

0

그래서 제가 조사를 좀 해봤 내가 다른 프로젝트에서 작업하는 동안 난 내가하는 벡터를 사용할 수 있다는 것을 발견 나는 모든 기록을 가지고 지금

import java.util.Vector; 

    public class catcher 
    { 
     private static Vector allInstances = new Vector(); 
     private int catchLeft; 
     private String name; 

     public catcher(String name) 
     { 
      catchLeft = Integer.parseInt(name.substring(name.indexOf("#") + 1, name.length())); 
      catchLeft--; 
      this.name = name; 
      if (catchLeft != 0) allInstances.add(this); 
     } 

     public static synchronized Vector getAllInstances() 
     { 
      return (Vector) (allInstances.clone()); 
     } 

     public boolean check(String name, boolean change) 
     { 
      boolean foo; 
      if (this.name.equals(name)) 
      { 
       if (change == true) catchLeft--; 
       foo = true; 
      } 
      else foo = false; 
      if (catchLeft <= 0) this.finalize(); 
      return foo; 
     } 

     public void finalize() 
     { 
      allInstances.removeElement(this); 
     } 

     public static void clear() 
     { 
      allInstances.clear(); 
     } 
    } 

: 내 모든 인스턴스를 추적하는, 그래서 여기에 클래스

import java.util.Iterator; 
import java.util.Vector; 

public class recipe 
{ 
    private boolean checkForList(String name, boolean add) 
    { 
     Iterator list = catcher.getAllInstances().iterator(); 
     boolean running = true; 
     boolean booleanReturn = true; 
     while (running == true) 
     { 
      if (list.hasNext()) 
      { 
       catcher Foo = (catcher) (list.next()); 
       if (Foo.check(name, false) == true) 
       { 
        Foo.check(name, true); 
        running = false; 
        booleanReturn = true; 
       } 
      } 
      else 
      { 
       if (add == true) new catcher(name); 
       running = false; 
       booleanReturn = false; 
      } 
     } 
     return booleanReturn; 
    } 
} 

내가이 대신 그들에 액세스 할 수있는 클래스를 업데이트하기 위해 수정 될 수 있음을 확신 : 인스턴스, 나는 모든 인스턴스를 평가하기 위해 다른 클래스에서이 방법을 사용했다.

관련 문제