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 ;-)