Если условие игнорируется - PullRequest
0 голосов
/ 07 января 2019

Я сейчас пишу код для игры под названием Caladont.
В игре говорится, что первый игрок произносит слово, а следующий должен сказать слово, начинающееся с двух последних букв предыдущего слова.
Проблема возникает, когда я хочу проверить, содержит ли слово менее 3 букв или оно пустое.

В первом цикле, когда список для заполнения еще пуст, все в порядке.
Однако после того, как я наберу, например, 5 или более слов и введу одну букву или оставлю ее пустой, он печатает два сообщения "You've lost!", что означает, что код из оператора if игнорируется, поскольку он меняет переменную bool на false и должен выйдите из цикла «Пока».

Я пытался заменить ok = false на Exit While в условии, которое проверяет, содержит ли слово менее 3 букв, и это сработало, но я хочу понять, в чем проблема.

Код также можно найти здесь Игра Caladont - GitHub :

Module Module1
    Sub Main()
        Kaladont()
    End Sub
    Sub Kaladont()
        Const msg As String = "You've lost!" 
        Dim list As New List(Of String)
        Dim word As String
        Dim i As Integer
        Dim ok As Boolean
        ok = True
        While ok
            Console.Write("Insert word:")
            word = Console.ReadLine()
            list.Add(word)
            If word.Length < 3 Or word = "" Then
                Console.WriteLine(msg)
                ok = False
            End If
            If list.Count > 1 Then 'Skip checking first word
                For i = 0 To list.Count - 2
                    If word.ToLower = lista(i).ToLower Then
                        Console.WriteLine(msg)
                        ok = False
                    End If
                Next
                If LastTwo(word) = "ka" Or LastTwo(word)="nt" Then
                    Console.WriteLine("KALADONT! You won!")
                    ok = False
                End If 
                If FirstTwo(list.Last) <> LastTwo(list(list.Count - 2)) Then
                    Console.WriteLine(msg)
                    ok = False
                End If
            End If
        End While
        Check()
    End Sub
    Function FirstTwo(ByVal s1 As String) As String
        Return Left(s1.ToLower, 2)
    End Function
    Function LastTwo(ByVal s2 As String) As String
        Return Right(s2.ToLower, 2)
    End Function
    Sub Check()
        Dim sign As Char
        Console.WriteLine("Do you want to start new game? y\n")
        sign = Console.ReadLine()
        If sign = CChar("y") Then
            Console.Clear()
            Kaladont()
        ElseIf sign = CChar("n") Then
            Exit Sub
        End If
    End Sub
End Module

Какие-нибудь решения?

1 Ответ

0 голосов
/ 07 января 2019

Даже если вы установите ok в false, оно все равно будет идти в другом цикле, вам придется использовать Else

        If word.Length < 3 Or word = "" Then
            Console.WriteLine(msg)
            ok = False
        Else If list.Count > 1 Then 'Skip checking first word

Другим способом было бы выйти из while с помощью End while.

        If word.Length < 3 Or word = "" Then
            Console.WriteLine(msg)
            ok = False
            Exit While
        End If
...