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 }