#c#
#c#
Вопрос:
Мне нужно знать эффективный способ в C # определить, отображаются ли элементы в ListX в listY. Я могу сделать это (возможно) неэффективным способом, написав много циклов, но я думаю, что есть более быстрый способ (лямбда-выражения?)
Я перехожу с Java на C #, поэтому для меня многое ново. Я пишу игру в крестики-нолики, и у меня есть 7 сценариев, чтобы выиграть игру.:
private int[] scenarioA = {1, 2, 3};
private int[] scenarioB = {4, 5, 6};
private int[] scenarioC = {7, 8, 9};
private int[] scenarioD = {3, 5, 7};
private int[] scenarioE = {1, 4, 7};
private int[] scenarioF = {2, 5, 8};
private int[] scenarioG = {3, 6, 9};
Всякий раз, когда игрок нажимает кнопку, я сохраняю номер ячейки в clickedCellsO или ClickedCellsX . После попадания в 5 ячеек мне нужно проверить, есть ли победитель, поэтому мне нужно перебрать clickedCellsO или ClickedCellsX, чтобы узнать, есть ли у него комбинация одного из сценариев.
List<int> clickedCellsO = new List<int>();
List<int> clickedCellsX = new List<int>();
Кто-нибудь может дать мне совет, как это сделать, не используя скамейку петель?
Заранее спасибо
Комментарии:
1. Вы когда-нибудь слышали о LINQ?
2. Спасибо @RufusL. Приятно это знать. В данный момент я использую List<int> .
3. Я думаю. Intersect — это то, что вам нужно. c-sharpcorner.com/UploadFile/87b416 /…
4. Просто обратите внимание — вам не хватает 1,5,9 (по диагонали — сверху слева направо снизу справа) в качестве действительного победителя.
5. Если вас беспокоит производительность процессора, я бы рекомендовал использовать битовую плату 3×3 и битовые операции
Ответ №1:
Вы можете просто использовать LINQ:
var winningConditions = new[] {
scenarioA,
scenarioB,
scenarioC,
// ...
};
var hasPlayerOWon = winningConditions.Any(placements => placements.All(clickedCellsO.Contains));
var hasPlayerXWon = winningConditions.Any(placements => placements.All(clickedCellsX.Contains));
Ответ №2:
Вы могли бы использовать a List<List<int>>
для хранения выигрышных комбинаций, а затем проверить использовать некоторые System.Linq
методы, чтобы определить, содержит ли комбинация игрока All()
элементы Any()
выигрышных комбинаций.
Код в приведенном ниже методе в основном гласит: «возвращайте true, если какая-либо из выигрышных комбинаций содержит все элементы, содержащиеся в комбинации игрока, в противном случае возвращайте false».
private static readonly List<List<int>> WinningCombinations = new List<List<int>>
{
new List<int> {1, 2, 3}, new List<int> {1, 5, 9},
new List<int> {1, 4, 7}, new List<int> {2, 5, 8},
new List<int> {3, 5, 7}, new List<int> {3, 6, 9},
new List<int> {4, 5, 6}, new List<int> {7, 8, 9},
};
private static bool IsAWinner(List<int> playerCombination)
{
return WinningCombinations.Any(winningCombo =>
winningCombo.All(playerCombination.Contains));
}
При использовании вы можете сделать что-то вроде:
if (IsAWinner(clickedCellsX))
{
// Player 'X' wins!
}
Комментарии:
1. Не лучший ход, но я не выигрываю с [1,5,3,9] ?
2. @Xiaoy312 обновил образец с недостающей комбинацией, а также улучшил логику для определения победителя. Как вы заметили, количество не обязательно должно совпадать, просто комбинация игрока содержит все элементы одной из выигрышных комбинаций.