001 package ai;
002
003 import java.io.ByteArrayOutputStream;
004 import java.io.PrintStream;
005 import java.util.ArrayList;
006 import java.util.Collection;
007 import java.util.Map;
008 import java.util.Properties;
009
010 import net.antichess.ai.AiPlayerFactory;
011 import net.antichess.ai.ChatHistoryViewer;
012 import net.antichess.ai.ChatProxy;
013 import core.Color;
014 import core.Piece;
015 import core.Player;
016 import core.Position;
017 import core.PowerupHelper;
018
019 /**
020 * Implementation of AIPlayerFactory - See http://antichess.mit.edu:8080/core/index.html
021 */
022 public class AIFactory implements AiPlayerFactory{
023 public static final String PROPERTY_BLACK_NAME = "antichess.blackPlayerName";
024 public static final String PROPERTY_INIT_TIME_BLACK = "antichess.initTime.black";
025 public static final String PROPERTY_WHITE_NAME = "antichess.whitePlayerName";
026 public static final String PROPERTY_INIT_TIME_WHITE = "antichess.initTime.white";
027 public static final String PROPERTY_TIMED_GAME = "antichess.timedGame";
028 public static final String PROPERTY_RULE_SET = "antichess.ruleSet";
029 public static final String PROPERTY_POWERUP_PLACEMENT = "antichess.powerupPlacement";
030
031 /**
032 * See http://antichess.mit.edu:8080/core/index.html
033 */
034 public AIFactory()
035 {
036 }
037
038 public Player createPlayer(boolean isWhite, int whiteTime, int blackTime,
039 String powerups){
040 Properties props = new Properties();
041 props.setProperty(PROPERTY_INIT_TIME_BLACK, ""+whiteTime);
042 props.setProperty(PROPERTY_INIT_TIME_WHITE, ""+blackTime);
043 if (powerups == null) {
044 props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007");
045 } else {
046 props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007-powerups");
047 props.setProperty(PROPERTY_POWERUP_PLACEMENT, powerups);
048 }
049 //No chat or persistent state
050 return createPlayer(isWhite, props, null, null, null, 0);
051 }
052 public Player createPlayer(boolean isWhite, int whiteTime, int blackTime,
053 String powerups, int w1, int w2, int w3, int w4){
054 Properties props = new Properties();
055 props.setProperty(PROPERTY_INIT_TIME_BLACK, ""+whiteTime);
056 props.setProperty(PROPERTY_INIT_TIME_WHITE, ""+blackTime);
057 if (powerups == null) {
058 props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007");
059 } else {
060 props.setProperty(PROPERTY_RULE_SET, "6170-fall-2007-powerups");
061 props.setProperty(PROPERTY_POWERUP_PLACEMENT, powerups);
062 }
063 //No chat or persistent state
064 return createPlayer(isWhite, props, null, null, null, 0, w1, w2, w3, w4);
065 }
066
067 /**
068 * Wrapper to turn a ChatProxy into a PrintStream.
069 */
070 private class ChatOutput extends PrintStream {
071 private ChatProxy proxy;
072
073 public ChatOutput(ChatProxy p){
074 super(new ByteArrayOutputStream());
075 proxy = p;
076 }
077
078 public void println(String s){
079 proxy.sendChat(s);
080 }
081 }
082
083 /**
084 * See http://antichess.mit.edu:8080/core/index.html
085 */
086 public Player createPlayer(boolean isWhite, Properties gameProperties,
087 ChatProxy chatProxy,
088 ChatHistoryViewer chatHistoryViewer,
089 byte[] persistentState,
090 int persistentStateSizeLimit) {
091 return createPlayer(isWhite, gameProperties, chatProxy, chatHistoryViewer,
092 persistentState, persistentStateSizeLimit, -100, 0, 0, 1);
093 }
094 public Player createPlayer(boolean isWhite, Properties gameProperties,
095 ChatProxy chatProxy,
096 ChatHistoryViewer chatHistoryViewer,
097 byte[] persistentState,
098 int persistentStateSizeLimit,
099 int w1, int w2, int w3, int w4) {
100 Color c = (isWhite ? Color.WHITE : Color.BLACK);
101 Heuristic h = new PieceHeuristic();
102 Heuristic h2 = new NegativePieceHeuristic();
103 Heuristic h3 = new ScaledPieceHeuristic();
104 Heuristic h4 = new PawnWeightedPieceHeuristic(w1, w2, w3, w4);
105 PrintStream p = System.out;
106 Map<Position, Piece> diffs = null;
107 String powerupState = gameProperties.getProperty(PROPERTY_POWERUP_PLACEMENT);
108 if (chatProxy != null) {
109 p = new ChatOutput(chatProxy);
110 p.println("Starting up...");
111 }
112 if (powerupState != null &&
113 gameProperties.getProperty( PROPERTY_RULE_SET ) ==
114 "6170-fall-2007-powerups") {
115 diffs = PowerupHelper.stringToMap(powerupState);
116 }
117 if (isWhite) {
118 return new OptimizingAlphaBetaPlayer(c, h4, 2, p, diffs);
119 } else {
120 return new OptimizingAlphaBetaPlayer(c, h4, 2, p, diffs);
121 }
122 }
123
124 /**
125 * See http://antichess.mit.edu:8080/core/index.html
126 */
127 public Collection<String> getSupportedRulesets() {
128 Collection<String> l = new ArrayList<String>();
129 l.add("6170-fall-2007");
130 l.add("6170-spring-2007-encastle");
131 l.add("6170-fall-2007-powerups");
132 return l;
133 }
134 }