2017-01-25 6 views
0

Я собираюсь сделать викторину для курсовой работы уровня и в этом опросе. У меня есть экран регистрации игрока, который содержит имя пользователя, пароль, номер значка игрока и дату и время и сохраняет его на текстовый файл.Экран входа в систему, использующий для петель и массивов

У меня есть экран входа в плеер, который должен принимать значения, помещенные в текстовые поля имени пользователя и пароля, превращать их в строки, создавать массив из текстового файла и затем проверять, найдено ли имя пользователя и соответствующий пароль. Если они обнаружены, викторина должна перейти к первому вопросу, и если они не будут найдены, будет отображаться метка с надписью «пользователь не найден».

Моя проблема в том, что до тех пор, пока в текстовом файле записана запись, викторина перейдет к первому вопросу. Кажется, я не могу заставить его работать правильно.

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     string userName = txtExistingUserName.Text.ToString(); 
     string userPassword = txtExistingPassword.Text.ToString(); 
     bool bUserFound = false; 
     lblUserNotFound.Visible = false; 

     string filePath = "../../TextFiles/txtPlayer.txt"; 
     string[] fileLinesToRead = File.ReadAllLines(filePath); 

     for (int i = 0; i < fileLinesToRead.Count(); i = i + 7) 
     { 
      for (int y = i; y < i + 7; y++) 
      { 
       if (fileLinesToRead[y].Contains(userName)) 
       { 
        if (fileLinesToRead[y].Contains(userPassword)) 
        { 
         bUserFound = true; 
         break; 
        } 
       } 
       else 
       { 
        bUserFound = false; 
       } 
      } 
     } 

     if (bUserFound) 
     { 
      PlayerDetails.playerName = userName; 
      PlayerDetails.playerPassword = userPassword; 

      Random rndInt = new Random(); 
      int random = rndInt.Next(1, 3); 

      switch (random) 
      { 
       case 1: 
        Form myNextScreen = new frmQuestion1(); 
        myNextScreen.ShowDialog(); 
        //this.Close(); 
        break; 
       case 2: 
        Form myNextScreenAlt = new frmQuestion1Alt(); 
        myNextScreenAlt.ShowDialog(); 
        //this.Close(); 
        break; 
      } 
     } 
     else 
     { 
      lblUserNotFound.Visible = true; 
     } 

     } 
+0

Что строка в текстовом файле выглядеть? Вы не должны использовать string.contains для сравнения пароля. Кроме того, вы должны загрузить текстовый файл в словарь при загрузке приложения, а затем получить пароль из словаря и использовать == или string.compare в зависимости от того, как вы обрабатываете типы, чувствительность к регистру и т. Д. – ATerry

+0

im довольно новый на C#, поэтому можно вы объясните, что вы имеете в виду. Это для школы, поэтому нам просто вручили книгу и сказали использовать ее, чтобы сделать викторину, но книга ужасна. Строка в текстовом файле выглядит так: Test, 123,3,25/01/2017 11:15:05 –

+0

Очевидно, что вы просто студент, но обратите внимание, что хранение паролей в текстовом формате * - ужасная идея *. Каждый раз вы хотите хранить криптографически безопасный соленый хеш. – BradleyDotNET

ответ

0

Объявление словаря, доступного для вашей формы.

public static Dictionary<string, string> _users; 

Объявление метода загрузки пользователя для вызова при запуске приложения.

private const string FilePath = "../../TextFiles/txtPlayer.txt"; 

private static void LoadUsers() 
{ 
    _users = new Dictionary<string, string>(); 

    using (var sr = new StreamReader(FilePath)) 
    { 
     string line = sr.ReadLine(); 
     string[] lineArray = line?.Split(','); 
     if (lineArray?[0] != null && lineArray[1] != null) 
      _users.Add(lineArray[0].ToString(), lineArray[1].ToString()); 
    } 
} 

Объявить метод проверки подлинности, чтобы вернуть true, когда пользователь существует, и пароль верен, иначе false.

private bool PasswordIsValid(string userName, string password) 
{ 
    string expectedPassword = _users[userName]; 
    if (password == null || expectedPassword != password) 
     return false; 
    return true; 
} 

Чтобы использовать в коде, просто позвоните:

If(PasswordIsValid(userName, password)) 
    ... 
Смежные вопросы