public GameState Shoot(string gameId, int row, int column) { if (_shots.Count > 100) throw new Exception("Too many shots!"); Debug.Assert(gameId == "42"); var shot = new CellCoords(row, column); Debug.Assert(!_shots.Contains(shot)); _shots.Add(shot); var hitShip = _ships .Where(s => s.IsSunken == false) .FirstOrDefault(s => s.PositionCells.Contains(shot)); if (hitShip == null) { return new GameState { IsFinished = false, LastShot = ShotResult.Miss }; } hitShip.HitCells.Add(shot); var state = new GameState { IsFinished = _ships.Count(s => s.IsSunken == false) == 0, LastShot = hitShip.IsSunken ? ShotResult.HitAndSunk : ShotResult.Hit }; if (state.IsFinished) { CalculateScore(_shots.Count); } return state; }
/// <summary> /// Move the game to a new state. The current state is maintained /// so that it can be returned to. /// </summary> /// <param name="state">the new game state</param> public static void AddNewState(GameState state) { _state.Push(state); UtilityFunctions.Message = ""; }
/// <summary> /// End the current state and add in the new state. /// </summary> /// <param name="newState">the new state of the game</param> public static void SwitchState(GameState newState) { EndCurrentState(); AddNewState(newState); }