Пытается отобразить сообщение («Угадай число!!!») всякий раз, когда пользователь/игрок не набирает число

Пока я учусь писать коды на AppleScript, я создал эту простую игру, чтобы применить на практике свои еще не очень большие знания.

Мой код отображает сообщение с просьбой к пользователю/игроку угадать число от 1 до 20 и сравнить их ввод со случайно выбранным. Когда догадка игрока = случайно выбранному числу, игра заканчивается. До этого он продолжает просить игрока угадать меньше или больше.

Я изо всех сил пытаюсь отобразить сообщение («Угадай число!!!») всякий раз, когда пользователь/игрок вводит не число, а букву или любой другой символ, кроме числа.

Я понял, что если я не получу ввод пользователя/игрока «как целое число», компилятор не будет сравнивать его, чтобы проверить, находится ли он внутри или вне заданного диапазона (от 1 до 20).

Но когда я это делаю, всякий раз, когда пользователь/игрок вводит не число (а букву или любой другой символ, отличный от числа), компилятор выдает ошибку, говорящую о том, что он не может преобразовать этот символ в целое число.

Таким образом, я даже не могу использовать оператор if, чтобы заставить компилятор отображать мое сообщение («Угадай число!!!») всякий раз, когда пользователь/игрок не набирает число!

Это будет что-то вроде: Если playerGuess ≠ integer, тогда отобразится диалоговое окно «Угадай число!!!» конец, если

Как мне подойти к решению этой проблемы? Заранее спасибо!

set RandomNumber to (random number from 1 to 20) as integer

display dialog RandomNumber

set EndOfGame to false

set NoOfTries to 0

repeat until EndOfGame is true

    set Playersguess to the text returned of (display dialog "I'm thinking on a number between 1 and 20. Guess which one it is!" default answer "" buttons {"Ok"} default button 1) as integer

    if Playersguess = RandomNumber then
        set NoOfTries to NoOfTries + 1

        if NoOfTries > 1 then
            display dialog "Very well! It took you " & NoOfTries & " tries to guess the number I was thinking."
            set EndOfGame to true

        else
            display dialog "Very well! It took you " & NoOfTries & " try to guess the number I was thinking."
            set EndOfGame to true

        end if

    else if (Playersguess > RandomNumber) and (Playersguess < 21) and (Playersguess ≠ RandomNumber) then
        display dialog "Wrong guess! Guess lower!"
        set NoOfTries to NoOfTries + 1

    else if (Playersguess < RandomNumber) and (Playersguess > 0) and (Playersguess ≠ RandomNumber) then
        display dialog "Wrong guess! Guess higher!"
        set NoOfTries to NoOfTries + 1

    else if Playersguess > 20 then
        display dialog "Guess a number up to 20!!!"

    else if Playersguess < 1 then
        display dialog "Guess a number starting at 1!!!"

    end if

end repeat

person Dan_Mac    schedule 29.02.2020    source источник
comment
Рассмотрим этот пример. Проверка ввода игроков выполняется в теле playGame функция, которая также вызывается при появлении игрока; неправильно угадывает, вводит не число, ничего не вводит или нет. вне диапазона. Он правильно обрабатывает десятичные числа, которые игрок может ввести, например. 7.3. Это позволяет избежать указания списка всех возможных чисел в диапазоне   -  person RobC    schedule 03.03.2020


Ответы (1)


Я добавил два свойства в начало вашего скрипта. Я также добавил этот повторяющийся цикл repeat while {Playersguess} is not in validNumbers в ваш код, который является примером того, как вы можете реагировать на событие, когда кто-то ввел целое число больше 20 или любое другое значение ключа, которое я не определил в свойстве validNumbers... Обтекание этой части ваш код... set Playersguess to the text returned of внутри блока try позволяет продолжить код, если он обнаружит ошибку.

Есть несколько других проблем с вашим кодом, которые необходимо решить, но на данный момент внесенные мной изменения должны вернуть вас на правильный путь.

property validNumbers : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
property Playersguess : missing value

set RandomNumber to (random number from 1 to 20) as integer

display dialog RandomNumber

set EndOfGame to false
set NoOfTries to 0

repeat until EndOfGame is true

    repeat while {Playersguess} is not in validNumbers
        try
            set Playersguess to the text returned of (display dialog "I'm thinking on a number between 1 and 20. Guess which one it is!" default answer "" buttons {"Ok"} default button 1) as integer
        end try
        if {Playersguess} is not in validNumbers then
            display dialog "Please Only Enter Numerals From 1 to 20" buttons {"Cancel", "OK"} default button "OK"
        end if
    end repeat

    if Playersguess = RandomNumber then
        set NoOfTries to NoOfTries + 1
        if NoOfTries > 1 then
            display dialog "Very well! It took you " & NoOfTries & " tries to guess the number I was thinking."
            set EndOfGame to true
            set Playersguess to missing value
        else
            display dialog "Very well! It took you " & NoOfTries & " try to guess the number I was thinking."
            set EndOfGame to true
            set Playersguess to missing value
        end if
    else if (Playersguess > RandomNumber) and (Playersguess < 21) and (Playersguess ≠ RandomNumber) then
        display dialog "Wrong guess! Guess lower!"
        set NoOfTries to NoOfTries + 1
    else if (Playersguess < RandomNumber) and (Playersguess > 0) and (Playersguess ≠ RandomNumber) then
        display dialog "Wrong guess! Guess higher!"
        set NoOfTries to NoOfTries + 1
    else if Playersguess > 20 then
        display dialog "Guess a number up to 20!!!"
    else if Playersguess < 1 then
        display dialog "Guess a number starting at 1!!!"
    end if
end repeat
person wch1zpink    schedule 29.02.2020
comment
Почему фигурные скобки вокруг "{Playersguess}"? - person CJK; 01.03.2020
comment
Если случайное число было, скажем, 5, и игрок вводит 4.5, это предполагает, что он угадал его правильно. Это намеренно? - person RobC; 01.03.2020