Agreed - there's just so much wrong with this one. The basic game "engine" is almost clever. Each of the lanes is maintained as a string in an array so string operations are used to "scroll" them. They are then simply printed to the screen to do the animation. However there's no progression of any kind (there is a 30% chance of a block being placed at all times) and the string manipulation makes no sense. This is the screen update routine:X,Y are used as the position to print the line (GOSUB 1600 does a PRINTTAB). B$ is simply a string of spaces to "unplot" the row - this is entirely unnecessary as the whole row is overwritten later.
The FOR loop steps down the screen positions - rather than the rows meaning all the array offsets have to be recalculated.
GOSUB 1800 points to a single RND command (setting A)
B=Y-L1+1:A$=T$(B):S=2:F=W:GOSUB1900:T$(B)=M$ then calculates the string offset in the array (B), sets A$ to be that value, S and F are the start and end of the string to extract and the routine at 1900 is just M$=MID$(A$,S,F-S+1). W is never changed so could be a hard coded value. So the whole thing could have been replaced with B=Y-L1+1:T$(B)=RIGHT$(T$(B),W-2) (or about that)
We've then got two IF statements which could be combined into one with an ELSE.
And then lastly we have GOSUB1600 to do the PRINTTAB again and a print to print the row. Why we need to maintain and print an entire row when the plane is only ever 10 characters from the end I don't know.
A bit of code optimisation and this could almost be a brief distraction. Add some progression to increase the frequency of the walls as time goes by and a "jump/smash" mechanic to go through a block (with the disadvantage that you move along the screen) and you might feel like some progression. Oh - and make the Up key not the same as quit!
Lastly I'm sure Colin will be pleased to know that there are two alternate sounds in this source file - but appear to be totally unused. The nasty beep appears to be the choice they went with.
Code:
3100X=1:FORY=L1 TOL1+4:GOSUB1600:PRINTB$:GOSUB1800:B=Y-L1+1:A$=T$(B):S=2:F=W:GOSUB1900:T$(B)=M$:IFRA>.3 THENT$(B)=T$(B)+" " 3110IFRA<=.3 THENT$(B)=T$(B)+CHR$(224) 3120GOSUB1600:PRINTT$(B):NEXTYThe FOR loop steps down the screen positions - rather than the rows meaning all the array offsets have to be recalculated.
GOSUB 1800 points to a single RND command (setting A)
B=Y-L1+1:A$=T$(B):S=2:F=W:GOSUB1900:T$(B)=M$ then calculates the string offset in the array (B), sets A$ to be that value, S and F are the start and end of the string to extract and the routine at 1900 is just M$=MID$(A$,S,F-S+1). W is never changed so could be a hard coded value. So the whole thing could have been replaced with B=Y-L1+1:T$(B)=RIGHT$(T$(B),W-2) (or about that)
We've then got two IF statements which could be combined into one with an ELSE.
And then lastly we have GOSUB1600 to do the PRINTTAB again and a print to print the row. Why we need to maintain and print an entire row when the plane is only ever 10 characters from the end I don't know.
A bit of code optimisation and this could almost be a brief distraction. Add some progression to increase the frequency of the walls as time goes by and a "jump/smash" mechanic to go through a block (with the disadvantage that you move along the screen) and you might feel like some progression. Oh - and make the Up key not the same as quit!
Lastly I'm sure Colin will be pleased to know that there are two alternate sounds in this source file - but appear to be totally unused. The nasty beep appears to be the choice they went with.
Statistics: Posted by ChrisB — Thu Dec 04, 2025 6:04 pm