
The original tank game used DOS-era headers and console functions such as gotoxy, clrscr and getche. A current C++ compiler is not required to provide them. That is a portability issue, not necessarily a mistake in the way the game was drawn for its original environment.
Separate the rules from the terminal#
Keep the tank's position and direction in a small state object. Then give input handling, movement and drawing separate jobs. A turn-based movement step can be expressed without moving the terminal cursor:
struct Position { int x; int y; };
Position moveRight(Position position, int width)
{
if (position.x + 1 < width) {
++position.x;
}
return position;
}Assume width is positive and the input position is already within the board. Rendering can later draw that state using a platform's console or graphics library.
Boundaries come before effects#
Check movement at every edge and stop a projectile when it leaves the board. Decide how the player exits, and avoid an unbounded loop with no predictable stop path. Real-time keyboard input needs a platform-specific layer; this snippet is only the portable state calculation.
This state calculation is not a complete real-time game. The terminal adapter, input loop and projectile rendering still need to be implemented for a chosen platform. For another cleanup of an old C++ exercise, see linked-list ownership.


