/
anya155
/
Bingo
Обзор
Документация
Войти
/
anya155
/
Bingo
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Models/Card.cs
237 строк
7 KB
Ksenia Rozhkina
добавление комментариев
20 дек 2025, 12:10
20 дек 2025, 12:10
21fd118
Код
Авторство
О чём код?
using System.Text.Json.Serialization; namespace LotoGame.Models { /// <summary> /// Карточка для игры Лото. /// </summary> public class Card { /// <summary> /// Получает или задает числа на карточке. /// </summary> public List<List<int>> Numbers { get; set; } = new List<List<int>>(); /// <summary> /// Получает или задает отмеченные числа на карточке. /// </summary> public List<List<bool>> Marked { get; set; } = new List<List<bool>>(); /// <summary> /// Инициализирует новый экземпляр класса <see cref="Card"/>. /// </summary> /// <param name="numbers">Числа на карточке.</param> /// <param name="marked">Отмеченные числа.</param> [JsonConstructor] public Card(List<List<int>> numbers, List<List<bool>> marked) { Numbers = numbers ?? new List<List<int>>(); Marked = marked ?? new List<List<bool>>(); if (Numbers.Count == 0) { InitializeEmptyCard(); } } /// <summary> /// Инициализирует новый экземпляр класса <see cref="Card"/>. /// </summary> public Card() { InitializeEmptyCard(); GenerateCard(); } private void InitializeEmptyCard() { for (int row = 0; row < 3; row++) { Numbers.Add(new List<int>()); Marked.Add(new List<bool>()); for (int col = 0; col < 9; col++) { Numbers[row].Add(0); Marked[row].Add(false); } } } private void GenerateCard() { Random rnd = new Random(); for (int row = 0; row < 3; row++) { for (int col = 0; col < 9; col++) { Numbers[row][col] = 0; Marked[row][col] = false; } } Dictionary<int, List<int>> columnNumbers = new Dictionary<int, List<int>>(); for (int col = 0; col < 9; col++) { columnNumbers[col] = new List<int>(); int min = col * 10 + 1; int max = (col == 8) ? 90 : (col + 1) * 10; for (int num = min; num <= max; num++) { columnNumbers[col].Add(num); } columnNumbers[col] = columnNumbers[col].OrderBy(x => rnd.Next()).ToList(); } for (int row = 0; row < 3; row++) { var selectedColumns = Enumerable.Range(0, 9) .OrderBy(x => rnd.Next()) .Take(5) .ToList(); foreach (int col in selectedColumns) { if (columnNumbers[col].Count > 0) { Numbers[row][col] = columnNumbers[col][0]; columnNumbers[col].RemoveAt(0); } } } for (int col = 0; col < 9; col++) { List<int> columnVals = new List<int>(); List<int> rowIndices = new List<int>(); for (int row = 0; row < 3; row++) { if (Numbers[row][col] != 0) { columnVals.Add(Numbers[row][col]); rowIndices.Add(row); } } columnVals.Sort(); for (int i = 0; i < columnVals.Count; i++) { Numbers[rowIndices[i]][col] = columnVals[i]; } } } /// <summary> /// Проверяет, есть ли число на карточке. /// </summary> /// <param name="number">Число для проверки.</param> /// <returns>True, если число есть на карточке.</returns> public bool HasNumber(int number) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 9; j++) { if (Numbers[i][j] == number) { return true; } } } return false; } /// <summary> /// Отмечает число на карточке. /// </summary> /// <param name="number">Число для отметки.</param> /// <returns>True, если число было отмечено.</returns> public bool MarkNumber(int number) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 9; j++) { if (Numbers[i][j] == number && !Marked[i][j]) { Marked[i][j] = true; return true; } } } return false; } /// <summary> /// Проверяет, заполнена ли строка. /// </summary> /// <param name="row">Номер строки.</param> /// <returns>True, если строка заполнена.</returns> public bool IsRowComplete(int row) { int markedCount = 0; int numbersInRow = 0; for (int col = 0; col < 9; col++) { if (Numbers[row][col] != 0) { numbersInRow++; if (Marked[row][col]) { markedCount++; } } } return markedCount == numbersInRow && numbersInRow == 5; } /// <summary> /// Проверяет, заполнена ли вся карточка. /// </summary> /// <returns>True, если карточка заполнена.</returns> public bool IsCardComplete() { for (int row = 0; row < 3; row++) { if (!IsRowComplete(row)) { return false; } } return true; } /// <summary> /// Получает строковое представление строки карточки. /// </summary> /// <param name="row">Номер строки.</param> /// <returns>Форматированная строка.</returns> public string GetRowString(int row) { string result = string.Empty; for (int col = 0; col < 9; col++) { if (Numbers[row][col] == 0) { result += " . "; } else if (Marked[row][col]) { result += $" [{Numbers[row][col],2}] "; } else { result += $" {Numbers[row][col],2} "; } } return result; } } }