001    package ai;
002    import java.util.*;
003    
004    import core.*;
005    import rules.*;
006    
007    /**
008     * The PawnWeightedHeuristic computes a bunch of values to consider,
009     * then ignores most of them because they don't actually help.
010     */
011    public class PawnWeightedHeuristic implements Heuristic {
012    
013        /**
014         * @see Heuristic
015         */
016        public int heuristic(GameState currentState) {
017            int total = 0;
018            Board board = currentState.getBoard();
019            Color c = currentState.getCurrentColor();
020            Map<Color, Integer> numPawns = new EnumMap<Color, Integer>(Color.class);
021            Map<Color, Integer> totalPawnPush = new EnumMap<Color, Integer>(Color.class);
022            for(Color pc: Color.colors){
023                numPawns.put(pc, 0);
024                totalPawnPush.put(pc, 0);
025            }
026            for(int x = 0; x < 8; x++){
027                for(int y = 0; y < 8; y++){
028                    Piece p = board.get(x, y);
029                    Color pc = p.getColor();
030                    if (p instanceof Pawn){
031                        numPawns.put(pc, numPawns.get(pc)+1);
032                        totalPawnPush.put(pc, totalPawnPush.get(pc) + y);
033                    }
034                }
035            }
036            totalPawnPush.put(Color.WHITE, 7*numPawns.get(Color.WHITE) - 
037                              totalPawnPush.get(Color.WHITE));
038    
039            for(Color pc: Color.colors) {
040                int colorValue = (numPawns.get(pc) * -100 -
041                                  totalPawnPush.get(pc));
042                total += (c == pc ? 1 : -1) * colorValue;
043            }
044            return total;
045        }
046    }