C# Windows Form. Надо написать игру Быки и Коровы, только со словами

Рейтинг: 0Ответов: 1Опубликовано: 06.04.2023

Всем привет, я прекрасно знаю что данная игра связана с числами, но мне дали такую курсовую. Так вот в чем проблема, мне нужно подсчитать количество быков и коров, быки у меня подсчитываются хорошо. Но вот коровы вообще не считаются. Вот мой фрагмент кода, который я использовал.

 private int CalculaterCowsCount(string text)
    {
        int cowscount = 0;

        for (int i = 0; i < secret_word.Length; i++)
        {
            if (secret_word[i] == textBox1.Text.ToLower()[i])
            {
                continue;
            }
            for (int t = 0; t < secret_word.Length; t++)
            {
                if (secret_word[t] == textBox1.Text.ToLower()[i] && (secret_word.Substring(1).Contains(textBox1.Text.ToLower()[i]) && secret_word.Substring(0, i).Contains(textBox1.Text.ToLower()[i])))
                {
                    cowscount++;
                    break;
                }
            }
        }
        return cowscount;

У меня считались коровы когда на месте textBox1.Text.ToLower()[i] был i-1, но он постоянно выдавал ошибку если вводишь слово, и оно начинается на любую букву, которая стоит после первой. Буду благодарен любой помощи, заранее спасибо!

Ответы

▲ 0Принят

Было время когда писали подобие этой игры на Delphi...

Вроде сначала производили поиск быков и записывали отдельно в массив найденные индексы букв.

List<int> bulls = new List<int>();
for (int i = 0; i < input.Length; i++)
{
  if (i >= secret.Length) break;
  if (input[i] == secret[i]) bulls.Add(i);
}

Поиск коров можно упростить убрав найденные быки с искомых слов.

string tempInput = input;
string tempSecret = secret;
for (int i = bulls.Count - 1; i >= 0; i--)
{
  tempSecret = tempSecret.Remove(bulls[i]);
  tempInput = tempInput.Remove(bulls[i]);
}

А уже затем произвести поиск коров. Можно даже исключить повторяющиеся буквы, если вести массив с найденными коровами.

List<char> cows = new List<char>();
for (int i = 0; i < tempInput.Length; i++)
{
  if (cows.Contains(tempInput[i])) continue; // исключаем повторение букв
  if (tempSecret.Contains(tempInput[i])) cows.Add(tempInput[i]);
}

В итоге будет:

  • bulls.Count - количество быков;
  • cows.Count - количество коров.

Надеюсь, это поможет решить задачу.