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

Jaka wiedza jest mi potrzebna do napisania Snake w konsoli ?

Ostatnio zmodyfikowano 2017-06-28 10:58
Autor Wiadomość
latajacaryba
» 2017-06-25 12:26:15
@Berecik
Od maja 2016 :)
P-162816
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:

C/C++
#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;
    //TWORZENIE MAPY
    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 ] = ' ';
            }
        }
    }
    //japko :)
    int
    JablkoX,
    JablkoY;
    bool
    czyIstnieje = false; // czy jest na mapie
    // WAZ
    bool
    nowySegment;
    int
    PozycjaGlowyX = KOLUMNY / 2,
    PozycjaGlowyY = WIERSZE / 2;
    mapa[ PozycjaGlowyY ][ PozycjaGlowyX ] = znakWeza; // glowa weza na srodku mapy
    int
    CialoWezaX[( WIERSZE - 2 ) *( KOLUMNY - 2 ) ],
    CialoWezaY[( WIERSZE - 2 ) *( KOLUMNY - 2 ) ];
    for( int i = 0; i < DlugoscWeza - 1; i++ ) // ustawianie ciala weza za jego glowa
    {
        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 ) { // W GORE
            PrzesuniecieY = - 1;
            PrzesuniecieX = 0;
        }
        if( klawisz == 77 ) { // W PRAWO
            PrzesuniecieX = 1;
            PrzesuniecieY = 0;
        }
        if( klawisz == 80 ) { // W DOL
            PrzesuniecieY = 1;
            PrzesuniecieX = 0;
        }
        if( klawisz == 75 ) { // W LEWO
            PrzesuniecieX = - 1;
            PrzesuniecieY = 0;
        }
        //RUCH
        if( mapa[ PozycjaGlowyY + PrzesuniecieY ][ PozycjaGlowyX + PrzesuniecieX ] == '#' || mapa[ PozycjaGlowyY + PrzesuniecieY ][ PozycjaGlowyX + PrzesuniecieX ] == znakWeza ) {
            cout << "przegrales! ";
            _getch();
            return 0;
        }
        else if( czyIstnieje && PozycjaGlowyX == JablkoX && PozycjaGlowyY == JablkoY ) { // czy zjadl jablko
            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++ ) { // przesuwanie weza
            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 ];
        // losowanie jablka
        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" );
    }
}
P-162863
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
P-162882
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.
P-162887
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.
P-162889
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").
P-162903
1 « 2 »
Poprzednia strona Strona 2 z 2