C/Visual C - Ayuda con ncurses.h

 
Vista:

Ayuda con ncurses.h

Publicado por john_mvf (1 intervención) el 28/11/2002 16:57:20
Por favor alguien que me pueda ayudar, estoy haciendo un proyecto para mi universidad, que es un juego, y necesito utilizar la libreria ncurses.h pero hay un problema, por ejemplo yo limpio la pantalla, imprimo el laberinto y supuestamente el cursor deveria quedarse en la parte de abajo esperando a que yo le de a la tecla de los cursores, pero no me hace eso.

lo que me hace es lo siguiente, borra la pantalla, aparece el laberinto, vuelve y borra la pantalla y luego es que aparece el cursor, como puedo arreglar ese problema?, yo no quiero que me borre la pantalla sino que se quede el cursor abajo del laberinto, este es el codigo para que me digan donde es que esta el error.

#include <stdio.h>
#include <ncurses.h>
#include <curses.h>

#define KEY_ESC '\033'

main ( ) {
int c, int lab[23][63];
system("clear");
llenar_lab(lab); //El llamdo de esta funcion ya la he puesto en
//diferentes lugares y me sigue funcionando igual

initscr ();
raw();
noecho();
cbreak();
keypad (stdscr, 1);
printw( "\npulse ESCAPE para salir...\n\n" );
printw( "\npulse una tecla de cursor...\n\n" );
for (;;) {
c = getch ();
switch (c) {
case KEY_ESC:
case KEY_BREAK:
endwin ();
exit (0);
case KEY_UP:
//Aqui iran las ordenes
break;
case KEY_DOWN:
//Aqui iran las ordenes
break;
case KEY_LEFT:
//Aqui iran las ordenes
break;
case KEY_RIGHT:
//Aqui iran las ordenes
break;
default:
beep ();
} // switch
} // for
} // main()
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problemas con la pantalla en ncurses

Publicado por Alejandro (913 intervenciones) el 10/04/2025 20:21:01
Hola, John.

Parece que el problema que estás enfrentando se debe a cómo estás manejando la limpieza de la pantalla y la actualización de la interfaz en tu juego con la biblioteca `ncurses`. Cuando usas `system("clear")`, estás limpiando la pantalla antes de inicializar `ncurses`, lo que puede causar comportamientos inesperados.

Aquí hay algunas sugerencias para solucionar el problema y asegurarte de que el cursor se mantenga en la parte inferior de la pantalla después de imprimir el laberinto:

1. Elimina el uso de `system("clear")`: No es necesario limpiar la pantalla antes de inicializar `ncurses`, ya que `ncurses` se encargará de la gestión de la pantalla.

2. Usa `refresh()` después de imprimir el laberinto: Asegúrate de llamar a `refresh()` después de imprimir el laberinto para que los cambios se reflejen en la pantalla.

3. Coloca el cursor en la posición deseada: Después de imprimir el laberinto, puedes mover el cursor a la posición deseada utilizando `move(y, x)`.

Aquí tienes una versión modificada de tu código que implementa estas sugerencias:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <ncurses.h>
#include <curses.h>
 
#define KEY_ESC '\033'
 
void llenar_lab(int lab[23][63]) {
    // Aquí deberías implementar la lógica para llenar el laberinto
}
 
int main() {
    int c, lab[23][63];
 
    // Inicializar ncurses
    initscr();
    raw();
    noecho();
    cbreak();
    keypad(stdscr, TRUE);
 
    // Llenar el laberinto
    llenar_lab(lab);
 
    // Imprimir el laberinto (aquí deberías implementar la lógica para imprimirlo)
    // Por ejemplo:
    for (int i = 0; i < 23; i++) {
        for (int j = 0; j < 63; j++) {
            // Suponiendo que lab[i][j] tiene algún valor que quieres imprimir
            printw("%d", lab[i][j]);
        }
        printw("\n");
    }
 
    // Mover el cursor a la parte inferior
    move(24, 0); // Cambia 24 y 0 a la posición deseada para el cursor
    printw("Pulse ESCAPE para salir...\n");
    printw("Pulse una tecla de cursor...\n");
 
    refresh(); // Refrescar la pantalla para mostrar el laberinto y el cursor
 
    for (;;) {
        c = getch();
        switch (c) {
            case KEY_ESC:
                endwin();
                return 0;
            case KEY_UP:
                // Aquí irán las órdenes
                break;
            case KEY_DOWN:
                // Aquí irán las órdenes
                break;
            case KEY_LEFT:
                // Aquí irán las órdenes
                break;
            case KEY_RIGHT:
                // Aquí irán las órdenes
                break;
            default:
                beep();
        }
    }
 
    endwin(); // Finalizar ncurses
    return 0;
}

Explicación de los cambios:


- Eliminación de `system("clear")`: Esto evita que la pantalla se limpie antes de que `ncurses` la maneje.
- Uso de `move(y, x)`: Esto coloca el cursor en la posición deseada después de imprimir el laberinto.
- Llamada a `refresh()`: Esto asegura que todos los cambios realizados en la pantalla se reflejen correctamente.

Con estos cambios, el cursor debería permanecer en la parte inferior de la pantalla después de que se imprima el laberinto, y podrás recibir la entrada del usuario sin problemas. ¡Buena suerte con tu proyecto!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar