2014-10-17 5 views
0

Хорошо, поэтому я делаю программу для проверки четырехзначного кода.Программа проверки кода C#

Компьютер генерирует 4-значный код Пользователь вводит 4-значный код. Их догадка. компьютер сообщает им, сколько цифр правильно угадали в нужном месте и сколько цифр было угадано правильно, но не в том месте. Пользователь получает 12 догадок, чтобы либо выиграть - угадать правильный код. Или проиграть - угадать догадки.

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

class Program 
{ 
    public static Random random = new Random(); 
    static void Main(string[] args) 
    { 
     int DigitOne = random.Next(0, 10); 
     int DigitTwo = random.Next(0, 10); 
     int DigitThree = random.Next(0, 10); 
     int DigitFour = random.Next(0, 10); 

     byte[] code = new byte[4]; 
     code[0] = Convert.ToByte(DigitOne); 
     code[1] = Convert.ToByte(DigitTwo); 
     code[2] = Convert.ToByte(DigitThree); 
     code[3] = Convert.ToByte(DigitFour); 
     bool CodeCorrect = false; 
     Console.WriteLine(code[0] +""+ code[1] +""+ code[2]+""+code [3]); 

     Console.WriteLine("You have 12 guesses before you will be permenantly locked out.\n"); 
     int AmountOfGuesses = 0; 
     while (AmountOfGuesses < 12 && !CodeCorrect) 
     { 
      Console.WriteLine("Enter 4 digit code to unlock the safe: "); 
      int[] UserCode = new int[4]; 

      for (int i = 0; i < 4; i++) 
      { 
       UserCode[i] = Convert.ToInt32(Console.Read()) - 48; 
      } 
      if (UserCode.Length != 4) 
      { 
       Console.WriteLine("Error. Try Again.\n"); 
      } 
      else 
      { 
       int UserDigitOne = UserCode[0]; 
       int UserDigitTwo = UserCode[1]; 
       int UserDigitThree = UserCode[2]; 
       int UserDigitFour = UserCode[3]; 
       for (int i = 0; i < 4; i++) 
       { 
        if (UserCode[i] == code[i]) 
        { 
         Console.WriteLine("The digit at position " + (i + 1) + " is correct."); 
        } 
       } 


       if (UserCode[0] == code[0] && UserCode[1] == code[1] && UserCode[2] == code[2] && UserCode[3] == code[3]) 
       { 
        CodeCorrect = true; 
        Console.WriteLine("Code Correct. Safe unlocked."); 

       } 
      } 



      AmountOfGuesses++; 
     } 

     if (AmountOfGuesses > 12) 
     { 
      Console.WriteLine("Code Incorrect. Safe Locked permenantly."); 
     } 

     Console.ReadLine(); 

    } 
+0

Вы активизировали через код, чтобы увидеть, что происходит? –

+0

Да, у меня есть ... – user3063533

+0

Не знаете, почему вам нужно использовать 'byte' ... – crashmstr

ответ

1

Если вы выполните код после того, как он сгенерировал номер 1246, а затем введите тот же номер из командной строки, преобразуйте его в массив символов, а затем преобразуйте каждый символ в байт, вы получите следующие четыре байт:

Они соответствуют ASCII представлений каждого полукокса, а не фактические цифры.

попробовать что-то вроде этого:

int[] input = new int[4]; 

for(int i = 0; i < 4; i++) 
{ 
    input[i] = Convert.ToInt32(Console.Read()) - 48; 
} 

-48 должен превратить ваш код ASCII в фактическое числовое представление, что было представлено. Console.Read() читает отдельные символы, а не полную строку.

Кроме того, вы не должны говорить:

CodeCorrect == false 

Это более просто представлена ​​как:

!CodeCorrect 

Точно так же, если она была установлена ​​истина, было бы просто:

CodeCorrect 

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

UPDATE: Вот пересмотренный вариант полной программе:

class Program 
{ 
    public static Random random = new Random(); 
    static void Main(string[] args) 
    { 
     int[] randCombination = new int[4]; 
     for (int i = 0; i < 4; i++) 
     { 
      randCombination[i] = random.Next(0, 10); 
      Console.Write(randCombination[i].ToString()); 
     } 
     bool CodeCorrect = false; 

     Console.WriteLine("\nYou have 12 guesses before you will be permenantly locked out.\n"); 

     int AmountOfGuesses = 0; 
     while(AmountOfGuesses < 12 && !CodeCorrect) 
     { 
      Console.WriteLine("Enter 4 digit code to unlock the safe: "); 

      int[] UserCode = new int[4]; 
      string input = Console.ReadLine(); 

      int n; 
      bool isNumeric = int.TryParse(input, out n); 

      int correctCount = 0; 

      if(input.Length != 4 || !isNumeric) 
      { 
       Console.WriteLine("Error. Input code was not a 4 digit number.\n"); 
      } 
      else 
      { 
       for(int i = 0; i < 4; i++) 
       { 
        UserCode[i] = Convert.ToInt32(input[i]) - 48; 

        if(UserCode[i] == randCombination[i]) 
        { 
         Console.WriteLine("The digit at position " + (i + 1) + " is correct."); 
         correctCount++; 
        } 
       } 

       if(correctCount == 4) 
       { 
        CodeCorrect = true; 
        Console.WriteLine("Code Correct. Safe unlocked."); 
       } 
      } 
      AmountOfGuesses++; 
     } 

     if(AmountOfGuesses >= 12) 
     { 
      Console.WriteLine("Code Incorrect. Safe Locked permenantly."); 
     } 

     Console.ReadLine(); 
    } 
} 

были изменены пару вещей:

  • Добавлен цикл в верхней части, которая генерирует случайное число, входит в него в массив ints, а затем выводит его на стандартный вывод.
  • Я изменил способ ввода данных пользователя на Console.ReadLine(). Причиной этого является проверка того, вводит ли пользователь четырехзначное целое число. оператор int.TryParse гарантирует, что вход представляет собой int, а свойство Length проверяет длину.
  • Я также использовал счетчик, чтобы подсчитывать каждое правильное предположение. Если было сделано 4 правильных догадки, сейф будет разблокирован.
  • Ваше окончательное утверждение if никогда не было бы оценено, потому что количество догадок равнялось 12, а не больше. Изменено на> = from>. Всегда будьте в поиске маленьких вещей, подобных этому.

EDIT # 2: Для получения дополнительной информации о int.TryParse смотрите следующее:

+0

. Я внедрил изменение, которое вы сказали, и в какой-то степени оно работает, но оно по-прежнему не распознает каждое значение правильно, Ive отредактировал код в вопросах, не могли бы вы посмотреть снова и попытаться объяснить, почему, извините, что я просто изучаю C# и хочу понять, где я ошибаюсь в своей программе, поэтому я могу внедрить тёмные в будущем. – user3063533

+0

Можете ли вы добавить свой пересмотренный код в свой пост, чтобы я мог взглянуть на него? – CynicalProgrammer

+0

Я сделал, я поставил код сейчас в – user3063533

1

Вы сравниваете числа с символьным представлением числа. Каждое значение code[] представляет действительное число. Затем вы сравниваете эти значения со значениями в UserCode, который является строкой, то есть есть символ в каждом индексе. Это никогда не бывает ((byte)'4') == ((byte)4) (используя, например, 4, но работает для любой цифровой цифры).

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


Для целей обучения весело смотреть на выходе из следующего кода:

for (char i = '0'; i <= '9'; i++) 
{ 
    Console.WriteLine("char: " + i + "; value: " + ((byte)i)); 
} 

Выход на самом деле:

char: 0; value: 48 
char: 1; value: 49 
char: 2; value: 50 
char: 3; value: 51 
char: 4; value: 52 
char: 5; value: 53 
char: 6; value: 54 
char: 7; value: 55 
char: 8; value: 56 
char: 9; value: 57 

Это связано с струнной кодирования.

Я также рекомендовал бы, чтобы у вас был ваш код, который вы отправляете его прекрасным людям на сайте Code Review, чтобы просмотреть другие аспекты кода, которые могли бы использовать работу.