我想根据用户的尝试次数将文件保存在 VB.net 中

I want to save a file in VB.net from the amount of tries a user has

我是一名正在尝试学习 Console App .Net Framework 的学生,我想编写一个介于 0000 和 9999 之间的随机数(作为您需要猜测的 pin)。到目前为止,我不得不将它设置为 1000 到 9999 之间的随机数,因为系统不会让我做 0000。此外,我想将用户的尝试次数保存为文本文件,例如如果用户尝试 50 次,我想说

Username          Tries 

我试过 Randomise() Rnd(*9999)X = EasyNum.Next(1000, 9999),但我无法比较,除非我将其转换为整数。

Module Module1
    Dim Tries As String = 0
    Dim EasyNum As New Random
    Dim HardNum As New Random
    Dim Attempt As String
    Sub Main()
        Dim Difficulty As String
        Console.WriteLine("Welcome to MasterMind")
        Console.WriteLine("Choose between Easy and Hard difficulty")

        Difficulty = Strings.LCase(Console.ReadLine)
        While Difficulty <> "easy" And Difficulty <> "hard"
            Console.WriteLine("That's not a correct mode")
            Difficulty = Strings.LCase(Console.ReadLine)
        End While
        If Difficulty = "easy" Then
            Easy()
        ElseIf Difficulty = "hard" Then
            Hard()
        End If

    End Sub

    Dim EasyGuess1 As Integer
    Dim EasyGuess2 As Integer
    Dim X As String
    Dim Y As Integer
    Sub Easy()

        Console.WriteLine("You have chosen the easy difficulty")
        Console.WriteLine("You have to guess a 4 Digit number between 1000 and 9999")
        Console.WriteLine("Enter your guess")

        X = EasyNum.Next(1000, 9999)
        Console.WriteLine(X)
        EasyGuess1 = Console.ReadLine
        Tries = +1
        If Mid(CStr(EasyGuess1), 1, 1) = Mid(CStr(X), 1, 1) Then
            Console.WriteLine("You have 1 number correct, try again?")
            Attempt = Strings.LCase(Console.ReadLine)
            While Attempt <> "yes" And Attempt <> "no"
                Console.WriteLine("Enter either yes or no")
                Attempt = Strings.LCase(Console.ReadLine)
            End While
        ElseIf Mid(CStr(EasyGuess1), 2, 1) = Mid(CStr(X), 2, 1) Then
            Console.WriteLine("You have 1 number correct, try again?")
            Attempt = Strings.LCase(Console.ReadLine)
            While Attempt <> "yes" And Attempt <> "no"
                Console.WriteLine("Enter either yes or no")
                Attempt = Strings.LCase(Console.ReadLine)
            End While
        End If
        If Attempt = "yes" Then
            EasyYes()
        ElseIf Attempt = "no" Then
            EasyNo()
        End If
        Console.WriteLine("incorrect")

        Console.ReadKey()
    End Sub
    Sub EasyYes()
        Console.WriteLine("Enter a new guess")
        EasyGuess1 = Console.ReadLine
    End Sub
    Sub EasyNo()
        Dim Save As String
        Dim File As System.IO.File
        Console.WriteLine("Do you want to save your tries? Enter Yes or no")
        Save = Strings.LCase(Console.ReadLine)
        If Save = "yes" Then
            System.IO.File.Create(Tries, "C:\X\Code\VB\Challenges\Challenge 1\MasterMind Test")
        End If
    End Sub
    Sub Hard()

        Console.WriteLine("You have chosen the hard difficulty")

    End Sub
    Sub HardYes()

    End Sub
    Sub HardNo()

    End Sub

End Module

当我尝试保存尝试时,我得到了这个:

System.InvalidCastException: 'Conversion from string "C:\X\Code\VB\Challenges\Cha" to type 'Integer' is not valid.' InnerException FormatException: Input string was not in a correct format.

我自己也不明白。

有很多问题,但我不想为你剧透。

我绝对建议将 "Option Strict On" 放入项目设置中,这样您可以立即看到哪里存在转换错误(将字符串分配给整数等)。

要保存文件,应该是这样的

If Save = "yes" Then
    File.WriteAllText("C:\X\Code\VB\Challenges\Challenge 1\MasterMind Test", Tries.ToString())
End If

(还有File.Append...函数)。

Randomclass有点tricky,这是一个提供随机值的对象,还不是随机值本身。始终对所有不同的数字使用相同的随机对象,否则您可能会得到相同的数字:

Private Randomizer As New Random(Environment.TickCount)
Private EasyNum As Int32 = Randomizer.Next(0, 10000) '0 to 9999
Private HardNum As Int32 = Randomizer.Next(0, 100000) '0 to 99999

随机发生器的 Next 方法的 "from" 值始终包含在内,而 "to" 值不包含任何原因。

增加一个变量,语法是

Tries += 1 

而不是"Tries = +1"

要写一个带前导数字的数字,可以使用

Console.Out.WriteLine($"The correct solution would have been: {EasyNum:0000}")

EasyNum.ToString("0000")

在线评论。请阅读所有评论。这个程序仍然不太好用,但我会留给你整理。

Module Module1
    Dim Tries As Integer = 0
    'Use only a single instance of Random
    Dim EasyNum As New Random
    'Dim HardNum As New Random
    Dim Attempt As String
    Sub Main()
        Dim Difficulty As String
        Console.WriteLine("Welcome to MasterMind")
        Console.WriteLine("Choose between Easy and Hard difficulty")

        Difficulty = Strings.LCase(Console.ReadLine)
        'AndAlso prevents the second condition from executing if the first condition is true
        While Difficulty <> "easy" AndAlso Difficulty <> "hard"
            Console.WriteLine("That's not a correct mode")
            Difficulty = Strings.LCase(Console.ReadLine)
        End While
        If Difficulty = "easy" Then
            Easy()
            'ElseIf Difficulty = "hard" Then
            '    Hard() 'Not implemented
        End If

    End Sub


    'Dim EasyGuess2 As Integer
    'Dim X As String
    'Dim Y As Integer
    Sub Easy()
        Dim EasyGuess1 As Integer
        Console.WriteLine("You have chosen the easy difficulty")
        Console.WriteLine("You have to guess a 4 Digit number between 1000 and 9999")
        Console.WriteLine("Enter your guess")
        'X = EasyNum.Next(1000, 9999)
        'The next method returns a non-negative integer not a string
        'To get 0 to 9999 with leading zeros do the following
        'Returns a non-negative random integer that is less than the specified maximum.
        Dim X = EasyNum.Next(10000).ToString("0000")
        Console.WriteLine(X)
        'Console.ReadLine returns a String. You should Not assign a String to an Integer
        'EasyGuess1 = Console.ReadLine
        'Never trust a user :-) Use .TryParse to set the variable
        Integer.TryParse(Console.ReadLine, EasyGuess1)
        'This just assigns the value of 1 to Tries
        'Tries = +1
        'If you want to increment Tries
        Tries += 1
        'Let's compare apples and apples
        'If you just convert EasyGuess1 To a string and EasyGuess1 is 54
        'the string is "54" You want a 4 character string
        'If Mid(EasyGuess1.ToString("0000"), 1, 1) = Mid(CStr(X), 1, 1) Then
        '    'but you only compared the first character, what about the rest?
        '    'Mid is aroung for backward compatibility. It should not be used for new code.
        '    'The position Integer is one based which is not at all sympatico with .net
        '    Console.WriteLine("You have 1 number correct, try again?")
        '    Attempt = Strings.LCase(Console.ReadLine)
        '    While Attempt <> "yes" And Attempt <> "no"
        '        Console.WriteLine("Enter either yes or no")
        '        Attempt = Strings.LCase(Console.ReadLine)
        '    End While
        'ElseIf Mid(CStr(EasyGuess1), 2, 1) = Mid(CStr(X), 2, 1) Then
        '    Console.WriteLine("You have 1 number correct, try again?")
        '    Attempt = Strings.LCase(Console.ReadLine)
        '    While Attempt <> "yes" And Attempt <> "no"
        '        Console.WriteLine("Enter either yes or no")
        '        Attempt = Strings.LCase(Console.ReadLine)
        '    End While
        'End If
        Dim CorrectCharacters = TestInput(EasyGuess1, X)
        Console.WriteLine($"You have guessed {CorrectCharacters} correctly. Try again?")
        'Use the .net way. The framework is available to all languages in .net
        'so it will be easier to learn other languages.
        Attempt = (Console.ReadLine).ToLower
        If Attempt = "yes" Then
            EasyYes()
        ElseIf Attempt = "no" Then
            EasyNo()
        End If
        Console.WriteLine("incorrect")

        Console.ReadKey()
    End Sub
    Sub EasyYes()
        Dim guess As Integer
        Console.WriteLine("Enter a new guess")
        'You are doing this twice ???
        'EasyGuess1 = Console.ReadLine
        Integer.TryParse(Console.ReadLine, guess)
        'EasyGuess1 will be 0 if the entry is other than an integer
        'Very nice bu this Sub doesn't do anything
    End Sub
    Sub EasyNo()
        Dim Save As String
        'Unused local variable and if you needed this it is a poor choice for a variable name
        'Dim File As System.IO.File
        Console.WriteLine("Do you want to save your tries? Enter Yes or no")
        Save = Console.ReadLine.ToLower
        If Save = "yes" Then
            'Give the file name an extension.
            'When you pass (String, Integer) to the Create method, the Integer is the number of bytes 
            'buffered for reads And writes to the file.
            'Not exactly what you were expecting.
            'System.IO.File.Create("C:\X\Code\VB\Challenges\Challenge 1\MasterMind Test.txt", Tries)
            'Imports System.IO at top of file
            File.WriteAllText("C:\X\Code\VB\Challenges\Challenge 1\MasterMind Test.txt", Tries.ToString)
        End If
    End Sub
    Sub Hard()
        Console.WriteLine("You have chosen the hard difficulty")
    End Sub

    Private Function TestInput(Guessed As Integer, RandString As String) As Integer
        Dim Correct As Integer
        Dim Guess As String = Guessed.ToString("0000")
        'A String can be a Char array
        'Here we check each character in the 2 strings for equality
        'and if true then increment Correct
        For i = 0 To 3
            If Guess(i) = RandString(i) Then
                Correct += 1
            End If
        Next
        Return Correct
    End Function

End Module