Nagły błąd wykonywania programu

0

Witam!
Tak dla ćwiczenia, treningu postanowiłem napisać jakąś małą gierkę, są to uproszczone okręty (tzn zawodnik odgaduje położenie okrętów przeciwnika, jednak okrętów jest tylko 5) no i wszystko szło w miare dobrze, aż w końcu podczas działania gry zaczęło mi wyskakiwać windowsowe okienko z napisem "Wystąpił problem z aplikacją Okrety.exe i zostanie ona zamknięta. Przepraszamy za kłopoty." no i za bardzo nie wiem dlaczego tak sie dzieje, a tym bardziej dla mnie jest to dziwne iż dzieje się to raz wcześniej, a gdy włączę grę po raz drugi, to błąd wyskakuje później. C++ uczę się z kursów w internecie więc jestem raczej amatorem, może stąd moja niewiedza... :-/
ale może ktoś ma jakis pomysł dlaczego tak się dzieje? poniżej zamieszczam kody 3 plików które składają się na moją gierkę:

game.h

#include <iostream>

enum ZNAK { ZN_OKRET = 'O', 
            ZN_STRZELONE = 'X', 
            ZN_ZATOPIONY = '*' };
enum POLE { PL_WOLNE, 
            PL_ZAJETE = ZN_STRZELONE, 
            PL_OKRET = ZN_OKRET,
            PL_SCHOWANY, 
            PL_STRZELONE = ZN_STRZELONE, 
            PL_ZATOPIONY = ZN_ZATOPIONY };
enum GRACZ { GRACZ1, GRACZ2};

class CGracz
{
      private:
              int LicznikTrafien;
      public:     
             std::string strImie;
             bool StworzLicznik() {LicznikTrafien = 0;return true;};
             bool LicznikInkrementuj() {LicznikTrafien += 1;return true;};
             int Licznik() {return LicznikTrafien;};
};

class CPlansza
{
      public:
             POLE aPlansza[5][5];
             bool StworzPlansze();
             bool RysujPlansze();
             bool WyborOkretow(CGracz);
             bool KopiujPlansze(CPlansza);
             bool Strzal(GRACZ, CGracz);
};


// rozpoczęcie gry
bool StartGry();
// instrukcje jak rozmieszczac okrety
void WyborWstep();
// przeniesienie zawartosci jednej planszy do drugiej aby mozliwe bylo strzelanie
bool KopiujPlansze(CPlansza P1, CPlansza P2);
// instrukcje jak strzelac
void StrzalWstep();
// wykonanie ruchu
bool Strzal(GRACZ, CGracz, CPlansza);
// oglasza, kto wygral gre
void Zwyciestwo(CGracz, CGracz);
// dedlarace zapowiadajace zmiennych
extern GRACZ AktualnyGracz;
extern CGracz Gracz1;
extern CGracz Gracz2;
extern CPlansza Plansza1m; // okrety pierwszego gracza
extern CPlansza Plansza2m; // okrety drugiego gracza
extern CPlansza Plansza1s; // strzaly pierwszego gracza, plansza zawiera okrety gracza drugiego
extern CPlansza Plansza2s; // strzaly drugiego gracza, plansza zawiera okrety gracza pierwszego

game.cpp

#include "game.h"
#include <ctime>
#include <conio.h>
using namespace std;

GRACZ AktualnyGracz;

CGracz Gracz1, Gracz2;

CPlansza Plansza1m, Plansza1s, Plansza2m, Plansza2s;
 

bool StartGry()
{    
     cout << "                      OKRETY                      " << endl
          << "--------------------------------------------------" << endl << endl;
     \
     cout << "Witaj w grze Okrety! Polega ona na odgadywaniu," << endl 
          << "w jakim miejscu planszy przeciwnik umiescil swoje" << endl
          << "okrety. Wygrywa gracz, ktory dokona tego szybciej!" << endl << endl
          << "Gra odbywa sie na planszy 5x5, natomiast do dyspozycji" << endl
          << "jest 5 okretow. Mozna je ustawiac na dowolnym mijescu" << endl
          << "planszy, jednak nie moga one ze soba sasiadowac, tzn." <<endl
          << "jezeli jeden okret jest na pewnym polu, to drugi" << endl
          << "nie moze byc obok niego, nad nim oraz pod nim." << endl << endl
          << "Dalsze instrukcje beda pojawiac sie w razie potrzeby," << endl
          << "zycze dobrej zabawy i celnych strzalow :))" << endl << endl << endl;
     
     // stworzenie graczy i zapytanie o imiona
     string strImie;
     cout << "Prosze o podanie swojego imienia przez jednego z graczy: " ;
     cin >> strImie;
     Gracz1.strImie = strImie;
     cout << endl << "Prosze o podanie swojego imienia przez drugiego gracza: ";
     cin >> strImie;
     Gracz2.strImie = strImie;
     
              
     // losujemy gracza, który będzie zaczynał
     srand (static_cast<unsigned>(time(NULL)));
     AktualnyGracz = (rand() % 2 == 0 ? GRACZ1 : GRACZ2);
     if (AktualnyGracz == GRACZ1)
        cout << endl << "Gre rozpocznie " << Gracz1.strImie << "." << endl;
     else
        cout << endl << "Gre rozpocznie " << Gracz2.strImie << "." << endl;
          
     return true;
} // koniec funkcji StartGry......................

bool CPlansza::RysujPlansze()
{    
     system ("cls");
     cout << "                      OKRETY                      " << endl
          << "--------------------------------------------------" << endl << endl;
     
     cout << "        ------------------" << endl;
     for (int i = 0; i < 5; ++i)
     {
         // lewa część ramki
         cout << "        |";
         // wiersz
         for (int j = 0; j < 5; ++j)
         {
             if (aPlansza[i][j] == PL_WOLNE || aPlansza[i][j] == PL_SCHOWANY)
             // numer pola
             {
                      cout.width(3);
                      cout << i * 5 + j + 1;
             }
             else
             {
                      cout.width(3);
                      cout << static_cast<char>(aPlansza[i][j]);
             }
         }
         // prawa część ramki
         cout << " |" << endl;
     }
     cout << "        ------------------" << endl;
     return true;
}

bool CPlansza::StworzPlansze()
{
     for (int i = 0; i < 5; ++i)
     {
         for (int j = 0; j < 5; ++j)
         {
             aPlansza[i][j] = PL_WOLNE;
         }
     }
     return true;
}

bool CPlansza::WyborOkretow(CGracz Gracz)
{
     int iNumerPola;
     
     system ("cls");
     cout << "                      OKRETY                      " << endl
          << "--------------------------------------------------" << endl << endl;
     
     cout << Gracz.strImie << ", Twoja kolej :)" << endl
          << "Nacisnij dowolny klawisz aby rozpoczac ustawianie.";
     getch();
     
     for (int i=0; i < 5; )
     {
              RysujPlansze();
              cout << "Podaj numer pola, w ktorym chcesz ustawic swoj okret: " << endl;
         
              cin >> iNumerPola;
              cout << endl;
              if (iNumerPola >= 1 && iNumerPola <= 25)
              {
              unsigned nY = (iNumerPola - 1) / 5;
              unsigned nX = (iNumerPola - 1) % 5;
         
              if (aPlansza[nY][nX] == PL_WOLNE)
              {
                              if (nX == 4)
                              {
                                     aPlansza[nY][nX] = PL_OKRET;
                                     aPlansza[nY-1][nX] = PL_ZAJETE;
                                     aPlansza[nY+1][nX] = PL_ZAJETE;
                                     aPlansza[nY][nX-1] = PL_ZAJETE;
                                     i += 1;
                              }
                              if (nX == 0)
                              {
                                     aPlansza[nY][nX] = PL_OKRET;
                                     aPlansza[nY-1][nX] = PL_ZAJETE;
                                     aPlansza[nY+1][nX] = PL_ZAJETE;
                                     aPlansza[nY][nX+1] = PL_ZAJETE;
                                     i += 1;
                              }
                              if (nX != 4 && nX != 0)
                              {
                                     aPlansza[nY][nX] = PL_OKRET;
                                     aPlansza[nY-1][nX] = PL_ZAJETE;
                                     aPlansza[nY+1][nX] = PL_ZAJETE;
                                     aPlansza[nY][nX-1] = PL_ZAJETE;
                                     aPlansza[nY][nX+1] = PL_ZAJETE;
                                     i += 1;
                              }
              }
              }
     } // koniec petli for
     
     // zmiana gracza
     AktualnyGracz = (AktualnyGracz == GRACZ1 ? GRACZ2 : GRACZ1);
     return true;
}

bool CPlansza::KopiujPlansze(CPlansza P1)
{
     for (int i=0 ; i < 5 ; ++i)
     {
         for (int j=0 ; j < 5 ; ++j)
         {
             if (P1.aPlansza[i][j] == PL_OKRET)
             {
                     aPlansza[i][j] = PL_SCHOWANY;
             }
             if (P1.aPlansza[i][j] == PL_ZAJETE || P1.aPlansza[i][j] == PL_WOLNE)
             {
                     aPlansza[i][j] = PL_WOLNE;
             }
         }
     }
     return true;
}     

void WyborWstep()
{
     system ("cls");
     cout << "                      OKRETY                      " << endl
          << "--------------------------------------------------" << endl << endl;
     
     cout << "Teraz, gracze sa proszeni aby umiescic na planszach swoje okrety." << endl
          << "Najlepiej zeby drugi gracz nie podgladal ustawiania okretow przez" << endl
          << "gracza pierwszego :P" << endl
          << "W mijescu, gdzie ustawisz okret, pojawi sie znak O," << endl
          << "natomiast w polach obok niego pojawia sie X, co znaczy" << endl
          << "ze tam nie mozesz juz umieszczac swoich okretow." << endl << endl;
          getch();
}

void StrzalWstep()
{
     system ("cls");
     cout << "                      OKRETY                      " << endl
          << "--------------------------------------------------" << endl << endl;
     
     cout << "Nareszczie, bedzie mozna troche postrzelac xD" << endl
          << "Dokonujemy tego podobnie, jak ustawialismy nasze" << endl
          << "okrety, wiec mysle ze nie bedzie problemow :P" << endl
          << "W polu, w ktore strzeliles pojawic sie moga nastepujace znaki:" << endl
          << "- X jezeli nie trafiles," << endl
          << "- * jezeli trafiles." << endl
          << "W takim razie powodzenia :))" << endl;
          getch();
}

bool CPlansza::Strzal(GRACZ AktualnyGracz, CGracz Gracz)
{
     
     RysujPlansze();
     
     cout << Gracz.strImie << ", ognia!" << endl;
     
     cout << endl << "Wprowadz numer pola, w ktore chcesz strzelic:" << endl;
     unsigned uStrzal;
     cin >> uStrzal;
     if (!(uStrzal>=1 && uStrzal <= 25)) return false;
     unsigned wY = (uStrzal - 1) / 5;
     unsigned wX = (uStrzal - 1) % 5;
     if (aPlansza[wY][wX] == PL_SCHOWANY)
     {
        aPlansza[wY][wX] = PL_ZATOPIONY;
        Gracz.LicznikInkrementuj();
        RysujPlansze();
        cout << endl << endl << "Brawo " << Gracz.strImie << ", trafiony!";
        getch();
     }
     if (aPlansza[wY][wX] == PL_WOLNE) 
     {
        aPlansza[wY][wX] = PL_STRZELONE;
        RysujPlansze();
        cout << endl << endl << Gracz.strImie << ", niestety nie udalo sie trafic... :P";
        getch();
     }
     
     AktualnyGracz = (AktualnyGracz == GRACZ1 ? GRACZ2 : GRACZ1);
     return true;
}

void Zwyciestwo(CGracz Gracz1, CGracz Gracz2)
{
     system ("cls");
     cout << "                      OKRETY                      " << endl
          << "--------------------------------------------------" << endl << endl << endl;
          
     if (Gracz1.Licznik() > Gracz2.Licznik())
     {
                  cout << "Gratulacje, " << Gracz1.strImie << "!!!" << endl
                       << "WYGRAAAAAAANA!!!" << endl
                       << Gracz1.strImie << " jest THE BEEEST!!!" << endl;
     }
     if (Gracz2.Licznik() > Gracz1.Licznik())
     {
                  cout << "Gratulacje, " << Gracz2.strImie << "!!!" << endl
                       << "WYGRAAAAAAANA!!!" << endl
                       << Gracz2.strImie << " jest THE BEEEST!!!" << endl;
     }
}

main.cpp

#include <conio.h>
#include "game.h"
#include <iostream>

int main()
{
    StartGry();    
    getch();
    Plansza1m.StworzPlansze();
    Plansza2m.StworzPlansze();
    Plansza1s.StworzPlansze();
    Plansza2s.StworzPlansze();
    WyborWstep();
    for (int j =0 ; j < 2 ; ++j)
    {
     if (AktualnyGracz == GRACZ1)
      {
        Plansza1m.WyborOkretow(Gracz1);
        Plansza1m.RysujPlansze();
        getch();
      }
     else
      { 
        Plansza2m.WyborOkretow(Gracz2);
        Plansza2m.RysujPlansze();
        getch();
      }
    }
    Plansza2s.KopiujPlansze(Plansza1m);
    Plansza1s.KopiujPlansze(Plansza2m);
    Gracz1.StworzLicznik();
    Gracz2.StworzLicznik();
    StrzalWstep();
    int Licznik1, Licznik2;
    Licznik1 = Gracz1.Licznik();
    Licznik2 = Gracz2.Licznik();
    for(;;)
    {
           if (Licznik1 == 5 || Licznik2 == 5)
           {
                      break;
           }
           else
           {
            if (AktualnyGracz == GRACZ1)
            {
                      Plansza1s.Strzal(GRACZ1, Gracz1);
            }
            if (AktualnyGracz == GRACZ2)
            {
                      Plansza2s.Strzal(GRACZ2, Gracz2);
            }
           }
    }
    Zwyciestwo(Gracz1, Gracz2);
    getch();
    return 0;
}

Natomiast te błędy wyskakują mi albo kiedy pierwszy gracz skończy ustawiać swoje okręty, albo kiedy działa funkcja StrzalWstep();...

z góry dziękuję za jakąkolwiek pomoc ;-)

0

słyszałeś o takim cudownym narzędziu Debugger?
uruchom program w Debuggerze i wszystko będzie jasne.

0

używam dev-c++ i niestety nie moge sobie poradzic z debuggerem... za kazdym razem wyskakuje okienko "Twoj projekt nie generuje informacji dla odpluskwiacza. Czy chcesz uruchomic odpluskwianie i przebudowac swoj projekt?" i jak potwierdzam to dalej to samo, a w opcjach kompilatora mam zaznaczone aby informacje dla debuggera byly wysylane :-/

0

Użyj porządnego IDE.

0

czyli sciagnij sobie np. visual studio express, jest darmowe..
albo, w dokumentacji swojego IDE znajdz, jak zmusic kompilator do zalaczania tychze informacji

btw. zrezygnuj z DevC++ jak najszybciej. srodowisko jest uszkodzone, korzystalo z uszkodzonego kompilatora, i to tego jako projekt podobno juz nie jest kontynuowane..

1 użytkowników online, w tym zalogowanych: 0, gości: 1