I'm glad that's over. I ran through most of the levels quickly. 18, 23 and 25 were the difficult ones, and for some reason I ran into a perceptual barrier at level 25 that took a while to break through. The bombs were nothing more than a nuisance, serving as a another kind of opaque object. I would have liked another live element such as a diffraction grating that 'splits' a beam into invisible counterparts (that can be reflected but not light up a bullb) until they are rejoined.
Congratulations! It's a great feeling, isn't it? On Thursday evening I re-ran through all 25 levels as a speed trial and did them all in 30m 05s.
If you feel up to attempting a slightly newer version of the same basic game, it's available as a 28 level version at a website that Laura Chartier linked to in the comments section of my journal. They've made a couple of the levels harder (the evil Level 19, for example), and added three after 25. I ran through them all in a few hours yesterday evening.
But even if you decide to try the newer game, take a few days to bask in the warm glow of success first.
I learned more about myself running through those levels. My reverse ray trace strategy worked very well for most of the levels. Indeed, this is a basic weakness in the game, that if there are obvious back path dead-ends, it is easy (well, not easy but easier) to determine the true path. It was the levels with multiple partial possibilities that threw me and I failed to realize my basic strategy had to be abanonded or at least modified.
I'll take a look at the new game *after* taking a break from it. The interesting part of all this is that playing this game helped me solve a real and gnarly path optimization problem at work. Gosh, I can declare those game days as research.
I'll use the backward trace to establish where the end-points have to be, and then work out partial interior solutions that fit together. For me it usually includes a fair amount of intuition to get to the solution. If I were to try to code it as an algorythm, I'd write it as something like integration by parts, with boundary condition matching.