• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program się zatrzymuje i wyłącza po uruchomieniu, brak błędów kompilacji.

Object Storage Arubacloud
0 głosów
651 wizyt
pytanie zadane 19 marca 2016 w C i C++ przez endru Nowicjusz (170 p.)

Witam, napisałem prymitywny silnik gry 2d, który wyświetla mapę złożoną z kropek i naszą postać jako znak @. Postacią można poruszać po mapie za pomocą klawiszy WASD.

Przy kompilacji ukazuje nam się napisa początkowy (witaj, naciśnij 1 aby...) po wpisaniu 1 program powinien wyświetlić mapkę, jednak nic się nie dzieje, po kilku sekundach Windows wyświetla błąd i zamyka program.

Ktoś wie co jest nie tak?

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <windows.h>                //polish notes 
 
 
using namespace std;
 
int const mapa_x = 10;
int const mapa_y = 10;
struct posXY                // struktura przechowujaca pozycje gracza
    int pos_x, pos_y;
};
posXY gracz;
 
void ruch()     // funkcja odpowiadajaca za ruch gracza
        {
 
            char krok = getch();
 
                switch(krok){
             case 'w':
                {
                    if(gracz.pos_x == 0)
                        break;
                    else gracz.pos_x--;
                };
             case 'a':
                {
                    if(gracz.pos_y == 0)
                        break;
                    else gracz.pos_y--;
                };
             case 's':
                {
                    if(gracz.pos_x == mapa_x)
                        break;
                    else gracz.pos_x++;
                };
             case 'd':
                    {
                        if(gracz.pos_y == mapa_y)
                            break;
                        else gracz.pos_y++;
                    };
                }
 
 
        }
 
 
 
class Mapa          // klasa mapy
{
 
    int mapa[mapa_x][mapa_y];       // tablica dwuwymiarowa - pole mapy
 
public:
 
  Mapa()            // ... konstruktor? który ustala mape jako czystą bazowo
   {
            for(int i = 0; i < mapa_x; i++)
            {
                for(int j = 0; j < mapa_y; i++)
                {
                    mapa[i][j] = 0;
                }
            };
 
        };
 
    void pozycja()          // startowa pozycja gracza 
        {
            mapa[gracz.pos_x][gracz.pos_y] = 1;
        }
 
        void rysuj()        // rysuje mape
        {
 
            for(int i = 0; i< mapa_x; i++)
            {
 
                for(int j = 0; j < mapa_y; j++)
                {
                    switch(mapa[i][j])
                    {case 0:
                        {
                        cout << ".";
                        break;
                        }
                    case 1:
                        {
                        cout << "@";
                        break;
                        }
 
                }
            }; cout << endl;
        };
        };
        void czysc()        // resetuje mape 
        {
            for(int i = 0; i < mapa_x; i++)
            {
                for(int j = 0; j < mapa_y; i++)
            {
                mapa[i][j] = 0;
            }
            };
        }
 
 
 
};
 
int main()
{
    int wybor;
 
 
    cout << endl;
    cout << "           Witaj w prostej grze" << endl;
    cout << "           Nacisnij 1 aby zaczac, inna liczbe aby wyjsc"<< endl;   
 
    cin >> wybor;
    Mapa m;
        if( wybor == 1)
        {
            for(;;)
            {
                m.czysc();
                m.rysuj();
                ruch();
                system("cls");
            }
        }
    return 0;
}

3 odpowiedzi

+2 głosów
odpowiedź 19 marca 2016 przez Adrian1999 Nałogowiec (34,570 p.)

Czemu dajesz średnik po każdej linijce? Błąd w tej lini jest też for(int j = 0; j < mapa_y; i++) inkrementujesz i zamiast j.

Pokasuj te średniki tam gdzie nie trzeba i zobacz

komentarz 19 marca 2016 przez jeremus Maniak (59,720 p.)
i to w dwóch miejscach i zamiast j
komentarz 19 marca 2016 przez endru Nowicjusz (170 p.)
już poprawiam, dzięki . jak nie będzie działać to odpowiem
komentarz 19 marca 2016 przez Adrian1999 Nałogowiec (34,570 p.)

oraz jeszcze dodaj { po struct posXY  bo nie otworzyłeś wgle, te błędy ci wyskoczyć powinny

komentarz 19 marca 2016 przez endru Nowicjusz (170 p.)
mapa się utwirzyła! i można się poruszać :) faktycznie usunięcie średnikó pomogło.

Jednak jest nowy problem: jedynie literka D przesuwa tak jak powinna (w lewo). A przesuwa w dół, S po ukosie w prawo a W nie robi nic. ktoś mi wytłumaczy dlaczego?
komentarz 19 marca 2016 przez Adrian1999 Nałogowiec (34,570 p.)
hmmm popróbuj sam, jak za 2h nie dasz rady wróć :D Bo to problem każdego programisty początkującego, rozwiążesz go będziesz bardziej inteligentny na przyszłość
komentarz 19 marca 2016 przez endru Nowicjusz (170 p.)
rozumiem, no ale kurcze :D W nie działa wogóle, inne po ukosie - o co tu biega :D
komentarz 19 marca 2016 przez jeremus Maniak (59,720 p.)
podałem Ci rozwiązanie - w osobnej odpowiedzi - na końcu wątku , ale nie patrz na nie :), może sam dojdziesz , źle obsługujesz switcha
+1 głos
odpowiedź 19 marca 2016 przez jeremus Maniak (59,720 p.)
// masz zlą funkcję ruch - zrób tak :

void ruch()     // funkcja odpowiadajaca za ruch gracza
{
  char krok = getch();
  switch(krok){
    case 'w': if(gracz.pos_x > 0) gracz.pos_x--; break;
    case 'a': if(gracz.pos_y > 0) gracz.pos_y--; break;
    case 's': if(gracz.pos_x < mapa_x-1 )gracz.pos_x++; break;
    case 'd': if(gracz.pos_y < mapa_y-1 )gracz.pos_y++; break;
  }
}

 

0 głosów
odpowiedź 19 marca 2016 przez niezalogowany
int const mapa_x = 10;

int const mapa_y = 10;

struct posXY                // struktura przechowujaca pozycje gracza

    int pos_x, pos_y;

};

posXY gracz;

Gdzie masz nazwę struktury??
komentarz 19 marca 2016 przez endru Nowicjusz (170 p.)
posXY to nazwa, nawias { gdzieś zniknął
komentarz 19 marca 2016 przez endru Nowicjusz (170 p.)

ok

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <windows.h>


using namespace std;

int const mapa_x = 10;
int const mapa_y = 10;
struct posXY
{
    int pos_x, pos_y;
};
posXY gracz;

void ruch()
        {

            char krok = getch();

                switch(krok){
             case 'w':
                {
                    if(gracz.pos_x == 0)
                        break;
                    else gracz.pos_x--;
                };
             case 'a':
                {
                    if(gracz.pos_y == 0)
                        break;
                    else gracz.pos_y--;
                };
             case 's':
                {
                    if(gracz.pos_x == mapa_x)
                        break;
                    else gracz.pos_x++;
                };
             case 'd':
                    {
                        if(gracz.pos_y == mapa_y)
                            break;
                        else gracz.pos_y++;
                    };
                }


        }



class Mapa
{

    int mapa[mapa_x][mapa_y];

public:

  Mapa()
   {
            for(int i = 0; i < mapa_x; i++)
            {
                for(int j = 0; j < mapa_y; i++)
                {
                    mapa[i][j] = 0;
                }
            };

        };

    void pozycja()
        {
            mapa[gracz.pos_x][gracz.pos_y] = 1;
        }

        void rysuj()
        {

            for(int i = 0; i< mapa_x; i++)
            {

                for(int j = 0; j < mapa_y; j++)
                {
                    switch(mapa[i][j])
                    {case 0:
                        {
                        cout << ".";
                        break;
                        }
                    case 1:
                        {
                        cout << "@";
                        break;
                        }

                }
            }; cout << endl;
        };
        };
        void czysc()
        {
            for(int i = 0; i < mapa_x; i++)
            {
                for(int j = 0; j < mapa_y; i++)
            {
                mapa[i][j] = 0;
            }
            };
        }



};

int main()
{
    int wybor;


    cout << endl;
    cout << "           Witaj w prostej grze" << endl;
    cout << "           Nacisnij 1 aby zaczac, inna liczbe aby wyjsc"<< endl;

    cin >> wybor;
    Mapa m;
        if( wybor == 1)
        {
            for(;;)
            {
                m.czysc();
                m.pozycja();
                m.rysuj();
                ruch();
                system("cls");
            }
        }
    return 0;
}

 

Podobne pytania

+2 głosów
2 odpowiedzi 1,224 wizyt
pytanie zadane 23 listopada 2020 w Sprzęt komputerowy przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 123 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...