Игра в города идёт не по правилам, компьютер выводит слово не на ту букву

пишу игру города на c#. И столкнулся с проблемой недостижимого кода. Вот код всей игры:

class Program
    {
        static void Main(string[] args)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            string path = @"C:\Users\MEGAKOMP\Desktop\goroda.txt";
            List<string> towns = new List<string>();
            towns = File.ReadAllLines(path, Encoding.GetEncoding(1251)).ToList();

            TownsGame ob = new TownsGame();

            for(int i = 0; i < towns.Count; i++)
            {
                ob.Add(towns[i]);
            }

            while (true)
            {
                string userTownName = Console.ReadLine();

                if (ob.IsTownExist(userTownName))
                {
                    continue;
                }
                ob.IsUserTownStartsWithCorrectLetter(userTownName);
                ob.IsUsedTownsContainsUserTown(userTownName);
                ob.MarkTownAsUsed(userTownName);
            }

            Console.ReadLine();
        }
    }

    class TownsGame
    {
        static List<string> usedTowns = new List<string>();
        static List<string> usedTownsOfComputer = new List<string>();

        static List<string> towns = new List<string>();

        static int score;

        public void Add(string t)
        {
            towns.Add(t);
        }

        //Проверяем есть ли город в списке
        public void IsTownExist(string userTownName)
        {
            if(towns.Contains(userTownName) == false)
            {
                --score;
                Console.WriteLine($"Такого города в России нет! Вам минус очко! Кол - во очков: {score}");
            }
        }

        //Проверяем начинаеться ли введённый город пользователя с нужной буквы 
        public void IsUserTownStartsWithCorrectLetter(string userTownName)
        {
            string firstSymbolOfUserTown = userTownName.ToLower().Substring(0, 1);

            if (usedTownsOfComputer.Count > 0)
            {
                if (usedTownsOfComputer.Last().EndsWith(firstSymbolOfUserTown) == false)
                {
                    --score;
                    Console.WriteLine($"Не поп равилам {score}");
                    userTownName = Console.ReadLine();
                }
            }
        }

        //Ищем букву с которой начинается город в списке
        public void SearchForCorrectLetter(List<string> towns,string userTownName)
        {
            for(int i = 0; i < towns.Count; i++)
            {
                for (int j = userTownName.Length - 1; j > -1; j--)
                {
                    if (towns[i].ToLower().StartsWith(userTownName[j]))
                    {
                        Console.WriteLine(towns[i]);
                        usedTownsOfComputer.Add(towns[i]);
                        towns.Remove(userTownName);
                        towns.Remove(towns[i]);
                        break;
                    }
                }
                break;
            }
        }

        //Проверяем был ли введён город пользователем до этого
        public void IsUsedTownsContainsUserTown(string userTownName)
        {
            if ((usedTowns.Contains(userTownName)) == false)
            {
                SearchForCorrectLetter(towns, userTownName);
            }
            else
            {
                --score;
                Console.WriteLine($"Этот город уже использовался! Вам минус очко! Кол - во очков: {score}");
            }
        }

        //Добавляем город в список использованых пользователем городов
        public void MarkTownAsUsed(string userTownName)
        {
            usedTowns.Add(userTownName);
        }
    }

Вот место в котором, я думаю, кроется ошибка:

public void SearchForCorrectLetter(List<string> towns,string userTownName)
        {
            for(int i = 0; i < towns.Count; i++)
            {
                for (int j = userTownName.Length - 1; j > -1; --j)
                {
                    if (towns[i].ToLower().StartsWith(userTownName[j]))
                    {
                        Console.WriteLine(towns[i]);
                        usedTownsOfComputer.Add(towns[i]);
                        towns.Remove(userTownName);
                        towns.Remove(towns[i]);
                        return;
                    }
                }
            }
        }

В общем по идее, когда я ввожу город Казань он должен выводить город на "Н", но выводится город на "А"


Ответы (1 шт):

Автор решения: DanBear

Нужно было поменять местами циклы для перебора городов и букв в введённом названии. Раньше у Вас работало так: К примеру, пользователь ввёл "Канада". Программа перебирает города и находит Китай. Из-за неправильной последовательности циклов, программа начнёт перебирать все буквы в слове "Канада" и проверять не начинается ли "Китай" с этой буквы. Так как в слове "Канада" есть буква 'к', то программа как раз и выведет "Китай", не дойдя до Америки, к примеру.

Правильный код:

public void SearchForCorrectLetter(List<string> towns,string userTownName)
        {
            for(int j = userTownName.Length - 1; j > -1; --j)
            {
                for (int i = 0; i < towns.Count; i++)
                {
                    if (towns[i].ToLower().StartsWith(userTownName[j]))
                    {
                        Console.WriteLine(towns[i]);
                        usedTownsOfComputer.Add(towns[i]);
                        towns.Remove(userTownName);
                        towns.Remove(towns[i]);
                        return;
                    }
                }
            }
        }

И как уже сказал EvgeniyZ, проблема недостижимого кода заключается в бесконечном цикле while(true) из которого у Вас нет выхода.

Так как Вам помогло это решение, то отметьте, пожалуйста, этот ответ галочкой.

→ Ссылка