001 package ai;
002
003 import core.Move;
004
005 /**
006 * A Variation represents the sequence of optimal plays from a game
007 * state.
008 *
009 * It is an immutable linked list, where each cell contains a move,
010 * the value associated with that cell, and the length of the list.
011 *
012 * @specfield value : int // The value that the current player gets
013 * // by playing optimally.
014 * @specfield depth : int //The number of plays this Variation is known to.
015 * @specfield move : Move //The current move to make
016 * @specfield variation : Variation //The next player's Variation after the move
017 *
018 * Abstract invariant
019 * depth = length(variation)
020 * value is consistent.
021 */
022
023 public class Variation{
024 int value;
025 Variation v;
026 Move m;
027 int depth;
028
029 // AF is trivial.
030 // RI:
031 // either depth == 0 and v == null and m == null
032 // or depth = 1 + v.depth, m != null, value = -v.value
033
034 public Variation(int value){
035 super();
036 this.value = value;
037 v = null;
038 m = null;
039 depth = 0;
040 }
041
042 private Variation(int value, Move move, int depth, Variation v){
043 this.v = v;
044 this.m = move;
045 this.value = value;
046 this.depth = depth;
047 }
048
049
050 /**
051 * @returns The value for this player with this variation.
052 */
053 public int getValue(){
054 return value;
055 }
056
057 /**
058 * @returns The move at this point of the variation.
059 */
060 public Move getMove(){
061 return m;
062 }
063
064 /**
065 * @returns The depth from this point of the variation.
066 */
067 public int getDepth(){
068 return depth;
069 }
070
071 /**
072 * @returns A new variation with a given Move as the first move
073 * and this as the rest.
074 */
075 public Variation cons(Move move){
076 return new Variation(-value, move, depth + 1, this);
077 }
078
079 /**
080 * @returns The rest of the Variation.
081 */
082 public Variation cdr(){
083 return v;
084 }
085 }