Displaying a count down (blocking)

This lesson demonstrates how to create a blocking count down in LiveCode.

The example used here is the endless song 99 Bottles of Beer on the Wall. The example displays the song interactively, one verse at a time.

The mouseUp message

The mouseUp message is sent when the user clicks an object, in this case, a button. It's possible to include this code in a different handler; putting it in a button's mouseUp handler is just convenient for this example. When the mouseUp message is sent to the button, it triggers the mouseUp handler.

99 Bottles of Beer on the Wall

This handler displays the endless verses of the song "99 Bottles of Beer on the Wall". In case you're not familiar with the song, it goes like this:

99 bottles of beer on the wall, 99 bottles of beer

You take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer

You take one down and pass it around, 97 bottles of beer on the wall.

...and so on. The song continues, decreasing the number of bottles by one with each verse, until there's just one bottle left:

One more bottle of beer on the wall, one more bottle of beer

You take one down and pass it around, no more bottles of beer on the wall.

No more bottles of beer on the wall, no more bottles of beer

You go to the store and buy some more, 99 bottles of beer on the wall.

99 bottles of beer on the wall...

...and the song starts over from the beginning.

The mouseUp handler

The example displays the song interactively, one verse at a time. The handler assumes there is a field named "Song" to display successive verses. When the user clicks, the handler starts a repeat loop to display each verse of the song from the beginning. The tBottlesLeft variable keeps track of which verse is next: it starts out at 99, and each time through the loop, it's decreased by one. After a one-second delay imposed by the wait command, the handler returns to the top of the loop and displays the next verse. You can change the delay time, depending on how long you think it will take to read one verse and how long you want the song to take.  

put 99 into tBottlesLeft
switch tBottlesLeft
   case zero 
      ## last verse, zero bottles left
      put bottlePhrase(tBottlesLeft) && "on the wall," \
            && bottlePhrase(tBottlesLeft) & return \
            & "Go to the store and buy some more," \
            && bottlePhrase(99) \
            && "on the wall." into field "Song"
      break
   default 
      ## all other verses
      put bottlePhrase(tBottlesLeft) && "on the wall," \
            && bottlePhrase(tBottlesLeft) & return \
            & "Take one down and pass it around," \
            && bottlePhrase(tBottlesLeft - 1) \
            && "on the wall." into field "Song"
end switch
subtract 1 from tBottlesLeft ## for the next verse

When the song finishes, and the number of bottles left is zero, the handler sets it back to 99 to start the song over from the beginning:

if tBottlesLeft < zero then 
   put 99 into tBottlesLeft
end if
wait for 1 second

Ending the loop

The loop continues for all the verses, then starts over again, until the user clicks the button and stops the song. The repeat loop ends when the mouseClick function returns true, which happens if the mouse has been clicked.

repeat until the mouseClick 
   ...
end repeat
## when the repeat loop ends with a click, the song is over:
put empty into field "Song"

The mouseUp handler code

repeat until the mouseClick 
   ...
end repeat
## when the repeat loop ends with a click, the song is over:
put empty into field "Song"
on mouseUp
   local tBottlesLeft
     
   put 99 into tBottlesLeft
   repeat until the mouseClick 
      ## stop song when the user clicks
      ## show a verse, using the bottlePhrase function
      ## do one verse on each iteration of the loop:
      switch tBottlesLeft
         case zero 
            ## last verse, zero bottles left
            put bottlePhrase(tBottlesLeft) && "on the wall," \
                  && bottlePhrase(tBottlesLeft) & return \
                  & "Go to the store and buy some more," \
                  && bottlePhrase(99) \
                  && "on the wall." into field "Song"
            break
         default 
            ## all other verses
            put bottlePhrase(tBottlesLeft) && "on the wall," \
                  && bottlePhrase(tBottlesLeft) & return \
                  & "Take one down and pass it around," \
                  && bottlePhrase(tBottlesLeft - 1) \
                  && "on the wall." into field "Song"
      end switch
      subtract 1 from tBottlesLeft ## for the next verse
          
      if tBottlesLeft < zero then 
         put 99 into tBottlesLeft
      end if
      wait for 1 second
   end repeat
     
   ## when the repeat loop ends with a click, the song is over:
   put empty into field "Song"
end mouseUp

The bottlePhrase function code

function bottlePhrase pNumber
   ## generate the "base phrase" used to make a verse
   switch pNumber
      case zero
         return "No more bottles of beer"
         break
      case one
         return "One last bottle of beer"
         break
      default
         return pNumber && "bottles of beer"
   end switch
end bottlePhrase

Inspiration

This example was inspired by a discussion on the LiveCode mailing list with David Vaughan. The topic was in turn inspired by the "99 Bottles of Beer" site at http://99-bottles-of-beer.ls-la.net, featuring 99 Bottles of Beer code in 454 programming languages (and counting).

0 Comments

Add your comment

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.