Very few threads are used. This kinda goes against the ideas of threaded applications but the problem with many threads seems to be resource allocation and deallocation. Each UFO has a thread to determine when it should shoot and when it should change direction. All other time related events are done with a single Timer thread. No double buffering is used.
All animation is done by erasing the old object and drawing the new one.
There are few enough objects on the screen to make this work well. Double buffering would push a lot of pixels to the screen that don't change between frames. The downside of this is that the game will get slower when more objects need to be drawn. No images are used. All objects are either polygons or text.