Witam,
Moim zadaniem jest stworzenie gry - poki co tekstowej, która będzie polegała na przeprowadzeniu punkt z lewej strony na prawą i odwrotnie.
W międzyczasie mają być "ruszające się" przeszkody, więc póki co wykombinowałem to na tablicy, która przemieszcza X - przeszkody i . - wolne miejsca, lecz podczas przemieszczania wyskakuje błąd jak w temacie. ( przemieszczanie nie działa ) Poniżej wrzucam kod:
Podejrzane miejsce o błąd to
bool przeszkoda::CzyJest(int y,int x)
{
if (tablica[y][x]->typ == 0)
Lecz nie wiem, dlaczego, nie wychodzę nigdy poza stworzoną tablicę.
Z góry dziękuję za odpowiedź,
Pozdrawiam,
Krystian
funkcje.h
#ifndef _FUNKCJE_H
#define _FUNKCJE_H
#include <iostream>
#include <iomanip> // setw()
#include <cstdlib> // srand()
#include <ctime> // time()
#include <time.h>
using namespace std;
class plansza;
class maszt;
class przeszkoda;
//*********************************************************************************************************************************************************
// ./fun/plansza.cpp
class plansza
{
public:
maszt ***wsk; // wskaznik do wskaznika na wskaznik :P
plansza();
~plansza();
void wyswietl();
};
//*********************************************************************************************************************************************************
// ./fun/maszt.cpp
class maszt // elementarna klasa
{
public:
char stan;
int typ; // 0 - przeszkoda, 3 - puste,
maszt() : stan('.'), typ(3) {} // konstruktor, na poczatku nie ma zadnych stakow czyli maszty sa puste
void wyswietl();
};
//*********************************************************************************************************************************************************
class przeszkoda
{
public:
maszt* tablica[30][42];
void buduj(plansza &NazwaPlanszy);
void ruch (int,plansza&);
bool CzyJest(int,int);
};
void czekaj( int sekundy );
#endif
zmienne.h
#ifndef _ZMIENNE_H
#define _ZMIENNE_H
#include "funkcje.h"
const int poziomtab = 47; // dotyczy tablicy poziomej
const int piontab = 25; //dotyczy tablic pionowej
const bool Linux=true; // dla windowsa wpisac false
extern bool Testowanie; // zmien na false, jak nie chcesz widziec, gdzie sa statki
#endif
main.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
bool Testowanie=true;
int main()
{
srand(time(NULL));
int dl;
plansza statki;
przeszkoda prz;
prz.buduj(statki);
for(int i= 0; i <10; i++)
{
statki.wyswietl();
prz.ruch(1,statki);
czekaj(1);
}
for (int i = 0; i< 10; i++)
prz.CzyJest(i,1);
return 0;
}
plansza.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
plansza::plansza() // konstruktor planszy
{
wsk=new maszt**[piontab+5]; // plansza jest 2-wymiarowa tablica wskaznikow do masztow
for(int i=0; i<piontab+5; i++) // rozmiar +3 a plansza zeby nie bylo przekroczenia zakresu przy losowym ustawianiu statkow
{
wsk[i]=new maszt*[poziomtab+5];
for(int j=0; j<poziomtab+5; j++)
{
wsk[i][j]=new maszt(); // pojedynczy maszt
}
}
}
plansza::~plansza() // destruktor planszy, wykonuje sie kiedy plansza jest niszczona czyli po zakonczeniu gry
{
cout << "Plansza kaput!\n"; // do testowania zadzialania destruktora
for(int i=0; i<piontab+5; i++) // zwolnienie zaalokowanej pamieci
{
for(int j=0; j<poziomtab+5; j++)
{
delete wsk[i][j]; // niszczymy pojedyncze maszty
}
delete wsk[i]; // ... tablice masztow
}
delete wsk; // ... i tablice tablic
if(!Linux) system("pause");
}
void plansza::wyswietl() // wyswietlanie planszy
{
if(Linux)system("clear"); // linux
else system("cls"); // windows
for(int i=1; i<=piontab; i++) // wyswietlenie 16 wierszy
{
cout << setw(2) << i << " "; // ladny rowny odstep
for(int j=1; j<=poziomtab; j++)
wsk[i-1][j-1]->wyswietl(); // wyswietlanie 16 kolumn masztow
cout << endl;
}
cout << " ";//odpowiada za dolne liczby
for (int j=1;j<=poziomtab;j++)
{
if(j<10)
cout << j << " ";
else
cout << j << " ";
}
cout << endl;
}
maszt.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
void maszt::wyswietl()
{
if(Testowanie) // jak testujemy to pokazujemy statki od razu
cout << stan << " ";
else // jak gramy to statki sa ukryte
(stan=='X') ? cout << ". " : cout << stan << " ";
}
przeszkody.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
void przeszkoda::buduj(plansza &NazwaPlanszy)
{
for(int x=1;x<47;x=x+2)
{
int i=0;
int ilosc = rand()%5 + 18;
while( i < ilosc)
{
int y=rand()%25;
NazwaPlanszy.wsk[y][x]->stan='X';
NazwaPlanszy.wsk[y][x]->typ=0;
tablica[y][x]=NazwaPlanszy.wsk[y][x];
i++;
}
}
}
bool przeszkoda::CzyJest(int y,int x)
{
if (tablica[y][x]->typ == 0)
{
cout << "1 ";
return true;
}
else
{
cout << "0 ";
return false;
}
}
void przeszkoda::ruch (int yw,plansza &NazwaPlanszy)
{
for( int x=0;x < poziomtab; x++)
{
for(int y=0;y<piontab;y++)
{
if(CzyJest(y,x))
{
int kw = rand()%2; // 0 do góry, 1 w dół
if (kw == 0)
{
if((y<piontab) && (!CzyJest(y+1,x)))
{
NazwaPlanszy.wsk[y][x]->stan='.';
NazwaPlanszy.wsk[y][x]->typ=3;
tablica[y][x]=NazwaPlanszy.wsk[y][x];
NazwaPlanszy.wsk[y+1][x]->stan='X';
NazwaPlanszy.wsk[y+1][x]->typ=0;
tablica[y+1][x]=NazwaPlanszy.wsk[y+1][x];
}
else
continue;
}
else if( kw == 1)
{
if((y>0) && (!CzyJest(y-1,x)))
{
NazwaPlanszy.wsk[y][x]->stan='.';
NazwaPlanszy.wsk[y][x]->typ=3;
tablica[y][x]=NazwaPlanszy.wsk[y][x];
NazwaPlanszy.wsk[y-1][x]->stan='X';
NazwaPlanszy.wsk[y-1][x]->typ=0;
tablica[y-1][x]=NazwaPlanszy.wsk[y+1][x];
}
else
continue;
}
}
}
}
}
zmiany.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
void czekaj( int sekundy )// opcja czekania
{
clock_t koniec_czekania;
koniec_czekania = clock() + sekundy * CLOCKS_PER_SEC;
while( clock() < koniec_czekania ) { }
}