programacion c++

Iniciado por kmatzar, 15 Mayo 2018, 01:19 AM

0 Miembros y 1 Visitante están viendo este tema.

kmatzar

ayuda con este programa por favor.
Escriba un programa que, a través de una función, mueva un carácter a lo largo y
ancho de la pantalla, de la siguiente manera: Si el usuario presiona la tecla I el carácter
debe moverse una posición hacia arriba, si presiona la tecla K una posición hacia abajo,
si presiona J una posición hacia la izquierda y si presiona L debe mover el carácter una
posición a la derecha.
I = arriba K = abajo
J = izquierda L = derecha

Serapis

#1
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... :laugh: :laugh: :laugh:

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...