Keyboard input/Obtain a Y or N response: Difference between revisions
({{omit from|PARI/GP}}) |
(added Inform 7 solution) |
||
Line 15: | Line 15: | ||
[[Category:Keyboard Input]] |
[[Category:Keyboard Input]] |
||
=={{header|Inform 7}}== |
|||
Keyboard input goes through a virtual machine that's only required to provide blocking input operations, so flushing the buffer isn't possible. |
|||
Inform 7 has a built-in function to ask the user for yes-or-no input, but it requires them to press enter afterward: |
|||
<lang inform7>Qwantz is a room. |
|||
When play begins: |
|||
say "A wizard has turned you into a whale. Is this awesome (Y/N)? "; |
|||
if the player consents, say "Awesome!"; |
|||
end the story.</lang> |
|||
To read a single key without waiting for enter, we can redefine the function by including a snippet of Inform 6 code: |
|||
<lang inform7>To decide whether player consents: (- (YesOrNoKey()) -). |
|||
Include (- |
|||
[ YesOrNoKey ch; |
|||
do { ch = VM_KeyChar(); } until (ch == 'y' or 'Y' or 'n' or 'N'); |
|||
return ch == 'y' or 'Y'; |
|||
]; -).</lang> |
|||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |
Revision as of 05:48, 3 November 2010
You are encouraged to solve this task according to the task description, using any language you may know.
Obtain a valid Y or N response from the keyboard. The keyboard should be flushed, so that any outstanding keypresses are removed, preventing any existing Y or N keypress from being evaluated. The response should be obtained as soon as Y or N are pressed, and there should be no need to press an enter key.
BASIC
ZX Spectrum Basic
10 IF INKEY$<>"" THEN GO TO 10 20 PRINT "Press Y or N to continue" 30 LET k$ = INKEY$ 40 IF k$ = "y" OR k$ = "Y" OR k$ = "n" OR k$ = "N" THEN GO TO 60 50 GO TO 30 60 PRINT "The response was "; k$
Inform 7
Keyboard input goes through a virtual machine that's only required to provide blocking input operations, so flushing the buffer isn't possible.
Inform 7 has a built-in function to ask the user for yes-or-no input, but it requires them to press enter afterward: <lang inform7>Qwantz is a room.
When play begins: say "A wizard has turned you into a whale. Is this awesome (Y/N)? "; if the player consents, say "Awesome!"; end the story.</lang>
To read a single key without waiting for enter, we can redefine the function by including a snippet of Inform 6 code: <lang inform7>To decide whether player consents: (- (YesOrNoKey()) -).
Include (- [ YesOrNoKey ch;
do { ch = VM_KeyChar(); } until (ch == 'y' or 'Y' or 'n' or 'N'); return ch == 'y' or 'Y';
]; -).</lang>
PicoLisp
<lang PicoLisp>(de yesno ()
(loop (NIL (uppc (key))) (T (= "Y" @) T) (T (= "N" @)) ) )</lang>
PureBasic
Inkey() returns the character string of the key which is being pressed at the time. <lang PureBasic>PrintN("Press Y or N to continue")
Repeat
; Get the key being pressed, or a empty string. Key$=UCase(Inkey()) ; ; To Reduce the problems with an active loop ; a Delay(1) will release the CPU for the rest ; of this quanta if no key where pressed. Delay(1)
Until Key$="Y" Or Key$="N" PrintN("The response was "+Key$)</lang>
Tcl
<lang tcl>proc yesno Template:Message "Press Y or N to continue" {
fconfigure stdin -blocking 0 exec stty raw read stdin ; # flush puts -nonewline "${message}: " flush stdout while {![eof stdin]} { set c [string tolower [read stdin 1]] if {$c eq "y" || $c eq "n"} break } puts [string toupper $c] exec stty -raw fconfigure stdin -blocking 1 return [expr {$c eq "y"}]
}
set yn [yesno "Do you like programming (Y/N)"]</lang>