C# 代码验证程序

本文关键字:程序 验证 代码 | 更新日期: 2023-09-27 18:26:52

好吧,所以我正在制作一个程序来验证 4 位代码。

计算机生成一个 4 位代码用户键入 4 位代码。他们的猜测。计算机告诉他们有多少位数在正确的位置猜对了,有多少位数字猜对了,但在错误的地方。用户有 12 次猜测获胜 - 猜出正确的代码。或输了——猜不出来了。

所以基本上,我的程序似乎并没有真正验证代码是否正确,但我看不出为什么不,因为我有 if 和 for 循环进行验证,请看一下。

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();
    }

C# 代码验证程序

如果在代码生成数字 1246 后单步执行代码,然后从命令行输入相同的数字,将其转换为 char 数组,然后将每个字符转换为字节,您将获得以下四个字节:

49 50 52 54

这些对应于每个字符的 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

同样,如果设置为 true,则只需:

CodeCorrect 

我还建议使用 for 循环在数组中设置多个元素,而不是手动写出每一行代码。对于小型阵列来说,这没什么大不了的,但这是一个很好的做法。

更新:这是完整程序的修订版本:

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();
    }
}

更改了几件事:

  • 在顶部添加了一个 for 循环,用于生成一个随机数,将其输入到 int 数组中,然后将其打印到标准输出中。
  • 我更改了将用户输入读回Console.ReadLine()的方式。这样做的原因是检查用户是否输入了四位整数。int.TryParse 语句确保输入是 int,而 Length 属性检查长度。
  • 我还使用计数器来计算每个正确的猜测。如果进行了 4 个正确的数字猜测,保险箱将解锁。
  • 您的最终 if 语句永远不会计算,因为猜测数等于 12,而不是大于它。从> 更改为>=。始终注意这样的小事。

编辑#2:有关int的更多信息。TryParse,请参阅以下内容:

  • http://www.dotnetperls.com/int-tryparse
  • 如何int。TryParse实际上有效

您正在将数字与数字的字符表示进行比较。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

这是由于字符串编码。

我还建议你有一个让你的代码工作,你把它提交给代码审查站点的优秀人员,以审查代码的其他方面,这些方面可以使用工作。