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();
}
如果在代码生成数字 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
这是由于字符串编码。
我还建议你有一个让你的代码工作,你把它提交给代码审查站点的优秀人员,以审查代码的其他方面,这些方面可以使用工作。