I typed in a lot of games, that's for sure.
My most memorable early games were a kind of "robots" game, and a submarine game.
In the robots game, it was you versus the robot, with mines in the field. The detail is that it was a "real time" game, unlike the typical robots. Hold down the appropriate key, travel in that direction. Let off the key, stop traveling, and the robots still came for you.
Mind, this was (omg) 30 years ago. But it was notable for a couple of reasons.
First was the real time nature of it. Real time keyboard scanning, robot and character update, etc.
The other novel bit was the hacking involved, as I had to find the memory address to show I was holding a key down, and what key that was. Continually scanning memory with PEEK, displaying values, banging on the keyboard. By dumb luck I found the right memory location, heck in theory there didn't even have to be one. But there was.
The submarine game played off of the same "real time" keyboard action of the first game. This game was you were a submarine base shooting at ships running across the top.
The two novelties was the "wave" animation I used (basically 3 different strings of characters printed over and over), and the other was the queue for the torpedoes (! of course). In this game, it used the SHIFT key as the FIRE key, and others for movement. Turns out in my poking around, the SHIFT key was a separate memory location, so I could check if BOTH were pressed at the same time. This allowed me to hold down the LEFT key and the SHIFT key to fire a salvo of torpedoes. After about 4 or 5, the game noticeably slowed down.
This was all done on a PET 2001 computer (As seen in STAR TREK II!) (chiclet keyboard and all).
The other notable thing, was this was all just me hacking it out. We didn't have any books on "programming". That was even before I was reading stuff like COMPUTE and CREATIVE COMPUTING regularly, much less having any understanding of what they were doing. I would do things like write loops with POKE until something showed up on the screen, or the computer crashed, to find things like the screen memory addresses.
Just ... hacking. I also had some machine language routines to do "bit blt" block moves on the screen. Those were so horrible they used self modifying code. But, hey, hand assembled 6502! POKE in to "god I hope this is safe memory" from DATA statements with READ.
Another game I did was a "space invaders" clone. I was so far off in left field, I couldn't think of how to identify which invader I hit. So each invader had a unique character in the middle of it (the notorious A, D, @, and 1 invaders!). When I found a "ship", I scanned nearby looking for the character, that told me which one I hit so I could remove it from the list. TRS-80, didn't really quite get that to work.
I tried the same thing in Z80 machine language, and when I got the base moving I thought it was broken. Hit the RIGHT key, base is on the right side of the screen. LEFT, left side. Never stopped in the middle.
1MHz Z80. Machine language. Mo' fasta than BASIC. It was working fine, just too fast. Needed a delay loop...
So, yea, I learned a lot doing those games. Did a lot of stuff I couldn't name (Queue? what's a queue?) etc.
Good times.