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++;
}
}
}