Hacer un programa de consola que mueva una letra

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
serpastor
Mensajes: 1
Registrado: 05/10/2012 9:27 am

Hacer un programa de consola que mueva una letra

#1 Mensaje por serpastor » 05/10/2012 9:44 am

Tengo varios problemas, y quiero enumerarlos pero también ir por partes 8)
Problema principal: Quiero aprender acerca del manejo de gráficos en c/c++ para desarrollar, más que todo juegos. Quiero hacer un juego de culebrita. Primero en la consola y luego en interfaz usando GTK.
Pero, como dije, hay que ir por partes, y en este momento no sé nada ni de GTK ni de OpenGL, ni de nada. Sé a duras penas imprimir en la consola, y con eso debo lidiar justo ahora.

Tengo un problema por ahora: Cómo hago para que el C escriba donde yo le digo y que escriba lo que quiero. Logré hacer una especie de Timer con usleep() de unistd.h, pero siempre que le digo que me escriba no escribe nada. Se queda pegado esperando a que acabe el programa.
Entonces, yo espero que escriba 1, 2, 3, 4, 5, ... , 20 al principio de la linea no escribe nada, y se queda pegado....

Quisiera que me ayudaran con eso, y si pueden con un tuto donde vea cómo desarrollar un juego pequeño en c/c++ para coger cancha y mandármele al juego de culebrita ;)

Adjunto el código. Gracias por su atención

Código: Seleccionar todo

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int cuenta=0;
    for(int i=0;i<20;i++)
    {

    printf("%d\r",cuenta);
    cuenta++;
    usleep(100000);
    }
}

Nota: Estoy usando Debian GNU/Linux con el compilador GCC
Nota2: Gracias por mover el tema a donde correspondía 8)

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#2 Mensaje por Sorancio » 05/10/2012 10:55 am

Deberías echar un vistazo a ncurses. Es una librería de Linux para hacer "aplicaciones con interfaz rica" en consola. De alguna forma interesante, tiene soporte para coloreado, botones cutres y demás parafernalia.

http://tldp.org/HOWTO/NCURSES-Programmi ... world.html

Mucha suerte. Cualquier duda para eso estamos.
Mi página web (en inglés): http://kmr.conscell.net/

Avatar de Usuario
digies
Mensajes: 1001
Registrado: 18/11/2005 12:00 am
Ubicación: Blumenau (Br)

#3 Mensaje por digies » 26/12/2012 6:21 pm

Hola. Contesto esta pregunta porque recién la veo.

serpastor, antes de pasarte de lleno a la programación gráfica en C con GTK+, primero aprende bien el C Estándar y el uso de funciones implementadas en los headers que te brinda -en tu caso- GNU/Linux.

En el caso del código que expones, no necesitas usar la cabecera time.h porque ya tienes unistd de *NIX, tampoco string.h porque no usas sus funciones.

La función printf() no escribe directamente en la pantalla (salida estándar) sino en una memoria intermedia llamada buffer. El contenido (cadena) de printf() envía a la pantalla cuando recién el buffer se llena o cuando encuentra el carécter de nueva línea '\n'. En tu caso debes usar la función fflush(stdout) para que éste envíe a la salida estándar todo lo que hay en el buffer.

Código: Seleccionar todo

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int cuenta = 0;
    int i;

    for (i = 0; i < 20; i++)
    {
        printf("%d\r", cuenta++);
        fflush(stdout);
        usleep(100000);
    }

    return EXIT_SUCCESS;
}
Supongo que lo que tu quieres es hacer algo como una barra de progreso, entonces como dijo Sorancio, utiliza la biblioteca NCurses. Ejemplo:

Código: Seleccionar todo

#include <ncurses.h>
#include <stdlib.h>

void printporc(int n);

int main(void)
{
    int i;

    initscr();

    curs_set(0);

    addstr("BARRA DE PROGRESO:\n\n");
    for (i = 0; i < 101; i++)
    {
        printporc(i);
        napms(200);
    }
    addstr("\n\nCOMPLETO.\nPulse una tecla para finalizar: ");
    refresh();
    curs_set(1);
    getch();

    endwin();

    return EXIT_SUCCESS;
}

void printporc(int n)
{
    int av;

    addstr("\r");
    for (av = 0; av < 34; av++)
    {
        addch(ACS_CKBOARD);
        if (av == 16 && n != 100)
            printw("%02d%%", n);
    }
    addstr("\r");
    for (av = 0; av < n/3; av++)
    {
        addch(ACS_BLOCK);
        if (av == 16)
            printw("%02d%%", n);
    }
    refresh();

    return;
}
Un saludo
With enough eyes, all bugs are easy to find.

Eric S. Raymond

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados