es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo obtener un carácter del teclado sin pausar un programa?

Estoy trabajando en un pequeño proyecto para mejorar mis habilidades de programación y tengo un problema. Estoy haciendo una versión de consola de Flappy Bird. Tengo un mapa que es una matriz bidimensional de caracteres y este mapa debe moverse hacia la izquierda. Estoy moviendo todos los elementos de la matriz un lugar hacia la izquierda y luego limpiando la consola y mostrando el mapa movido. Y aquí está el problema, el mapa debe moverse constantemente pero el jugador debe controlar a un pájaro mientras el mapa se mueve. Quería usar _getch() pero esto pausa el programa. Mi pregunta es: ¿Puedo leer una entrada del teclado sin pausar el programa? Quiero decir, que el mapa siga moviéndose y cuando presione, por ejemplo, la tecla Espacio en cualquier momento, la posición del pájaro cambiará. Estoy trabajando en Windows 10.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes leer la entrada del teclado sin pausar el programa utilizando funciones de entrada no bloqueantes. En C++, puedes utilizar la función “kbhit()” de la biblioteca “conio.h” para obtener una entrada no bloqueante desde el teclado. Esta función devuelve un valor distinto de cero si se presiona una tecla, y luego puedes utilizar la función “getch()” para leer el código de la tecla.

    Aquí tienes un ejemplo:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main() {
        // inicializar estado del juego
        char gameMap[10][20];
        int birdPosX = 0;
        int birdPosY = 0;
    
        // bucle del juego
        while (true) {
            // mover mapa hacia la izquierda
            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 20; j++) {
                    gameMap[i][j] = gameMap[i][j+1];
                }
            }
    
            // manejar entrada del teclado
            if (kbhit()) {
                char key = getch();
                if (key == ' ') {
                    birdPosY -= 1;
                }
            }
    
            // actualizar posición del pájaro
            birdPosX += 1;
    
            // mostrar mapa de nuevo
            system("cls");
            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 20; j++) {
                    if (i == birdPosX && j == birdPosY) {
                        cout << "B";
                    } else {
                        cout << gameMap[i][j];
                    }
                }
                cout << endl;
            }
        }
    
        return 0;
    }
    

    En este ejemplo, utilizamos la función “kbhit()” para comprobar si se ha presionado una tecla, y si es así, leemos el código de la tecla utilizando la función “getch()”. Luego actualizamos la posición del pájaro en función de la tecla presionada. El mapa y el pájaro se muestran utilizando la función “cout”, y la consola se borra utilizando la función “system(“cls”)”.

    Ten en cuenta que la biblioteca “conio.h” no es parte de la biblioteca estándar de C++, por lo que es posible que necesites instalarla o encontrar una biblioteca alternativa si no está disponible en tu sistema.</conio.h>

Comments are closed.