Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Migotające kreski w programie

Ostatnio zmodyfikowano 2019-01-21 00:16
Autor Wiadomość
walkorn
Temat założony przez niniejszego użytkownika
Migotające kreski w programie
» 2019-01-20 22:09:11
Witam, postanowiłem napisać prostą grę "snake" i napotkałem pewien problem, otóż podczas odświeżania się ekranu po każdym ruchu na tle planszy pojawiają się migoczące kreski, które po chwili znikają. Co może być tego przyczyną? Poniżej zamieszczam kod programu.

PS: Kod jest w wersji roboczej, nie jest jeszcze dopracowany, ale chcę rozwiązać problem w zarodku.

C/C++
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <time.h>
#include <windows.h>
using namespace std;

string direction()
{
   
    int key = getch();
    key += getch();
    if( key == 296 ) return "up"; //gora
    else if( key == 304 ) return "down"; //dol
    else if( key == 299 ) return "left"; //lewo
    else if( key == 301 ) return "right"; //prawo
   
}

void idzdoxy( int x, int y )
{
    HANDLE hCon;
    COORD dwPos;
   
    dwPos.X = x;
    dwPos.Y = y;
   
    hCon = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleCursorPosition( hCon, dwPos );
}

void boardDraw( string board[ 30 ][ 30 ] )
{
   
    for( int i = 0; i < 30; i++ )
    {
        for( int j = 0; j < 30; j++ ) cout << board[ i ][ j ];
       
        cout << endl;
    }
   
}


void point( string board[ 30 ][ 30 ] )
{
    int x = rand() % 28 + 1;
    int y = rand() % 28 + 1;
    board[ x ][ y ] = "* ";
}

void snake( string board[ 30 ][ 30 ], string & direct, int & snakeCordX, int & snakeCordY, int & size, int XHistory[ 100000 ], int YHistory[ 100000 ], int & nmb, bool & pointExist )
{
    XHistory[ nmb ] = snakeCordX;
    YHistory[ nmb ] = snakeCordY;
    nmb++;
   
   
    if( direct == "up" )
    {
        snakeCordX--;
    }
    else if( direct == "down" )
    {
        snakeCordX++;
    }
    else if( direct == "left" )
    {
        snakeCordY--;
    }
    else if( direct == "right" )
    {
        snakeCordY++;
    }
    //get point
    if( board[ snakeCordX ][ snakeCordY ] == "* " )
    {
        size++;
        pointExist = 0;
    }
    //game over
    if( board[ snakeCordX ][ snakeCordY ] == "--" || board[ snakeCordX ][ snakeCordY ] == "|" || board[ snakeCordX ][ snakeCordY ] == "x " )
    {
       
        cout << "przegrales ;(";
        system( "pause" );
    }
    board[ snakeCordX ][ snakeCordY ] = "x ";
    board[ XHistory[ nmb - size ] ][ YHistory[ nmb - size ] ] = "  ";
   
}






int main()
{
   
    srand( time( NULL ) );
    string direct = "up";
    int snakeCordX = 15;
    int snakeCordY = 15;
    bool pointExist = 0;
    int nmb = 0;
    int size = 1;
    int XHistory[ 100000 ];
    int YHistory[ 100000 ];
    //tablica
    string board[ 30 ][ 30 ];
    for( int i = 0; i < 30; i++ )
    {
        for( int j = 0; j < 30; j++ ) board[ i ][ j ] = "  ";
       
        cout << endl;
    }
    //snake generator
   
    board[ snakeCordX ][ snakeCordY ] = "x ";
   
    //ramka
    for( int i = 0; i < 30; i++ ) board[ 0 ][ i ] = "--";
   
    for( int i = 0; i < 30; i++ ) board[ 29 ][ i ] = "--";
   
    for( int i = 0; i < 30; i++ ) board[ i ][ 0 ] = "|";
   
    for( int i = 0; i < 30; i++ ) board[ i ][ 29 ] = "|";
   
   
    cout << endl;
    cout << endl;
    for(;; )
    {
        //system("cls");
        idzdoxy( 0, 0 );
        boardDraw( board );
        if( kbhit() ) direct = direction();
       
        snake( board, direct, snakeCordX, snakeCordY, size, XHistory, YHistory, nmb, pointExist );
        if( !pointExist )
        {
            point( board );
            pointExist = 1;
        }
       
        Sleep( 100 );
    }
    getch();
    return 0;
}
P-173621
pekfos
» 2019-01-20 22:18:52
Masz na myśli kursor?
P-173622
walkorn
Temat założony przez niniejszego użytkownika
» 2019-01-20 22:30:07
Chodzi o poziome kreski, jak przy oczekiwaniu konsoli na wprowadzenie przez użytkownika jakiejś wartości z klawiatury. Poniżej zamieszczam link do zdjęcia.
https://zapodaj.net​/8441701ce09e9.png.html
P-173623
pekfos
» 2019-01-20 22:51:36
To jest kursor.
P-173624
walkorn
Temat założony przez niniejszego użytkownika
» 2019-01-20 23:00:16
Ach, dzięki za uświadomienie. Znalazłem na internecie gotową funkcję ukrywającą kursor i rzeczywiście rozwiązuje ona problem, jednak jest ona trochę złożona:

C/C++
HANDLE hOut;
CONSOLE_CURSOR_INFO ConCurInf;

hOut = GetStdHandle( STD_OUTPUT_HANDLE );

ConCurInf.dwSize = 10;
ConCurInf.bVisible = FALSE;

SetConsoleCursorInfo( hOut, & ConCurInf );
Czy istnieje jakaś wbudowana funkcja typu "hidecursor()", która zastąpi powyższy kod, czy jestem na niego "skazany"?
P-173625
pekfos
» 2019-01-20 23:01:16
Czemu samemu nie możesz napisać takiej funkcji?
P-173626
walkorn
Temat założony przez niniejszego użytkownika
» 2019-01-20 23:02:55
Szczerze? Nie posiadam chyba jeszcze takiej wiedzy, co zresztą można wywnioskować po moim kodzie ;)
P-173627
pekfos
» 2019-01-20 23:53:16
To znaczy jakiej wiedzy? Masz w kodzie użyte funkcje.
P-173628
« 1 » 2
  Strona 1 z 2 Następna strona