Jaka wiedza jest mi potrzebna do napisania Snake w konsoli ?
Ostatnio zmodyfikowano 2017-06-28 10:58
latajacaryba |
» 2017-06-25 12:26:15 @Berecik Od maja 2016 :) |
|
Kinexity |
» 2017-06-27 14:37:13 @latajacaryba gra nie działa prawidłowo przy kompilacji w VS2017. Niezainicjowana zmienne 'czyIstnieje','JablkoX','JablkoY' (jabłko w ogóle się nie pojawia) oraz naruszenie dostępu w sekcji "RUCH" w przypadku zjedzenia jabłka (naprawiłem je), który występuje z powodu, którego nawet nie będę próbował zrozumieć :P Coś tam poprawiłem: #include <iostream> #include <windows.h> #include <conio.h> #include <stdlib.h> #include <time.h> using namespace std; const int WIERSZE = 15, KOLUMNY = 50, PAUZA = 25; int DlugoscWeza = 4; const char znakWeza = '+', znakJablka = 'O';
int main() { srand( time( NULL ) ); char mapa[ WIERSZE ][ KOLUMNY ], klawisz; int PrzesuniecieX = 0, PrzesuniecieY = 1; for( int i = 0; i < KOLUMNY; i++ ) { mapa[ 0 ][ i ] = '#'; mapa[ WIERSZE - 1 ][ i ] = '#'; } for( int j = 1; j < WIERSZE - 1; j++ ) { for( int i = 0; i < KOLUMNY; i++ ) { if( i == 0 || i == KOLUMNY - 1 ) { mapa[ j ][ i ] = '#'; } else { mapa[ j ][ i ] = ' '; } } } int JablkoX, JablkoY; bool czyIstnieje = false; bool nowySegment; int PozycjaGlowyX = KOLUMNY / 2, PozycjaGlowyY = WIERSZE / 2; mapa[ PozycjaGlowyY ][ PozycjaGlowyX ] = znakWeza; int CialoWezaX[( WIERSZE - 2 ) *( KOLUMNY - 2 ) ], CialoWezaY[( WIERSZE - 2 ) *( KOLUMNY - 2 ) ]; for( int i = 0; i < DlugoscWeza - 1; i++ ) { CialoWezaY[ i ] = PozycjaGlowyY; CialoWezaX[ i ] = PozycjaGlowyX - i - 1; mapa[ CialoWezaY[ i ] ][ CialoWezaX[ i ] ] = znakWeza; } int ostatniaPozycjaX, ostatniaPozycjaY, poprzedniaPozycjaX, poprzedniaPozycjaY, nastepnaPozycjaX, nastepnaPozycjaY; while( true ) { for( int j = 0; j < WIERSZE; j++ ) { for( int i = 0; i < KOLUMNY; i++ ) { cout << mapa[ j ][ i ]; } cout << endl; } for( int i = 0; i < 20; i++ ) { Sleep( PAUZA ); if( _kbhit() ) { klawisz = _getch(); } } if( klawisz == 72 ) { PrzesuniecieY = - 1; PrzesuniecieX = 0; } if( klawisz == 77 ) { PrzesuniecieX = 1; PrzesuniecieY = 0; } if( klawisz == 80 ) { PrzesuniecieY = 1; PrzesuniecieX = 0; } if( klawisz == 75 ) { PrzesuniecieX = - 1; PrzesuniecieY = 0; } if( mapa[ PozycjaGlowyY + PrzesuniecieY ][ PozycjaGlowyX + PrzesuniecieX ] == '#' || mapa[ PozycjaGlowyY + PrzesuniecieY ][ PozycjaGlowyX + PrzesuniecieX ] == znakWeza ) { cout << "przegrales! "; _getch(); return 0; } else if( czyIstnieje && PozycjaGlowyX == JablkoX && PozycjaGlowyY == JablkoY ) { czyIstnieje = false; if( mapa[ CialoWezaY[ DlugoscWeza - 1 ] ][ CialoWezaX[ DlugoscWeza - 1 ] - 1 ] == ' ' ) { ++DlugoscWeza; mapa[ CialoWezaY[ DlugoscWeza - 1 ] ][ CialoWezaX[ DlugoscWeza - 1 ] - 1 ] = znakWeza; ostatniaPozycjaX = CialoWezaX[ DlugoscWeza - 1 ]; ostatniaPozycjaY = CialoWezaY[ DlugoscWeza - 1 ]; nowySegment = true; } else if( mapa[ CialoWezaY[ DlugoscWeza - 1 ] ][ CialoWezaX[ DlugoscWeza - 1 ] + 1 ] == ' ' ) { ++DlugoscWeza; mapa[ CialoWezaY[ DlugoscWeza - 1 ] ][ CialoWezaX[ DlugoscWeza - 1 ] + 1 ] = znakWeza; ostatniaPozycjaX = CialoWezaX[ DlugoscWeza - 1 ]; ostatniaPozycjaY = CialoWezaY[ DlugoscWeza - 1 ]; nowySegment = true; } else if( mapa[ CialoWezaY[ DlugoscWeza - 1 ] - 1 ][ CialoWezaX[ DlugoscWeza - 1 ] ] == ' ' ) { ++DlugoscWeza; mapa[ CialoWezaY[ DlugoscWeza - 1 ] - 1 ][ CialoWezaX[ DlugoscWeza - 1 ] - 1 ] = znakWeza; ostatniaPozycjaX = CialoWezaX[ DlugoscWeza - 1 ]; ostatniaPozycjaY = CialoWezaY[ DlugoscWeza - 1 ]; nowySegment = true; } else if( mapa[ CialoWezaY[ DlugoscWeza - 1 ] + 1 ][ CialoWezaX[ DlugoscWeza - 1 ] ] == ' ' ) { ++DlugoscWeza; mapa[ CialoWezaY[ DlugoscWeza - 1 ] + 1 ][ CialoWezaX[ DlugoscWeza - 1 ] ] = znakWeza; ostatniaPozycjaX = CialoWezaX[ DlugoscWeza - 1 ]; ostatniaPozycjaY = CialoWezaY[ DlugoscWeza - 1 ]; nowySegment = true; } } else { mapa[ PozycjaGlowyY + PrzesuniecieY ][ PozycjaGlowyX + PrzesuniecieX ] = znakWeza; poprzedniaPozycjaX = PozycjaGlowyX; poprzedniaPozycjaY = PozycjaGlowyY; PozycjaGlowyY += PrzesuniecieY; PozycjaGlowyX += PrzesuniecieX; } for( int i = 0; i < DlugoscWeza; i++ ) { nastepnaPozycjaX = CialoWezaX[ i ]; nastepnaPozycjaY = CialoWezaY[ i ]; CialoWezaX[ i ] = poprzedniaPozycjaX; CialoWezaY[ i ] = poprzedniaPozycjaY; poprzedniaPozycjaX = nastepnaPozycjaX; poprzedniaPozycjaY = nastepnaPozycjaY; if( i == DlugoscWeza - 1 && nowySegment == false ) { mapa[ ostatniaPozycjaY ][ ostatniaPozycjaX ] = ' '; } } nowySegment = false; ostatniaPozycjaX = CialoWezaX[ DlugoscWeza - 1 ]; ostatniaPozycjaY = CialoWezaY[ DlugoscWeza - 1 ]; if( !czyIstnieje ) { do { JablkoX =( rand() % KOLUMNY - 2 ) + 1; JablkoY =( rand() % WIERSZE - 2 ) + 1; } while( mapa[ JablkoY ][ JablkoX ] != ' ' ); czyIstnieje = true; mapa[ JablkoY ][ JablkoX ] = znakJablka; } system( "cls" ); } }
|
|
latajacaryba |
» 2017-06-27 21:12:57 @up Dziwne, kompilowałem w C::B i u mnie wszystko działa... który występuje z powodu, którego nawet nie będę próbował zrozumieć |
W tym kodzie dzieją się rzeczy, których twórca kodu nie rozumie ;) PS. Znalazłem. Jabłko się nie pojawiało prawdopodobnie dlatego, że zrobiłem mały błąd: bool czyIstnieje; a nie bool czyIstnieje = false; Widać domyślną wartością dla c::b w przypadku niezainicjalizowanych zmiennych bool jest false , a dla VS true Działanie na niezainicjalizowanych zmiennych... Co ja sobą reprezentuje ;P |
|
Kinexity |
» 2017-06-27 22:48:29 Poza inicjalizacją to nie wiem, czy zauważyłeś ale w warunku sprawdzającym czy głowa znajduje się w pozycji jabłka zabrakło sprawdzenia, czy jabłko w ogóle istnieje. |
|
latajacaryba |
» 2017-06-27 23:20:06 No tak, bo generalnie pozycja jablka jest losowana wtedy, gdy jablko istnieje. Więc jeśli wąż jest na pozycji jablka, to znaczy że to jablko istnieje, natomiast zaraz po tym jest losowana kolejna pozycja. |
|
Kinexity |
» 2017-06-28 10:58:54 no ale wiesz, że gdy następuje sprawdzenie zgodności pozycji głowy i jabłka to wywala błąd (brak inicjalizacji; można pominąć w VS), ale potem program pomimo błędu uznaje, że warunek został spełniony, przez co nie wylosuje jabłka z kolejnego "else if"'a (zresztą tu byłby kolejny błąd - niezainicjalizowane "czyIstnieje"). |
|
1 « 2 » |