Básicamente una letra en una posición horizontal supone una cadena de texto donde todas sus posiciones previas son espacios. Luego moverla a izquierda o derecha, es formar una nueva cadena con un espacio más o menos que antes.
La cuestión vertical, es más de lo mismo... por cada línea previa a la pedida, se escribe el salto de línea... luego subir o bajar es aumentar o reducir en 1 la cantidad de saltos de líneas...
En pseudocódigo:
funcion PosicionarLetraEnPantalla(char letra, byte X, byte Y)
string s = espacios(X-1) + letra
entero k
borrar pantalla
bucle para k desde 0 hasta Y-1
imprimir salto de línea
fin bucle
imprimir s
fin funcion
NOTA: ten cuidado con los -1 y los tipos de datos, ...puede dar excepción... pero procura siempre usar un tipo de datos que se ajuste a lo razonable que se precisa.
Inicialmente X e Y valen 0, como se quiere mover, implica que hay que recordar la posicion previa... ergo ya tenemos una función que borra la pantalla y dibuja la letra donde queremos, ahora nos falta una función que 'mueva' la letra una posición cada vez...
Como letra he elegido 's', la serpiente que se mueve...
char letra = 'S'
byte X = 0
byte Y = 0
funcion Mover(char p) // p de posición
seleccionar caso de p
caso 'l', 'L'
Si (X<79) // suponiendo que 80 es el número máximo de caracteres en línea
X +=1
PosicionarLetraEnPantalla(letra, X, Y)
sino
mostrar aviso "llegado al extremo derecho"
fin si
caso 'J', 'j'
Si (X>0) // no se puede mover más a la izquierda, salvo que se permita, ascender una línea e ir al final de la misma.
x -=1
PosicionarLetraEnPantalla(letra, X, Y)
sino
mostrar aviso "llegado al extremo izquierdo"
fin si
caso 'i, 'I'
idem que 'J' pero para Y (no para X)
caso 'k', 'K'
ídem que 'L' pero para Y (no para X), considerando también el número máximo de líneas en la pantalla..
Otros casos
beep, o un mensaje de no reconocer la letra, o de mostrar las opciones correctas, o...
fin casos
fin funcion
p.d.: Cambiando los comentarios que por copia y pega, no correspondían en su nueva ubicación... aprovecho para...
Aunque las optimizaciones, siempre se deben hacer una vez que ya funciona correctamente... y deberían correr a cargo del interesado... te explico que:
Una opción más competente es crear un texto cuyo contenido sea una línea completa de espacios (del ancho de pantalla)...
Al inicio del programa el primer carácter en ese texto es la letra a imprimir y luego cada vez se trata de remplazar la letra por un espacio en su ubicación actual y luego remplazar un espacio por la letra en la nueva ubicación de la letra ± 1 posición de la previa...
...así la cadena de texto a imprimir se crea una sola vez y se modifica solo cuando cambia el valor de 'x', (que en ese caso se remplazan solo dos caracteres en la cadena " S" por "S ", ó viceversa), y por tanto no se tendrá que reconstruir la cadena al completo cada vez que se 'mueva' la letra...