添付ソースコード

package jp.nora.economics.labor;
import java.util.ArrayList;
import java.util.Iterator;
public class SlaveMaster {
	public class Slave {
		long wallet;
		Slave(){
			init();
		}
		String name(){
			return getClass().getSimpleName();
		}
		void init(){
			wallet = 10000;
		}
		boolean spend(){
			wallet -= 3000;
			return wallet < 0;
		}
		long bid(int day){
			return 5000;
		}
		void getPayment(int day){
			wallet += bid(day);
		}
		void recoverPayment(int day){
			wallet -= bid(day);
		}
		long getWallet(){
			return wallet;
		}
	}
	public class Slave2 extends Slave {
		long bid(int day){
			return 3000;
		}
	}
	public class King extends Slave {
       long bid(int day){
          if ( day <= 4 && check(day)  ){
             return 1;
          } else if ( day <= 4 ) {
             return 500;
          } else {
             return 3000;
        }
       }
              boolean check(int day){
                 long diff = 12500-2500*day;
                 return wallet < diff; 	
              }
	}
	public class Nora extends Slave {
		ArrayList<Integer> c;
		void init(){
			super.init();
			c = new ArrayList<Integer>();
		}
		long bid(int day){
			while (c.size()<=day){
				int v = (int)(Math.random()*5000)+1;
				c.add(new Integer(v));
			}
			return c.get(day-1);
		}
	}
	ArrayList<Slave> slaves;
	void init(){
		slaves = new ArrayList<Slave>();
		slaves.add(new Slave()); // and so on. many instances
		slaves.add(new Slave2());
		slaves.add(new King());
		slaves.add(new Nora());
	}
	void print(int day){
		System.out.println("-----");
		for(Slave s:slaves){
			System.out.print(s.name());
			System.out.print(" ");
			System.out.print(s.bid(day));
			System.out.print(" ");
			System.out.println(s.getWallet());
		}
	}
	void selection(int day){
		Slave max = null;
		for (Slave s:slaves){
			if ( max == null )
				max = s;
			if ( max.bid(day) < s.bid(day)){
				max = s;
			}
			s.getPayment(day);
		}
		max.recoverPayment(day);
	}
	boolean spendAll(){
		boolean flag = false;
		for(Slave s:slaves){
			flag |= s.spend();
		}
		return flag;
	}
	void dead(){
		Iterator<Slave> i = slaves.iterator();
		while ( i.hasNext()){
			Slave s = i.next();
			if ( s.getWallet() < 0 ) {
				System.out.println(s.name()+":dead");
				i.remove();
			}
		}
	}
	public static void main(String args[]){
		SlaveMaster  sm = new SlaveMaster();
		sm.init();
		sm.run();
	}
	public void run(){
		while (slaves.size()> 1){
			oneTrial();
			reset();
		}
	}
	void reset(){
		for(Slave s:slaves){
			s.init();
		}
	}
	public void oneTrial(){
		int day = 1;
		while ( true){
			print(day);
			selection(day);
			if ( spendAll()){
				dead(); 
				return;
			}
			day++;
		}
	}
}