Zmiana elementów tablicy w klasie // obsługa klawiatury

0

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

0

Lektury na dziś:

  1. debuger
  2. ncurses
  3. getch
  4. kbhit

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