\ 4tH template - QUIZ - Copyright 2004 J.L. Bezemer
\ You can redistribute this file and/or modify it under
\ the terms of the GNU General Public License
\ *****
\ You need to define INTRO, QUESTIONS and #OPTIONS
\ before including this template.
\ *****
\ INTRO is a word, displaying some text
[UNDEFINED] intro [IF] [ABORT] [THEN]
\ QUESTION is an array of question, options, correct char
[UNDEFINED] questions [IF] [ABORT] [THEN]
\ #OPTIONS is a constant of the number of options/question
[UNDEFINED] #options [IF] [ABORT] [THEN]
: tabit cr 3 spaces ;
: next-field cell+ dup @c ;
\ get a key from the keyboard - WAITS!
: getkey ( -- c)
pad begin dup 1 accept 0> until
c@ bl or
;
\ print a question and increase counter
: PrintQuestion ( a n -- n+1)
cr cr ( a n)
1+ dup 0 .r ." . " ( a n+1)
swap count type ( n+1)
;
\ print a option and increase address and character
: Option ( a1 c -- a1+1 c+1)
tabit
[char] ( emit ( a1 c)
dup emit ( a1 c)
[char] ) emit ( a1 c)
space ( a1 c)
1+ swap ( c+1 a1)
next-field ( c+1 a1+1 a2)
count type swap ( a1+1 c+1)
;
\ print all options
: PrintOptions ( a c -- a+n)
#options 0 do Option loop cr cr drop ( a+n)
;
\ prompt an answer from the user and evaluate
: GetAnswer ( n c -- n+1)
." Answer: " getkey = tabit
if
." C" 1+
else
." Inc"
then \ duplicate strings!
." orrect, your score is now " dup .
;
\ pose a question and get an answer
: PoseQuestion ( n1 n2 a1 a2 -- n1+1 n2+1 a1+n3+2)
rot ( n1 a1 a2 n2)
PrintQuestion ( n1 a1 n2+1)
swap ( n1 n2+1 a1)
[char] a ( n1 n2+1 a1 c)
PrintOptions ( n1 n2+1 a1+n)
rot swap ( n2+1 n1 a1+n)
next-field ( n2+1 n1 a1+n+1 c)
rot swap ( n2+1 a1+n+1 n1 c)
GetAnswer ( n2+1 a1+n+1 n1+1)
-rot cell+ ( n1+1 n2+1 a1+n+2)
;
\ evaluate the end result
: ShowResult ( n1 n2 --)
cr cr
." We posed you " . ( n1)
." questions. You answered " ( n1)
. ." correctly." cr cr ( --)
;
\ start asking questions
: quiz
cr cr intro
0 0 questions ( n1 n2 a1)
begin ( n1 n2 a1)
dup @c dup NULL <> ( n1 n2 a1 a2 f)
while ( n1 n2 a1 a2)
PoseQuestion ( n1 n2 a1)
repeat ( n1 n2 a1)
drop drop ( n1 n2)
ShowResult ( --)
;
quiz
|