Выбор случайного элемента из списка кортежей C#

Я новичок в программировании, и я пытаюсь добавить случайное движение бота в небольшую игру, которую я сделал. Моя идея заключалась в том, чтобы составить список кортежей всех допустимых ходов, а затем выбрать случайный кортеж из этого списка, чтобы затем деконструировать и изменить значение в 2D-массиве. Я просмотрел весь Интернет и нашел способ составить список кортежей (я думаю), но не смог выбрать случайный элемент из этого списка.

Вот что я пробовал:

List<Tuple<int, int>> legalMoves; // To make the list of tuples

// Later on in a double for-loop that iterates through all the rows and columns of the 2D-array I check if that certain row and column combination is a legal move and then add it to the list like so:

legalMoves.Add(Tuple.Create(row, col));

//Then in a different method I try to pick a random element from that list (this doesn't work)

Random random = new Random();
int randomIndex = random.Next(legalMoves.Count);
(int, int) randomMove = legalMoves[randomIndex];

В последней строке выдает следующую ошибку: Ошибка CS0029 Не удается неявно преобразовать тип «System.Tuple<int, int>» в «(int, int)»

Есть ли способ заставить это работать?

Заранее спасибо!

Правильный тип — ValueTuple, а не Tuple.

Panagiotis Kanavos 10.01.2023 20:31

Если у вас есть сомнения, объявите его как var randomMove = legalMoves[randomIndex]; и посмотрите, какой тип выводится

Jimi 10.01.2023 20:32

Пожалуйста, перечитайте минимально воспроизводимый пример, чтобы ваши будущие вопросы были лучше - т.е. нет абсолютно ничего о случайных числах, связанных с вопросом, который вы задаете - (int, int) randomMove = Tuple.Create(1,2); это весь код, необходимый для того, чтобы задать этот вопрос... (что также получить шанс предоставить лучшее название).

Alexei Levenkov 10.01.2023 21:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Синтаксис (int, int) определяет ValueTuple<int,int>, а не Tuple<int,int>. Измените определение списка на:

List<ValueTuple<int, int>> legalMoves;

и Tuple.Create к ValueTuple.Create

Это, казалось, решило мою первоначальную проблему, но когда я попытался запустить его, это дало мне следующую ошибку в том месте, где он добавляет допустимые ходы в список кортежей: «Ссылка на объект не установлена ​​​​на экземпляр объекта».

Jasper 10.01.2023 20:39

@ Джаспер, ты инициализировал List<>?

Panagiotis Kanavos 10.01.2023 20:43

Спасибо большое, теперь все исправлено!

Jasper 10.01.2023 20:53

Другие вопросы по теме