Russells Final Project
<< Matthew's Final Project | OldProjectsTrailIndex | Don and Nick's Violin Hero >>
Click here for a working demonstration
PrisonerGame.java
import java.util.Scanner;
public class PrisonerGame
{
public static void main(String[] args)
{
boolean done = false;
String input = "";
Prisoner prisoner1 = null;
Prisoner prisoner2 = null;
int iterations = 0;
Scanner in = new Scanner(System.in);
System.out.println("Hello! And Welcome to the Prisoner's Dilemma!");
System.out.println("You and a friend are in separate interrogation rooms, and are suspected of a crime.");
System.out.println("You have two options: confess or keep your mouth shut.");
System.out.println("Here's the catch: confess, etc.");
while (!done)
{
System.out.print("Please Enter the Type of Prisoner 1 (Human, Jesus, Lucifer, Massive Strike, Tit for Tat, Random, Linear Regression): ");
input = in.nextLine();
if (input.equalsIgnoreCase("Human"))
{
System.out.print("Please Enter the Name of Prisoner 1: ");
String humanName = in.next();
prisoner1 = new Human(humanName);
}
else if (input.equalsIgnoreCase("Jesus"))
{
prisoner1 = new Jesus();
}
else if (input.equalsIgnoreCase("Lucifer"))
{
prisoner1 = new Lucifer();
}
else if (input.equalsIgnoreCase("Massive Strike"))
{
prisoner1 = new MassiveStrike();
}
else if (input.equalsIgnoreCase("Tit for Tat"))
{
prisoner1 = new TitForTat();
}
else if (input.equalsIgnoreCase("Random"))
{
prisoner1 = new RandomPrisoner();
}
else if (input.equalsIgnoreCase("Linear Regression"))
{
prisoner1 = new LinRegStrategy();
}
System.out.print("Please Enter the Type of Prisoner 2 (Human, Jesus, Lucifer, Massive Strike, Tit for Tat, Random, Linear Regression): ");
input = in.nextLine();
if (input.equalsIgnoreCase("Human"))
{
String inputName = "";
System.out.print("Please Enter the Name of Prisoner 2: ");
prisoner2 = new Human(inputName);
}
else if (input.equalsIgnoreCase("Jesus"))
{
prisoner2 = new Jesus();
}
else if (input.equalsIgnoreCase("Lucifer"))
{
prisoner2 = new Lucifer();
}
else if (input.equalsIgnoreCase("Massive Strike"))
{
prisoner2 = new MassiveStrike();
}
else if (input.equalsIgnoreCase("Tit for Tat"))
{
prisoner2 = new TitForTat();
}
else if (input.equalsIgnoreCase("Random"))
{
prisoner2 = new RandomPrisoner();
}
else if (input.equalsIgnoreCase("Linear Regression"))
{
prisoner2 = new LinRegStrategy();
}
System.out.print("Please Enter the Number of iterations: ");
iterations = in.nextInt();
Judge a = new Judge(prisoner1, prisoner2);
a.iterate(iterations);
System.out.print(prisoner1.getName()+" (Prisoner 1): ");
System.out.println(a.getScore1());
System.out.print(prisoner2.getName()+" (Prisoner 2): ");
System.out.println(a.getScore2());
if (a.getScore1() > a.getScore2())
System.out.println(prisoner1.getName()+" Wins!!!");
if (a.getScore1() < a.getScore2())
System.out.println(prisoner2.getName()+" Wins!!!");
if (a.getScore1() == a.getScore2())
System.out.println("It's a Tie!!!");
System.out.print("Would you like to play again? (Y/N): ");
if (in.next().equalsIgnoreCase("N"))
done = true;
}
System.out.println("Thank You for Playing!");
}
}
- Judge.java
public class Judge
{
private Prisoner p1;
private Prisoner p2;
private double score1, score2;
private double reward;
private double punishment;
private double temptation;
private double suckerReward;
public Judge(Prisoner p1, Prisoner p2)
{
setP1(p1);
setP2(p2);
this.setReward(0.5);
this.setPunishment(5.0);
this.setTemptation(0.0);
this.setSuckerReward(10.0);
this.setScore1(0);
this.setScore2(0);
}
public void judge()
{
boolean choice1 = p1.choose();
boolean choice2 = p2.choose();
if (choice1 == choice2)
{
if (choice1 == Prisoner.BETRAY)
{
p1.record(choice2);
p2.record(choice1);
score1 = score1 + punishment;
score2 = score2 + punishment;
}
else
{
p1.record(choice2);
p2.record(choice1);
score1 = score1 + reward;
score2 = score2 + reward;
}
}
if (choice1 != choice2)
{
if (choice1 == Prisoner.BETRAY)
{
p1.record(choice2);
p2.record(choice1);
score1 = score1 + suckerReward;
score2 = score2 + temptation;
}
else
{
p1.record(choice2);
p2.record(choice1);
score1 = score1 + suckerReward;
score2 = score2 + temptation;
}
}
}
public String iterate(int times)
{
String result = "";
p1.reset();
p2.reset();
this.setScore1(0);
this.setScore2(0);
for (int i = 0; i < times; i++)
judge();
if (score1 > score2)
{
result = p1.getName() + ": " + score1;
result = result + " " + p2.getName() + ": " + score2;
}
else
{
result = p2.getName() + ": " + score2;
result = result + " " + p1.getName() + ": " + score1;
}
return result;
}
public void setP1(Prisoner p1)
{
this.p1 = p1;
}
public Prisoner getP1()
{
return p1;
}
public void setP2(Prisoner p2)
{
this.p2 = p2;
}
public Prisoner getP2()
{
return p2;
}
public void setReward(double reward)
{
this.reward = reward;
}
public double getReward()
{
return reward;
}
public void setPunishment(double punishment)
{
this.punishment = punishment;
}
public double getPunishment()
{
return punishment;
}
public void setSuckerReward(double suckerReward)
{
this.suckerReward = suckerReward;
}
public double getSuckerReward()
{
return suckerReward;
}
public void setTemptation(double temptation)
{
this.temptation = temptation;
}
public double getTemptation()
{
return temptation;
}
public void setScore2(double score2)
{
this.score2 = score2;
}
public double getScore2()
{
return score2;
}
public void setScore1(double score1)
{
this.score1 = score1;
}
public double getScore1()
{
return score1;
}
}
- Prisoner.java
import java.util.ArrayList;
public abstract class Prisoner
{
/**
* Constants
*/
public static final boolean BETRAY=false;
public static final boolean DEFECT=false;
public static final boolean SILENT=true;
public static final boolean COOP=true;
/**
* instance variables
*/
private String name;
private ArrayList<Boolean> history;
/**
* Constructors
*/
public Prisoner(String name){
this.setName(name);
this.history = new ArrayList<Boolean>();
}
public Prisoner(){
this("No Name");
}
/**
* Abstract methods that subclasses need to implement
*/
public abstract boolean choose();
/**
* Methods that will be inherited by all subclasses
*/
public void record(boolean opponentsChoice){
history.add(opponentsChoice);
}
public void reset(){
history=new ArrayList<Boolean>();
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public ArrayList<Boolean> getHistory() {
return history;
}
public boolean lastTurn(){
if (history.size()==0) return Prisoner.COOP;
return history.get(history.size()-1);
}
public boolean firstTurn(){
return history.size()==0;
}
}
- LinRegStrategy.java
import java.util.ArrayList;
import java.util.Random;
public class LinRegStrategy extends Prisoner
{
private Random generator;
private double slope;
private int numTrue;
private int numFalse;
private ArrayList<Integer> x;
private ArrayList<Integer> y;
public LinRegStrategy()
{
super("Linear Regression Forecasting");
generator = new Random();
slope = 0;
numTrue = 0;
numFalse = 0;
x = new ArrayList<Integer>();
y = new ArrayList<Integer>();
}
public boolean choose()
{
boolean result = false;
if (getHistory().size() == 0)
return false;
updateLine();
linearRegression();
if (slope == 1)
result = generator.nextBoolean();
if (slope > 1)
{
result = true;
}
if (slope < 1)
{
result = false;
}
return result;
}
public void linearRegression()
{
double sumx = 0;
double sumy = 0;
double sumx2 = 0;
for (int i = 0; i < x.size(); i++)
{
sumx += x.get(i);
sumx2 += x.get(i) * x.get(i);
sumy += y.get(i);
}
double xbar = sumx / x.size();
double ybar = sumy / y.size();
double xxbar = 0;
double yybar = 0;
double xybar = 0;
for (int i = 0; i < x.size(); i++)
{
xxbar += (x.get(i) - xbar) * (x.get(i) - xbar);
yybar += (y.get(i) - ybar) * (y.get(i) - ybar);
xybar += (x.get(i) - xbar) * (y.get(i) - ybar);
}
slope = xybar / xxbar;
}
public void updateLine()
{
if (getHistory().size() == 0)
return;
if (getHistory().size() > 0)
{
boolean next = getHistory().get(getHistory().size()-1);
if (next == true)
numTrue++;
else
numFalse++;
}
x.add(numTrue);
y.add(numFalse);
}
}
- Human.java
import java.util.Scanner;
public class Human extends Prisoner
{
private Scanner in = new Scanner(System.in);
public Human(String Name)
{
super(Name);
}
public Human()
{
super("Unknown");
}
public boolean choose()
{
boolean result = false;
String input = "";
for (boolean a : getHistory())
{
if (a == false)
System.out.println("Betrayal ");
else
System.out.println("Cooperate ");
}
System.out.print("What would you like to do? (Betray or Cooperate): ");
input = in.next();
if (input.equalsIgnoreCase("Betray"))
result = Prisoner.BETRAY;
else if (input.equalsIgnoreCase("Cooperate"))
result = Prisoner.COOP;
return result;
}
}
- RandomPrisoner.java
import java.util.Random;
public class RandomPrisoner extends Prisoner
{
private Random generator;
public RandomPrisoner()
{
super("Random");
generator = new Random();
}
public boolean choose()
{
return generator.nextBoolean();
}
}
- MassiveStrike.java
public class MassiveStrike extends Prisoner
{
public MassiveStrike()
{
super("Massive Strike");
}
public boolean choose()
{
if (firstTurn())
return Prisoner.COOP;
for (boolean a : getHistory())
if (a == false)
return Prisoner.BETRAY;
return Prisoner.COOP;
}
}
- TitForTat.java
public class TitForTat extends Prisoner
{
public TitForTat()
{
super("Tit for Tat");
}
public boolean choose()
{
if (firstTurn())
return Prisoner.COOP;
if (this.lastTurn() == Prisoner.BETRAY)
return Prisoner.BETRAY;
return Prisoner.COOP;
}
}
- Jesus.java
public class Jesus extends Prisoner
{
public Jesus()
{
super("Jesus");
}
public boolean choose()
{
return Prisoner.COOP;
}
}
- Lucifer.java
public class Lucifer extends Prisoner
{
public Lucifer()
{
super("Lucifer");
}
public boolean choose()
{
return Prisoner.BETRAY;
}
}
