package gameengine;
import org.apache.log4j.LogManager;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
/**
* Created by andrew on 11/30/14.
*/
public class ChineseCheckersBoard {
private static final int[][] BOARD_COORDS = {
{0,0},{-1,1},{-1,0},{0,-1},{1,-1},{1,0},{0,1},{-2,2},{-1,2},
{0,2},{1,1},{2,0},{2,-1},{2,-2},{1,-2},{0,-2},{-1,-1},{-2,0},
{-2,1},{-3,2},{-3,1},{-3,0},{-2,-2},{-2,-1},{0,-3},{-1,-2},
{1,-3},{2,-3},{3,-3},{3,-2},{3,-1},{3,0},{2,1},{1,2},{0,3},{-1,3},
{-2,3},{-3,3},{-3,-1},{-4,0},{-4,1},{-4,2},{-4,3},{-4,4},{-3,4},
{-2,4},{-1,4},{0,4},{-1,-3},{0,-4},{1,-4},{2,-4},{3,-4},{4,-4},
{4,-3},{4,-2},{4,-1},{4,0},{3,1},{2,2},{1,3},{2,-5},{3,-5},{3,-6},
{5,-3},{6,-3},{5,-2},{3,2},{3,3},{2,3},{-2,5},{-3,6},{-3,5},{-5,3},
{-6,3},{-5,2},{-3,-2},{-3,-3},{-2,-3},{1,-5},{2,-6},{3,-7},{4,-8},
{4,-7},{4,-6},{4,-5},{5,-4},{6,-4},{7,-4},{8,-4},{7,-3},{6,-2},
{5,-1},{4,1},{4,2},{4,3},{4,4},{3,4},{2,4},{1,4},{-1,5},{-2,6},{-3,7},
{-4,8},{-4,7},{-4,6},{-4,5},{-5,4},{-6,4},{-7,4},{-8,4},{-7,3},{-6,2},
{-5,1},{-4,-1},{-4,-2},{-4,-3},{-4,-4},{-3,-4},{-2,-4},{-1,-4}
};
private static final int[][] NORTHWEST = {{-4,-4},{-4,-3},{-3,-4},{-4,-2},{-3,-3},{-2,-4},{-4,-1},{-3,-2},{-2,-3},{-1,-4}};
private static final int[][] NORTH = {{4,-8},{3,-7},{4,-7},{2,-6},{3,-6},{4,-6},{1,-5},{2,-5},{3,-5},{4,-5}};
private static final int[][] NORTHEAST = {{8,-4},{7,-4},{7,-3},{6,-4},{6,-3},{6,-2},{5,-4},{5,-3},{5,-2},{5,-1}};
private static final int[][] SOUTHEAST = ChineseCheckersBoard.reflect(NORTHWEST);
private static final int[][] SOUTH = ChineseCheckersBoard.reflect(NORTH);
private static final int[][] SOUTHWEST = ChineseCheckersBoard.reflect(NORTHEAST);
private static final org.apache.log4j.Logger LOG = LogManager.getLogger(ChineseCheckersBoard.class);
// Reflect points across the origin
private static int[][] reflect(int[][] source){
// Deep copy!
int[][] result = source.clone();
for(int i = 0; i < result.length; i++){
result[i] = source[i].clone();
}
for(int[] pt : result){
pt[0] = -pt[0];
pt[1] = -pt[1];
}
return result;
}
private final HashMap<HexPoint, ChineseCheckersSpot> spots;
public ChineseCheckersBoard(List<Player> players){
spots = new HashMap<HexPoint, ChineseCheckersSpot>();
assert(players.size() == 6);
LOG.info(players.get(0));
claim(players.get(0), NORTH);
claim(players.get(1), NORTHEAST);
claim(players.get(2), SOUTHEAST);
claim(players.get(3), SOUTH);
claim(players.get(4), SOUTHWEST);
claim(players.get(5), NORTHWEST);
LOG.info("NORTH: ");
for (int[] pos : NORTH) {
LOG.info(Arrays.toString(pos));
}
// Fill in middle of board
for (int[] coords : BOARD_COORDS){
HexPoint location = new HexPoint(coords);
if(!this.spots.containsKey(location)) this.spots.put(location, new ChineseCheckersSpot(location, null));
}
}
public ChineseCheckersSpot getSpot(HexPoint location){
return this.spots.get(location);
}
// public List<ChineseCheckersSpot> getSpotsOccupiedByPlayer(Player player){
// List<ChineseCheckersSpot> pieces = new ArrayList<ChineseCheckersSpot>();
// for(ChineseCheckersSpot spot : this.spots.values()){
// if(spot.getOccupant() == player) pieces.add(spot);
// }
// return pieces;
// }
//
// public List<ChineseCheckersSpot> getAvailableMovesFromSpot(ChineseCheckersSpot spot){
//
// }
private void claim(Player player, int[][] corner){
for(int[] coords : corner){
HexPoint location = new HexPoint(coords);
LOG.info("Putting player: " + player.getReplicaId() + " in spot " + location);
this.spots.put(location, new ChineseCheckersSpot(location, player));
}
}
}