< Summary

Information
Class: BallSort.Engine.Logic.MoveGenerator
Assembly: BallSort.Engine
File(s): /home/runner/work/BallSort/BallSort/src/BallSort.Engine/Logic/MoveGenerator.cs
Tag: 158
Line coverage
100%
Covered lines: 39
Uncovered lines: 0
Coverable lines: 39
Total lines: 128
Line coverage: 100%
Branch coverage
100%
Covered branches: 48
Total branches: 48
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%
GetMoves(...)100%1212100%
GetMoves(...)100%66100%
CheckForCompletion(...)100%88100%
CheckForEmpty(...)100%44100%
CheckForMerges(...)100%1818100%

File(s)

/home/runner/work/BallSort/BallSort/src/BallSort.Engine/Logic/MoveGenerator.cs

#LineLine coverage
 1using BallSort.Engine.Game;
 2using BallSort.Engine.Models;
 3
 4namespace BallSort.Engine.Logic;
 5
 6public class MoveGenerator
 7{
 8    private readonly Board _board;
 9
 10    private int _moveId;
 11
 612    public MoveGenerator(Board board)
 13    {
 614        _board = board;
 615    }
 16
 17    public List<Move> GetMoves(Move lastMove)
 18    {
 36819        var moves = new List<Move>();
 20
 760821        for (var x = 0; x < _board.Width; x++)
 22        {
 343623            var ball = _board.Top(x);
 24
 343625            if (ball == Colour.Empty)
 26            {
 27                continue;
 28            }
 29
 331230            if (_board.IsComplete(x))
 31            {
 32                continue;
 33            }
 34
 216435            var newMoves = GetMoves(ball, x);
 36
 744437            foreach (var move in newMoves)
 38            {
 155839                if (! (move.Source == lastMove.Target && move.Target != lastMove.Source))
 40                {
 149441                    moves.Add(move);
 42                }
 43            }
 44        }
 45
 36846        return moves;
 47    }
 48
 49    private List<Move> GetMoves(Colour ball, int source)
 50    {
 216451        var moves = new List<Move>();
 52
 216453        var move = CheckForCompletion(ball, source);
 54
 216455        if (move != Move.NullMove)
 56        {
 26257            moves.Add(move);
 58        }
 59
 216460        moves.AddRange(CheckForMerges(ball, source));
 61
 216462        if (_board.BallCount(source) != 1)
 63        {
 188664            move = CheckForEmpty(source);
 65        }
 66
 216467        if (move != Move.NullMove)
 68        {
 54469            moves.Add(move);
 70        }
 71
 216472        return moves;
 73    }
 74
 75    private Move CheckForCompletion(Colour ball, int source)
 76    {
 4206077        for (var x = 0; x < _board.Width; x++)
 78        {
 1912879            if (x == source)
 80            {
 81                continue;
 82            }
 83
 1708484            if (_board.Top(x) == ball && _board.Capacity(x) == 1)
 85            {
 26286                return new Move(source, x, ++_moveId);
 87            }
 88        }
 89
 190290        return Move.NullMove;
 91    }
 92
 93    private Move CheckForEmpty(int source)
 94    {
 3265695        for (var x = 0; x < _board.Width; x++)
 96        {
 1494097            if (_board.IsEmpty(x))
 98            {
 49899                return new Move(source, x, ++_moveId);
 100            }
 101        }
 102
 1388103        return Move.NullMove;
 104    }
 105
 106    private List<Move> CheckForMerges(Colour ball, int source)
 107    {
 2164108        var moves = new List<Move>();
 109
 12984110        for (var i = _board.Height - 2; i > 0; i--)
 111        {
 89936112            for (var x = 0; x < _board.Width; x++)
 113            {
 40640114                if (x == source || _board.IsEmpty(x) || _board.IsFull(x) || _board.Capacity(x) == 1 || _board.IsComplete
 115                {
 116                    continue;
 117                }
 118
 7544119                if (_board.Top(x) == ball && _board.TopRunLength(x) == i)
 120                {
 752121                    moves.Add(new Move(source, x, ++_moveId));
 122                }
 123            }
 124        }
 125
 2164126        return moves;
 127    }
 128}