public int Score( IGrid<Player> board, Player player ) { var result = 0; foreach ( var p in board.AllPositions() ) { var owner = board[p]; if ( owner != null ) { var factor = owner == player ? 1 : -1; var weight = Weight( board, p ); result = result + factor * weight; } } return result; }
public InProgress( ICell<State> state, GameBoard board, Player player ) : base(state, board) { this.currentPlayer = player; }
private GameState( GameBoard initialBoard, Player initialPlayer ) : this(CreateInitialState( initialBoard, initialPlayer )) { // NOP }
private static ICell<State> CreateInitialState( GameBoard initialBoard, Player initialPlayer ) { if ( !initialBoard.HasValidMove( initialPlayer ) ) { throw new ArgumentException( "No move available for given player" ); } else { var state = new Cell<State>(); state.Value = new InProgress( state, initialBoard, initialPlayer ); return state; } }
public int StoneCount( Player player ) { if ( player == null ) { throw new ArgumentNullException(); } else { return state.Value.Board.CountStones( player ); } }
/// <summary> /// Returns the number of stones the specified player has. /// </summary> /// <param name="player">Player</param> /// <returns>Number of stones</returns> public ICell<int> StoneCount( Player player ) { if ( player == null ) { throw new ArgumentNullException( "player" ); } else { return stoneCounts[player.ArrayIndex]; } }
public int CountStones( Player player ) { return grid.Count( p => p.Value == player ); }
public int Score( IGrid<Player> board, Player player ) { return board.Count( player ) - board.Count( player.Other ); }
private void CaptureStones( Vector2D position, Player player ) { foreach ( var p in CapturedStones( position, player ) ) { grid[p].Value = player; } }
private IEnumerable<Vector2D> CapturedStones( Vector2D position, Vector2D direction, Player player ) { var distanceToTwin = FindDistanceToCaptureTwin( position, direction, player ); if ( distanceToTwin.HasValue ) { for ( var i = 1; i != distanceToTwin; ++i ) { var p = position + i * direction; yield return p; } } }
public IEnumerable<Vector2D> ValidMoves( Player player ) { return this.grid.AllPositions().Where( p => IsValidMove( p, player ) ); }
public void PlaceStone( Vector2D position, Player player ) { if ( !IsValidMove( position, player ) ) { throw new ArgumentException( string.Format( "{0} cannot place stone on position {1}", player.ToString(), position.ToString() ) ); } else { this.grid[position].Value = player; CaptureStones( position, player ); } }
public bool IsValidMove( Vector2D position, Player player ) { if ( position == null ) { throw new ArgumentNullException( "position" ); } else if ( player == null ) { throw new ArgumentNullException( "player" ); } else if ( grid[position].Value == null ) { foreach ( var direction in Vector2D.Directions ) { var distance = FindDistanceToCaptureTwin( position, direction, player ); if ( distance.HasValue && distance.Value > 1 ) { return true; } } return false; } else { return false; } }
public bool HasValidMove( Player player ) { return this.grid.AllPositions().Any( p => IsValidMove( p, player ) ); }
public int? FindDistanceToCaptureTwin( Vector2D position, Vector2D direction, Player player ) { var slice = grid.Slice( position, direction ); for ( var i = 1; i < slice.End; ++i ) { if ( slice[i].Value == null ) { return null; } else if ( slice[i].Value == player ) { return i; } } return null; }
public override void MakeMove( Vector2D position ) { if ( !IsValidMove( position ) ) { throw new ArgumentException( "Not a valid move" ); } else { board.PlaceStone( position, currentPlayer ); if ( board.HasValidMove( currentPlayer.Other ) ) { currentPlayer = currentPlayer.Other; } else if ( !board.HasValidMove( currentPlayer ) ) { state.Value = new GameOver( state, board ); } } }
public static GameState CreateInProgress( IGrid<Player> board, Player nextPlayer ) { var gameBoard = GameBoard.Create( board ); return new GameState( gameBoard, nextPlayer ); }
public int getnStones(Player player) { return game.StoneCount(player).Value; }
/// <summary> /// Creates a game from a given board and next player. /// </summary> /// <param name="board">Board</param> /// <param name="nextPlayer">Next player</param> /// <returns>A game object</returns> public static Game CreateInProgress(IGrid<Player> board, Player nextPlayer) { return new Game( GameState.CreateInProgress( board, nextPlayer ) ); }
public IEnumerable<Vector2D> CapturedStones( Vector2D position, Player player ) { foreach ( var direction in Vector2D.Directions ) { foreach ( var p in CapturedStones( position, direction, player ) ) { yield return p; } } }