2016-07-01 4 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

を正しく理解していればそれを認識します。これがゲームロジックの場合、すべてのプレイヤーが同時にアイテムを獲得しない限り、すべてのプレイヤーに1つの変数を使用することは不適切です。遅くに参加した人、例えば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

あなたがAwesomeゲーム機能を更新しない限り、クラス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; 
    } 
} 

私はこれだけではなく、それらにアクセスするためのクラスを更新するように変更することができることを確信している:インスタンスは、私はすべてのインスタンスを評価するために別のクラスでは、このメソッドを使用していました。

関連する問題