Challenge: 
Winner?: 
Yes
Code Snippet: 
`  *** N.B. This program requires DBPro5.8 because of the memblock format

createsound("laser",1,1500,500,5000,0.01,0.2,0,0,0,0)
createsound("explosion",2,6200,700,2000,20,0.2,0,0,0,0)
createsound("explosion2",3,1200,1400,3000,10,0.1,0,0,0,0)
createsound("powerup",4,800,700,8000,-0.02,0.2,0,0,0,0)
createsound("warning",5,800,1000,3000,0.5,0.1,0,0,0,0)
createsound("vibrato1",6,500,2000,8000,0,0.1,0.05,0.2,0,0)
createsound("vibrato2",7,400,2000,8000,0,0.1,0.05,0.2,0,0)
createsound("vibrato3",8,600,2000,8000,0,0.1,0.05,0.2,0,0)
createsound("bass hit",9,20,200,14000,0.00,1.2,.0,0,0,0)
createsound("hihat",10,800,200,5000,60.06,2.2,.1,0,0,0)
createsound("door knock",11,200,200,8000,.1,4.0,2.1,10,9.2,9.2)
createsound("vinyl scratch",12,500,200,8000,0.06,0.2,.1,0,0,0)
createsound("cb1",13,250,500,2500,0.00001,0.2,4.0,0.4,0,0)
createsound("cb2",14,500,500,2500,0.00001,0.2,4.0,0.4,0,0)
createsound("cb3",15,437.5,1500,1500,0.0001,0.2,0.0,4.0,0.4,0)
createsound("cb4",16,573.75,1500,1500,0.0,0.2,4.0,0.4,0,0)
createsound("bubble burst",17,100,800,6000,-.4,2.0,0.1,10,1.2,0.2)

autocam off
position camera 0,0,-10
color backdrop rgb(255,255,255)
make object cube 5000,1
hide object 5000
set text font "times new roman"
set text size 100
ink rgb(200,200,255),0
text 0,60,"Word Panic!  "
get image 1000,0,0,450,200
ink rgb(255,255,255),0
box 0,0,10,10
ink rgb(0,0,250),0
line 0,0,0,10
line 0,0,10,0
get image 2000,0,0,10,10
ink rgb(250,0,0),0
line 0,0,0,10
line 0,0,10,0
get image 3000,0,0,10,10
make object plain 1000,14,3
texture object 1000,1000
make object plain 2000,14,3
texture object 2000,1000
position object 2000,0.1,-0.1,-0.01
set object transparency 1000,3
set object transparency 2000,3
set alpha mapping on 2000,50
make object plain 3000,14,3
texture object 3000,1000
position object 3000,0.1,-0.1,-0.01
set object transparency 3000,3000
set alpha mapping on 3000,30
make object plain 4000,15,3
`texture object 4,3
scale object texture 4000,50,10
position object 4000,0,0,0
`set object light 4,0
set object emissive 4000,rgb(0,0,250)
`set image colorkey 255,255,255
`set object transparency 4,1
ghost object on 4000,2
make object sphere 6000,-100,30,30
texture object 6000,2000
scale object texture 6000,50,50



sync on

color backdrop 0

read disallowedcharacterlist$
numberofdisallowedcharacters=len(disallowedcharacterlist$)
dim disallowedcharacter$(numberofdisallowedcharacters)
for checkdisallowedcharacters=1 to numberofdisallowedcharacters
  disallowedcharacter$(checkdisallowedcharacters)=right$(left$(disallowedcharacterlist$,checkdisallowedcharacters),1)
next checkdisallowedcharacters

read wordbank$
numberofwords=1
dim word$(numberofwords)
length=len(wordbank$)
for checkforspaces=1 to length
  checkcharacter$=right$(left$(wordbank$,checkforspaces),1)
  if checkcharacter$=" "
    inc numberofwords
    dim word$(numberofwords)
  else
    proceed=1
    for checkdisallowedcharacters=1 to numberofdisallowedcharacters
      if checkcharacter$=disallowedcharacter$(checkdisallowedcharacters)
        proceed=0
      endif
    next checkdisallowedcharacters

    if proceed=1
      word$(numberofwords)=word$(numberofwords)+checkcharacter$
    endif
  endif
next checkforspaces

restart:
total=0
score=0
correct=2
inputword$=""
undim randomword$(500)
undim stackedboxes(500)
dim randomword$(500)
dim stackedboxes(500)
currentword=1
nextword=1
topstackedbox=0
target=10
for image=1 to 200
if image exist (image) then delete image image
if object exist (image) then delete object image
next image

set text size 26

create bitmap 1,screen width(),screen height()
set current bitmap 0
firsttime=1
starttime=timer()
set text size 50
do

time=(timer()-starttime)/1000
if time>6
  newword=1
  starttime=timer()
endif
if firsttime=1
firsttime=0
newword=1
endif

scroll object texture 1000,0.001,0.0007
scroll object texture 2000,0.0008,0.0002
scroll object texture 3000,-0.0005,-0.0002
scroll object texture 6000,0,0.02


if newword=1
  do
    randomword$(nextword)=lower$(word$(rnd(numberofwords-1)+1))
    if len(randomword$(nextword))>3 then exit
  loop

  set current bitmap 1
  cls
  ink rgb(255,255,255),0
  box 0,0,300,60
  ink rgb(0,0,255),0
  text 0,0,randomword$(nextword)
  get image nextword,0,0,300,60
  set current bitmap 0

  make object box nextword,6,1,1
  position object nextword,0,5,0
  if (nextword-1)>0
    if object position y(nextword-1)>4 then position object nextword,0,object position y(nextword-1)+1,0
  endif
  texture object nextword,nextword
  inc total
  inc nextword
  newword=0

endif

`text 0,0,randomword$(nextword-1)

for object=1 to total
  if object exist(object)
    if stackedboxes(object)=0 or stackedboxes(object)=2 then position object object,0,object position y(object)-0.011,-0.5
    if object position y(currentword)<-5
      stackedboxes(currentword)=1
      topstackedbox=currentword
      play sound 1

      inc currentword
    endif
    if topstackedbox>0
      if stackedboxes(object)=0
        if object position y(currentword)<object position y(topstackedbox)+1
          stackedboxes(currentword)=1
          topstackedbox=currentword
          play sound 1
          inc currentword
        endif
      endif
    endif
  if object=currentword then set object emissive object,rgb(255,50,50) else set object emissive object,rgb(10,10,10)
 endif
next object

if topstackedbox>0
set object emissive topstackedbox,rgb(55,50,250)
if object position y(topstackedbox)>5 then goto gameover
endif



if score>target
play sound 4
inc target,10
for stacked=1 to topstackedbox
stackedboxes(stacked)=2
next stacked
endif

newletter$=inkey$()
if returnkey()=0 then lockreturnkey=0
if newletter$=oldletter$

else

  if returnkey()=0
    inputletter$=inkey$()
    oldletter$=inputletter$
    inputword$=inputword$+inputletter$
  endif

  if returnkey()=1 and lockreturnkey=0
    lockreturnkey=1
    if inputword$=randomword$(currentword)
      newword=1
      inc score,1
      inc currentword
      inputword$=""
      correct=1
      play sound 17
        else
      correct=0
      play sound 2
      inputword$=""
      endif
  endif
endif




if currentword>=nextword then newword=1
ink rgb(255,255,255),0
text 0,150,inputword$


if correct=1
  text 0,60,"Correct"

endif

if correct=0
  text 0,60,"Incorrect"

endif

text 0,90,"Score: "+str$(score)


sync
loop

gameover:
wait 1000
cls
ink rgb(0,0,255),0
print "Game over. You scored ",score," points."
sync
wait 2000
cls
print "Game over. You scored ",score," points."
print "Press any key to restart"
sync
wait key
goto restart

data ".,:;1234567890/?!?$%^&*()-=+_{}[]#@<>"
data "In key stage 3, in accordance with the whole school ICT policy, and in order to fulfil the requirements for the key stage 3 ICT curriculum, the emphasis of using ICT in science is to provide pupils with opportunities to make use of datalogging devices.  Pupils in key stage 3 are to be assessed on their ability to use such apparatus, to manipulate and analyse the data recorded using computer software, and to evaluate the effectiveness of such methods, culminating in an ICT level being awarded to all year 9 pupils in accordance with the ICT marking policy .  In key stages 3 and 4 and at AS and A level, pupils are to be provided with opportunities where possible to make use of all forms of ICT which may assist in their learning and presentation of science."

function createsound(name$,soundnumber,frequency#,length#,loudness#,bend#,decay#,vibratospeed#,vibratodepth#,tremelospeed#,tremelodepth#)

outWord as word
dword1 as dword: dword2 as dword: dword3 as dword: dword4 as dword
dword5 as dword: dword6 as dword: dword7 as dword

samples=int((length#/1000)*44100)

if memblock exist(1) then delete memblock 1
make memblock 1,samples*2+28

` write 28 memblock header bytes
dword1=1      ` gg query: is this the number of channels?
dword2=2      ` gg query: is this the number of bytes per sample?
dword3=22050  ` gg query: seems to be half the number of samples per second - why?
dword4=88200  ` gg query: is this the number of bytes per second?
dword5=4      ` gg query: what does this represent?
dword6=16     ` gg query:     (ditto)            ?
dword7=0      ` gg query:     (ditto)            ?

position=0
write memblock dword 1, position, dword1 : inc position,4
write memblock dword 1, position, dword2 : inc position,4
write memblock dword 1, position, dword3 : inc position,4
write memblock dword 1, position, dword4 : inc position,4
write memblock dword 1, position, dword5 : inc position,4
write memblock dword 1, position, dword6 : inc position,4
write memblock dword 1, position, dword7 : inc position,4

rem generate and write wave
for x=1 to samples
  outInteger=int(sin((x/122.5)*(frequency#+vibratodepth#*sin(theta#)))*(loudness#+tremelodepth#*sin(phi#)))*3.0
  if outInteger <-32767 then outInteger=-32767  ` gg query: is this the valid range?
  if outInteger>32767 then outInteger=32767     ` gg query:       (ditto)          ?
  outWord=outInteger
  inc theta#,vibratospeed#
  inc phi#,tremelospeed#
  dec frequency#,bend#
  if loudness#>0 then dec loudness#,decay#
  write memblock word 1, position, outWord : inc position,2
next x

make sound from memblock 999, 1 ` assumes you won't need sound number 999!
clone sound soundnumber, 999
delete sound 999

` memblock no longer required
delete memblock 1

endfunction