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

Generowanie mapy

Ostatnio zmodyfikowano 2017-01-18 12:52
Autor Wiadomość
pawels305
Temat założony przez niniejszego użytkownika
Generowanie mapy
» 2017-01-16 19:22:53
Witam, mam za zadanie jako projekt zrobić grę saper w C++. Zrobiłem już działającą grę jednak wcześniej miałem z góry określone rozmiary mapy i zmieniłem by gracz mógł ustalać, jednakże teraz po podaniu szerokości i wysokości mapy pojawia się komunikat że program przestał działać. Z góry dziękuję za pomoc, jest to mój pierwszy projekt więc z pewnością nie jest profesjonalnie napisany więc proszę o wyrozumiałość.
C/C++
#include <iostream>
#include<stdio.h>
#include<conio.h>
#include<cstdlib>
#include<ctime>
#include<windows.h>
using namespace std;


struct Mapa
{
    int Wartosc;
    bool Odkryta;
    bool Podejrzenie_miny;
};
struct Gracz
{
    int PozX;
    int PozY;
};


void generuj_mape( Mapa ** mapa, int szer, int wys, Gracz & gracz )
{
    for( int i = 0; i < szer; i++ )
    for( int j = 0; j < wys; j++ )
    {
        mapa[ i ][ j ].Wartosc = 0;
        mapa[ i ][ j ].Odkryta = false;
        mapa[ i ][ j ].Podejrzenie_miny = false;
    }
    gracz.PozX = szer / 2;
    gracz.PozY = wys / 2;
}
void ustaw_mine( Mapa ** mapa, int PozX, int PozY, int szer, int wys )
{
    mapa[ PozX ][ PozY ].Wartosc = 9;
    for( int i = - 1; i < 2; i++ )
    for( int j = - 1; j < 2; j++ )
    {
        if( j + PozX < 0 || i + PozY < 0 ) continue;
       
        if( j + PozX > szer || i + PozY > wys ) continue;
       
        if( mapa[ PozX + j ][ PozY + i ].Wartosc == 9 ) continue;
       
        mapa[ PozX + j ][ PozY + i ].Wartosc++;
    }
}


void losuj_miny( Mapa ** mapa, Gracz & gracz, int szer, int wys )
{
    time_t t;
    int PozX, PozY, ilosc_min = 10;
    srand(( unsigned ) time( & t ) );
    while( ilosc_min > 0 )
    {
        PozX = rand() % szer;
        PozY = rand() % wys;
        if( mapa[ PozX ][ PozY ].Wartosc != 9 ) {
            ustaw_mine( mapa, PozX, PozY, szer, wys );
            ilosc_min--;
        }
    }
   
}
void Stan_planszy( Mapa ** mapa, Gracz & gracz, HANDLE uchwyt, int szer, int wys ) {
    system( "cls" );
    for( int i = 0; i < wys; i++ )
    {
        for( int j = 0; j < szer; j++ )
        {
            if( j == gracz.PozX && i == gracz.PozY ) {
               
                SetConsoleTextAttribute( uchwyt, 2 );
                cout << "&";
                SetConsoleTextAttribute( uchwyt, 7 );
               
            }
            else if( mapa[ j ][ i ].Odkryta == true )
                 cout << mapa[ j ][ i ].Wartosc;
            else if( mapa[ j ][ i ].Odkryta == false && mapa[ j ][ i ].Podejrzenie_miny == false )
                 cout << "#";
            else if( mapa[ j ][ i ].Odkryta == false && mapa[ j ][ i ].Podejrzenie_miny == true )
            {
                SetConsoleTextAttribute( uchwyt, 4 );
                cout << "@";
                SetConsoleTextAttribute( uchwyt, 7 );
            }
        }
        cout << endl;
       
    }
    cout << "Pozycja gracza:" << endl;
    cout << "X:" << gracz.PozX + 1 << endl;
    cout << "Y:" << gracz.PozY + 1 << endl;
}

void dzialania_gracza( Mapa ** mapa, char znak, Gracz & gracz, bool & zakoncz, int szer, int wys )
{
    if( znak == 'a' && gracz.PozX > 0 ) gracz.PozX--;
   
    if( znak == 'd' && gracz.PozX < szer - 1 ) gracz.PozX++;
   
    if( znak == 's' && gracz.PozY < wys - 1 ) gracz.PozY++;
   
    if( znak == 'w' && gracz.PozY > 0 ) gracz.PozY--;
   
    if( znak == 'q' ) {
        cout << "Na pewno chcesz wyjsc? [y/n]";
        znak = getch();
        if( znak == 'y' )
             zakoncz = true;
        else if( znak == 'n' )
             zakoncz = false;
       
    }
    if( znak == 'l' && mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny == false )
         mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny = true;
    else if( znak == 'l' && mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny == true )
         mapa[ gracz.PozX ][ gracz.PozY ].Podejrzenie_miny = false;
   
   
    if( znak == 'k' && mapa[ gracz.PozX ][ gracz.PozY ].Wartosc == 9 )
    {
        cout << "Przykro mi, przegrales, kliknij aby kontynuowac";
        zakoncz = true;
        getch();
    }
    else if( znak == 'k' && mapa[ gracz.PozX ][ gracz.PozY ].Wartosc != 9 )
         mapa[ gracz.PozX ][ gracz.PozY ].Odkryta = true;
   
   
   
   
}

bool czy_wygral( Mapa ** mapa, bool & zakoncz, clock_t start, clock_t & stop, int szer, int wys ) {
    int miny = 0;
    for( int i = 0; i < wys; i++ )
    {
        for( int j = 0; j < szer; j++ )
        if( mapa[ j ][ i ].Odkryta == false )
             miny++;
       
    }
    if( miny == 10 )
    {
        stop = clock();
        double czas;
        czas =( double )( stop - start ) / CLOCKS_PER_SEC;
        cout << "Gratuluje wygranej! Zajelo ci to:" << czas << " sekund. Kliknij aby kontynuowac";
        zakoncz = true;
        getch();
       
        return true;
    }
    return false;
}





int main( int argc, char ** argv ) {
    HANDLE uchwyt;
    int szer, wys, ilosc_min;
    clock_t start, stop;
    uchwyt = GetStdHandle( STD_OUTPUT_HANDLE );
    char wybor;
    while( 1 < 2 )
    {
        system( "cls" );
        SetConsoleTextAttribute( uchwyt, 6 );
       
        cout << "    MENU GLOWNE" << endl;
        SetConsoleTextAttribute( uchwyt, 7 );
       
        cout << "1.Nowa gra" << endl;
        cout << "2.Jak grac" << endl;
        cout << "3.Wyjscie z programu" << endl;
        wybor = getch();
        switch( wybor )
        {
        case '1':
            {
                system( "cls" );
                cout << "Podaj x:";
                cin >> szer;
                cout << "Podaj y:";
                cin >> wys;
                //cout<<"Podaj ilosc min:";
                //cin>>ilosc_min;
                Mapa ** mapka = new Mapa *[ szer ];
                for( int i = 0; i < szer; i++ )
                     mapka[ i ] = new Mapa[ wys ];
               
                start = clock();
                Gracz gracz;
                generuj_mape( mapka, szer, wys, gracz );
                losuj_miny( mapka, gracz, szer, wys );
                bool zakoncz = false;
                Stan_planszy( mapka, gracz, uchwyt, szer, wys );
                while( !zakoncz )
                {
                    if( kbhit() )
                    {
                        char znak = getch();
                        dzialania_gracza( mapka, znak, gracz, zakoncz, szer, wys );
                        Stan_planszy( mapka, gracz, uchwyt, szer, wys );
                        czy_wygral( mapka, zakoncz, start, stop, szer, wys );
                       
                    }
                   
                }
               
            } break;
        case '2':
            cout << "Tu bedzie opis";
            getch();
            break;
        case '3':
            exit( 0 );
        }
    }
    return 0;
}
P-156502
michal11
» 2017-01-16 20:19:32
U mnie działa, jakie wartości podajesz?

Wstaw kod na forum w odpowiednie znaczniki.
P-156504
pawels305
Temat założony przez niniejszego użytkownika
» 2017-01-16 23:13:49
Już poprawione, w sumie różne próbowałem i za każdym razem pokazywało, że przestał działać. Znaczy na samym początku dla wartości 12 i 8 było dobrze a potem dla nich tez przestało działać. Teraz wpisuję np 10 10 i przestaje działać :/
P-156523
czaffik
» 2017-01-17 02:46:27
Użyj potęgi mocy, znaczy się debuggera. On wskaże ci 45 linię twojego kodu:
C/C++
if( mapa[ PozX + j ][ PozY + i ].Wartosc == 9 ) continue;

a rozwiązanie problemu polega na zmianie linii 43 z:
C/C++
if( j + PozX > szer || i + PozY > wys ) continue;

na
C/C++
if( j + PozX >= szer || i + PozY >= wys ) continue;

Po prostu wychodziłeś poza zakres tablicy, raz się uda, drugi raz nie, mi za pierwszym razem też zadziałało, ale potem zaczeło się krzaczyć.
P-156526
pawels305
Temat założony przez niniejszego użytkownika
» 2017-01-17 14:43:03
Zrobiłem tak, ale wciąż jest ten problem, że czasem działa czasem nie i nie wiem co jest grane :/ A co do debuggera jest ten problem, że dopiero zaczynam programowanie i nie do końca jeszcze wiem jak się nim posługiwać.
P-156545
pawels305
Temat założony przez niniejszego użytkownika
» 2017-01-17 14:53:48
Po kilku testach wydaje mi się, że wszystko działa dobrze gdy tworzy się mapę kwadratową, a gdy już o różnych wymiarach to często przestaje działać.
P-156546
czaffik
» 2017-01-17 16:21:52
to dziwne, co bym teraz nie wpisywał to mi działa i nie chce się wyłożyć.
Dowiedz się jak debugować, nie musisz od razu być w tym specjalistą, wystarczy że wskaże ci miejsce występowania błędu, nie zawsze ale zazwyczaj da co to jakiś trop.
P-156549
pawels305
Temat założony przez niniejszego użytkownika
» 2017-01-17 16:29:34
No zmieniłem tą jedną linijkę ale działa umnie tylko dla kwadratowej, jeszcze się pobawię. A próbowałem i za pomocą deva i code blocksa i nic. Znaczy najwiekszy problem, że trzeba te zmienne ustalić które ma obserwować a nie wiem które.W każdym razie dzięki za pomoc :)
P-156550
« 1 » 2
  Strona 1 z 2 Następna strona