statistics/src/main/java/cz/xelfi/quoridor/statistics/OpeningTree.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Jan 2010 22:51:17 +0100
branchstatistics-and-elo
changeset 179 c5fbddc4c590
parent 178 4b78d4f028b3
child 264 d60370059c3c
permissions -rw-r--r--
Renaming Board.board2HashCode to getCode()
     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * The contents of this file are subject to the terms of either the GNU
     5  * General Public License Version 2 only ("GPL") or the Common
     6  * Development and Distribution License("CDDL") (collectively, the
     7  * "License"). You may not use this file except in compliance with the
     8  * License. You can obtain a copy of the License at
     9  * http://www.netbeans.org/cddl-gplv2.html
    10  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    11  * specific language governing permissions and limitations under the
    12  * License.  When distributing the software, include this License Header
    13  * Notice in each file and include the License file at
    14  * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
    15  * particular file as subject to the "Classpath" exception as provided
    16  * by Sun in the GPL Version 2 section of the License file that
    17  * accompanied this code. If applicable, add the following below the
    18  * License Header, with the fields enclosed by brackets [] replaced by
    19  * your own identifying information:
    20  * "Portions Copyrighted [year] [name of copyright owner]"
    21  *
    22  * Contributor(s):
    23  *
    24  * Portions Copyrighted 2010 Martin Rexa
    25  */
    26 
    27 package cz.xelfi.quoridor.statistics;
    28 
    29 import cz.xelfi.quoridor.Board;
    30 import cz.xelfi.quoridor.Move;
    31 import cz.xelfi.quoridor.webidor.Game;
    32 import cz.xelfi.quoridor.webidor.CommentedMove;
    33 import cz.xelfi.quoridor.IllegalPositionException;
    34 import java.util.Map;
    35 import java.util.HashMap;
    36 
    37 /**
    38  *
    39  * @author Martin Rexa
    40  */
    41 public class OpeningTree {
    42     Map<String, OpeningTreeNode> nodes = new HashMap<String, OpeningTreeNode>();
    43     OpeningTreeNode root;
    44 
    45     public OpeningTree(){
    46         root = new OpeningTreeNode("ROOT");
    47         nodes.put("ROOT", root);
    48     }
    49 
    50     public OpeningTreeNode getRoot(){
    51         return root;
    52     }
    53 
    54     public OpeningTreeNode getNode(String hashCode){
    55         return nodes.get(hashCode);
    56     }
    57 
    58     public void processGame(Game game) throws IllegalPositionException{
    59         OpeningTreeNode node = root;
    60         OpeningTreeNode parentNode;
    61         OpeningTreeNode mirrorNode = root;
    62         OpeningTreeNode mirrorParentNode;
    63         Board board = Board.empty();
    64         Board mirrorBoard = Board.empty();
    65         root.addGame(game);
    66         for(CommentedMove move: game.getMoves()){
    67             if(!move.getMove().equals(Move.RESIGN)){
    68                 parentNode = node;
    69                 mirrorParentNode = mirrorNode;
    70                 board = board.apply(move.getMove());
    71                 mirrorBoard = mirrorBoard.apply(move.getMove().getMirrorMove());
    72                 String hashCode = board.getCode();
    73                 String mirrorHashCode = mirrorBoard.getCode();
    74                 node = nodes.get(hashCode);
    75                 if(node == null){
    76                     node = new OpeningTreeNode(hashCode);
    77                     nodes.put(hashCode, node);
    78                 }
    79                 node.addGame(game);
    80                 mirrorNode = nodes.get(mirrorHashCode);
    81                 if(mirrorHashCode.equals(hashCode)){
    82                     if(mirrorNode == null){
    83                         mirrorNode = node;
    84                     }
    85                 }else{
    86                     if(mirrorNode == null){
    87                         mirrorNode = new OpeningTreeNode(mirrorHashCode);
    88                         nodes.put(mirrorHashCode, mirrorNode);
    89                     }
    90                     mirrorNode.addGame(game);
    91                 }
    92                 if(parentNode != null)
    93                     parentNode.addChild(move.getMove(),node);
    94                 if(mirrorParentNode != null){
    95                     if(parentNode.equals(mirrorParentNode) && node.equals(mirrorNode))
    96                         ;
    97                     else
    98                         mirrorParentNode.addChild(move.getMove().getMirrorMove(),mirrorNode);
    99                 }
   100             }
   101         }
   102         node.addFinishedGame(game);
   103         if(!node.equals(mirrorNode))
   104             mirrorNode.addFinishedGame(game);
   105     }
   106 
   107 }