Witam
Próbuję zrobić grę, póki co w trybie tekstowym, lecz nie działa mi zmiana elementów 2 wymiarowej tablicy. Generalnie problem polega na tym, że wypisuje złe wartości (funkcja na dole maina ) Do tego jeszcze nie do końca orientuję się jak obsługiwać klawiaturę, pomysł był przez funkcję getchar(), aczkolwiek ona nie działa tak jak chciałbym ( sens jest taki - funkcja się wykonuje, a w razie naciśnięcia klawisza to coś/ jeżeli klawisz nie zostanie nacisniety, dalej ma się wykonywać )
Poniżej załączam kody
main:
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
bool Testowanie=true;
int main()
{
srand(time(NULL));
int dl;
char znak;
plansza statki;
przeszkoda prz;
prz.buduj(statki);
jon j1;
j1.buduj(statki,prz);
clock_t start = clock();
for(int i= 0; i <50; i++)
{
//znak=getchar();
//j1.ruchJonu(statki,znak);
j1.ruch(statki);
statki.wyswietl();
for(int i=1;i<poziomtab;i=i+2)
prz.ruch(statki,i);
czekaj(20);
cout <<endl<< j1.x << " " << j1.y<< " "<<endl;
}
cout << " ";
for (int i=0;i<47;i++)
{
if(CzyPuste(statki,i,24))
{ cout << "0 ";}
else
{cout << "1 ";}
}
cout <<endl<<endl << " ";
long duration = (clock()-start)/1000;
cout <<endl<< "Czas trwania [ms] " << duration << endl;
return 0;
}
funkcje.h
#ifndef _FUNKCJE_H
#define _FUNKCJE_H
#include <iostream>
#include <iomanip> // setw()
#include <cstdlib> // srand()
#include <ctime> // time()
#include <time.h>
#include <stdio.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();
void zamien(int,int,int,int); // zmiana elemetów (x,y) na (x,y)
};
//*********************************************************************************************************************************************************
// ./fun/maszt.cpp
class maszt // elementarna klasa
{
public:
char stan;
int typ; // 0 - przeszkoda, 3 - puste, 1- jon
maszt() : stan(' '), typ(3) {} // konstruktor, na poczatku nie ma zadnych stakow czyli maszty sa puste
void wyswietl();
};
//*********************************************************************************************************************************************************
class przeszkoda
{
public:
maszt ***tablica;
przeszkoda();
~przeszkoda();
void buduj(plansza &NazwaPlanszy);
void ruch (plansza&,int);
//bool CzyJest(int,int);
};
//*********************************************************************************************************************************************************
class jon
{
public:
int x,y;//wspolrzedne
maszt *tab;
jon();
~jon();
void buduj(plansza &NazwaPlanszy,przeszkoda&);
void ruch(plansza&);
void ruchJonu(plansza &NazwaPlanszy,char znak);
};
//*********************************************************************************************************************************************************
void czekaj( int sekundy );
bool CzyPuste(plansza&,int,int);
#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
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 << " ";
}
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 +5 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
{
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;
}
void plansza::zamien(int xw,int yw,int x, int y)
{
maszt prob;
prob = *wsk[y][x];
*wsk[y][x]=*wsk[yw][xw];
*wsk[yw][xw] = prob;
}
przeszkody.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
przeszkoda::przeszkoda()
{
tablica=new maszt**[piontab+5]; // plansza jest 2-wymiarowa tablica wskaznikow do masztow
for(int i=0; i<piontab+5; i++) // rozmiar +5 a plansza zeby nie bylo przekroczenia zakresu przy losowym ustawianiu statkow
{
tablica[i]=new maszt*[poziomtab+5];
for(int j=0; j<poziomtab+5; j++)
{
tablica[i][j]=new maszt(); // pojedynczy maszt
}
}
}
przeszkoda::~przeszkoda()
{
for(int i=0; i<piontab+5; i++) // zwolnienie zaalokowanej pamieci
{
for(int j=0; j<poziomtab+5; j++)
{
delete tablica[i][j]; // niszczymy pojedyncze maszty
}
delete tablica[i]; // ... tablice masztow
}
delete tablica; // ... i tablice tablic
if(!Linux) system("pause");
}
void przeszkoda::buduj(plansza &NazwaPlanszy)
{
for(int x=1;x<47;x=x+2)
{
int i=0;
int ilosc = rand()%13 + 10;
while( i < ilosc)
{
while(true)
{
int y=rand()%25;
if (NazwaPlanszy.wsk[y][x]->typ==3)
{
NazwaPlanszy.wsk[y][x]->stan='X';
NazwaPlanszy.wsk[y][x]->typ=0;
*tablica[y][x]=*NazwaPlanszy.wsk[y][x];
break;
}
}
i++;
}
}
}
void przeszkoda::ruch(plansza &NazwaPlanszy,int i)
{
for (int j=0;j<piontab;j++)
{
if(!CzyPuste(NazwaPlanszy,i,j) && NazwaPlanszy.wsk[j][i]->typ != 1)
{
int a;
a = rand()%2;
if(a==1) // góra
{
if(j<24 && CzyPuste(NazwaPlanszy,i,j+1)) // jeszcze nei zalozylem ze to moze byc maksymalna wartość planszy;
{
NazwaPlanszy.zamien(i,j,i,j+1);
j++;
}
else if(j==24 && CzyPuste(NazwaPlanszy,i,0))
NazwaPlanszy.zamien(i,j,i,0);
else if(j>0 && CzyPuste(NazwaPlanszy,i,j-1))
{
NazwaPlanszy.zamien(i,j,i,j-1);
j--;
}
else if(j==0 && CzyPuste(NazwaPlanszy,i,piontab))
NazwaPlanszy.zamien(i,j,i,piontab);
else
continue;
}
else
{
if(j>0 && CzyPuste(NazwaPlanszy,i,j-1))
{
NazwaPlanszy.zamien(i,j,i,j-1);
j--;
}
else if(j==0 && CzyPuste(NazwaPlanszy,i,piontab))
NazwaPlanszy.zamien(i,j,i,piontab);
else if(j<24 && CzyPuste(NazwaPlanszy,i,j+1)) // jeszcze nei zalozylem ze to moze byc maksymalna wartość planszy;
{
NazwaPlanszy.zamien(i,j,i,j+1);
j++;
}
else if(j==24 && CzyPuste(NazwaPlanszy,i,0))
NazwaPlanszy.zamien(i,j,i,0);
else
continue;
}
}
}
}
//*********************************************************************************************************************************************************
//jony
jon::jon()
{
tab = new maszt();
tab->stan='J';
tab->typ=1;
x=0;
y=rand()%25;
//y=24;
}
jon::~jon()
{
delete tab;
if(!Linux) system("pause");
}
void jon::buduj(plansza &NazwaPlanszy, przeszkoda &NazwaPrzeszkody)
{
*NazwaPlanszy.wsk[y][x]=*tab;
*NazwaPrzeszkody.tablica[y][x]=*tab;
}
void jon::ruchJonu(plansza &NazwaPlanszy,char znak)
{
if (znak == 'a' )
if (y<24 && CzyPuste(NazwaPlanszy,x,y+1))
{
NazwaPlanszy.zamien(x,y,x,y+1);
y++;
}
else if (znak = 72 )
if (y>0 && CzyPuste(NazwaPlanszy,x,y-1))
{
NazwaPlanszy.zamien(x,y,x,y-1);
y--;
}
}
void jon::ruch(plansza &NazwaPlanszy)
{
if(y<poziomtab && CzyPuste(NazwaPlanszy,x+1,y))
{
NazwaPlanszy.zamien(x,y,x+1,y);
++x;
}
}
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)/50;
while( clock() < koniec_czekania ) { }
}
funbocz.cpp
#include "../lib/funkcje.h"
#include "../lib/zmienne.h"
bool CzyPuste(plansza &NazwaPlanszy,int x,int y)
{
return ( NazwaPlanszy.wsk[y][x]->typ==3);
}
makefile
gra: appo/main.o appo/maszt.o appo/plansza.o appo/przeszkody.o appo/zmiany.o appo/funbocz.o
g++ appo/main.o appo/maszt.o appo/plansza.o appo/przeszkody.o appo/zmiany.o appo/funbocz.o -o gra
appo/main.o: fun/main.cpp
g++ -c fun/main.cpp -o appo/main.o
appo/maszt.o: fun/maszt.cpp
g++ -c fun/maszt.cpp -o appo/maszt.o
appo/plansza.o: fun/plansza.cpp
g++ -c fun/plansza.cpp -o appo/plansza.o
appo/przeszkody.o: fun/przeszkody.cpp
g++ -c fun/przeszkody.cpp -o appo/przeszkody.o
appo/zmiany.o: fun/zmiany.cpp
g++ -c fun/zmiany.cpp -o appo/zmiany.o
appo/funbocz.o: fun/funbocz.cpp
g++ -c fun/funbocz.cpp -o appo/funbocz.o
clean:
rm -f appo/main.o appo/maszt.o appo/plansza.o appo/przeszkody.o appo/zmiany.o appo/funbocz.o
Z góry dziękuję za pomoc,
Pozdrawiam,
Krystian