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