< Summary

Information
Class: BallSort.Engine.Solver
Assembly: BallSort.Engine
File(s): /home/runner/work/BallSort/BallSort/src/BallSort.Engine/Solver.cs
Tag: 216
Line coverage
100%
Covered lines: 30
Uncovered lines: 0
Coverable lines: 30
Total lines: 82
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Solve()100%22100%
Explore()100%1010100%

File(s)

/home/runner/work/BallSort/BallSort/src/BallSort.Engine/Solver.cs

#LineLine coverage
 1using BallSort.Engine.Game;
 2using BallSort.Engine.Logic;
 3using BallSort.Engine.Models;
 4
 5namespace BallSort.Engine;
 6
 7public class Solver
 8{
 9    private readonly Board _board;
 10
 11    private readonly MoveGenerator _moveGenerator;
 12
 13    private readonly BoardHasher _boardHasher;
 14
 2615    private readonly Stack<Move> _moves = [];
 16
 2617    private readonly HashSet<ulong[]> _visited = new(new BoardHashEqualityComparer());
 18
 2619    public Solver(Board board)
 20    {
 2621        _board = board;
 22
 2623        _moveGenerator = new MoveGenerator(_board);
 24
 2625        _boardHasher = new BoardHasher(_board);
 2626    }
 27
 28    public (bool Solved, List<Move> Moves) Solve()
 29    {
 2630        _moves.Clear();
 31
 2632        _visited.Clear();
 33
 2634        _visited.Add(_boardHasher.GetHash());
 35
 2636        if (Explore())
 37        {
 2438            var moveList = _moves.Reverse().ToList();
 39
 2440            return (true, moveList);
 41        }
 42
 243        return (false, null);
 44    }
 45
 46    private bool Explore()
 47    {
 623448        var lastMove = _moves.Count > 0 ? _moves.Peek() : Move.NullMove;
 49
 623450        var moves = _moveGenerator.GetMoves(lastMove);
 51
 3188452        foreach (var move in moves)
 53        {
 1056054            _board.Move(move);
 55
 1056056            if (_board.IsSolved())
 57            {
 2458                _moves.Push(move);
 59
 2460                return true;
 61            }
 62
 1053663            var hash = _boardHasher.GetHash();
 64
 1053665            if (_visited.Add(hash))
 66            {
 620867                _moves.Push(move);
 68
 620869                if (Explore())
 70                {
 168071                    return true;
 72                }
 73
 452874                _moves.Pop();
 75            }
 76
 885677            _board.UndoLastMove();
 78        }
 79
 453080        return false;
 170481    }
 82}