Борба за показване на съобщение („Познай число!!!“), когато потребителят/играчът не напише число

Докато се уча как да пиша кодове в AppleScript, създадох тази проста игра, за да приложа моите все още не много големи знания на практика.

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

Трудя се да покажа съобщение („Познай число!!!“), когато потребителят/играчът не въвежда число, а буква или друг символ, различен от число.

Разбрах, че ако не получа въведеното от потребителя/играча „като цяло число“, компилаторът няма да го сравни, за да провери дали е вътре или извън дадения диапазон (1 до 20).

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

По този начин не мога дори да използвам оператор if, за да накарам компилатора да покаже моето съобщение („Познайте число!!!“), когато потребителят/играчът не въведе число!

Би било нещо подобно: Ако playersGuess ≠ 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