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. #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"; else if( key == 304 ) return "down"; else if( key == 299 ) return "left"; else if( key == 301 ) return "right"; }
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++; } if( board[ snakeCordX ][ snakeCordY ] == "* " ) { size++; pointExist = 0; } 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 ]; string board[ 30 ][ 30 ]; for( int i = 0; i < 30; i++ ) { for( int j = 0; j < 30; j++ ) board[ i ][ j ] = " "; cout << endl; } board[ snakeCordX ][ snakeCordY ] = "x "; 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(;; ) { 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; } |
|
pekfos |
» 2019-01-20 22:18:52 Masz na myśli kursor? |
|
walkorn Temat założony przez niniejszego użytkownika |
» 2019-01-20 22:30:07 |
|
pekfos |
» 2019-01-20 22:51:36 To jest kursor. |
|
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: 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"? |
|
pekfos |
» 2019-01-20 23:01:16 Czemu samemu nie możesz napisać takiej funkcji? |
|
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 ;) |
|
pekfos |
» 2019-01-20 23:53:16 To znaczy jakiej wiedzy? Masz w kodzie użyte funkcje. |
|
« 1 » 2 |