< Summary

Information
Class: TicTacToeApp.API.Services.GameService
Assembly: TicTacToeApp.API
File(s): /home/runner/work/TicTacToe/TicTacToe/TicTacToeApp.API/Services/GameService.cs
Line coverage
13%
Covered lines: 6
Uncovered lines: 38
Coverable lines: 44
Total lines: 115
Line coverage: 13.6%
Branch coverage
4%
Covered branches: 4
Total branches: 88
Branch coverage: 4.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
CheckBoard(...)0%2970540%
CheckBoardN(...)0%272160%
CheckLine(...)0%156120%
GetWinResult(...)0%620%
CreateEmptyBoard(...)100%44100%

File(s)

/home/runner/work/TicTacToe/TicTacToe/TicTacToeApp.API/Services/GameService.cs

#LineLine coverage
 1using TicTacToeApp.API.Entity.Enums;
 2
 3namespace TicTacToeApp.API.Services;
 4
 5public sealed class GameService
 6{
 7
 8    internal static ResultGame CheckBoard(string?[][] arr, string p)
 9    {
 010        if ((arr[0][0] == p && arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2]) ||
 011            (arr[1][0] == p && arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2]) ||
 012            (arr[2][0] == p && arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2]) ||
 013            (arr[0][0] == p && arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0]) ||
 014            (arr[0][1] == p && arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1]) ||
 015            (arr[0][2] == p && arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2]) ||
 016            (arr[0][0] == p && arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) ||
 017            (arr[2][0] == p && arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2])
 018           )
 19        {
 20            switch (p)
 21            {
 22                case "X":
 023                    return ResultGame.WinX;
 24                case "O":
 025                    return ResultGame.WinO;
 26            }
 27        }
 28
 029        var canContinueGame = arr.Any(cell => cell == null);
 030        if (!canContinueGame) return ResultGame.None;
 31
 032        return ResultGame.Draw;
 33    }
 34    internal static ResultGame CheckBoardN(string?[][] board, string player, int lineToWin)
 35    {
 036        int size = board.Length;
 37
 38        // Проверка всех возможных линий
 039        for (int i = 0; i < size; i++)
 40        {
 041            for (int j = 0; j < size; j++)
 42            {
 43                // Пропускаем пустые клетки
 044                if (board[i][j] != player)
 45                    continue;
 46
 47                // Проверка горизонтали (→)
 048                if (CheckLine(board, i, j, 0, 1, player, lineToWin))
 049                    return GetWinResult(player);
 50
 51                // Проверка вертикали (↓)
 052                if (CheckLine(board, i, j, 1, 0, player, lineToWin))
 053                    return GetWinResult(player);
 54
 55                // Проверка диагонали (↘)
 056                if (CheckLine(board, i, j, 1, 1, player, lineToWin))
 057                    return GetWinResult(player);
 58
 59                // Проверка диагонали (↙)
 060                if (CheckLine(board, i, j, 1, -1, player, lineToWin))
 061                    return GetWinResult(player);
 62            }
 63        }
 64
 65        // Проверка на ничью (если нет пустых клеток)
 066        bool isDraw = !board.Any(row => row.Any(cell => cell == null));
 067        return isDraw ? ResultGame.Draw : ResultGame.None;
 68    }
 69
 70    // Проверяет, есть ли K символов player в ряд, начиная с (startX, startY)
 71    private static bool CheckLine(string?[][] board, int startX, int startY, int dx, int dy, string player, int lineToWi
 72    {
 073        int size = board.Length;
 074        int count = 0;
 75
 076        for (int step = 0; step < lineToWin; step++)
 77        {
 078            int x = startX + step * dx;
 079            int y = startY + step * dy;
 80
 81            // Выход за границы поля
 082            if (x < 0 || x >= size || y < 0 || y >= size)
 83                break;
 84
 085            if (board[x][y] == player)
 086                count++;
 87            else
 88                break;
 89        }
 90
 091        return count == lineToWin;
 92    }
 93
 94    // Возвращает ResultGame.WinX или ResultGame.WinO
 95    private static ResultGame GetWinResult(string player)
 96    {
 097        return player == "X" ? ResultGame.WinX : ResultGame.WinO;
 98    }
 99
 100    public static string?[][] CreateEmptyBoard(int size)
 101    {
 4102        var board = new string?[size][];
 44103        for (int i = 0; i < size; i++)
 104        {
 18105            board[i] = new string?[size];
 304106            for (int j = 0; j < size; j++)
 107            {
 134108                board[i][j] = null;
 109            }
 110        }
 111
 4112        return board;
 113    }
 114
 115}