Simply because your loop becomes very crowded and hard to read. It's easier to look at, and follow the game logic
do
gosub getinput()
gosub calcai()
gosub chkcollision()
sync
loop
functions are better to use in certain situations. Especially if they have their own static variables, this way they can be used in other programs. They can return values and be used in "if" conditions. They make programs easier to troubleshoot. If a function has been tested and works as long as it's passed the write variables it will work in another program.
In addition:
subroutines are also good for developing & bug-testing. It's easier to rem out the gosub call rather than needing to rem out all the lines in your game loop. If you need to bypass a certain portion of code, just place rem infront of the gosub call. When you need it bvack you only need to remove the singel rem statement.
~zenassem