Przenoszenie argumentow miedzy funkcjami.

0

Cześć!
Mam problem z przekazaniem argumentow. Funkcje DrawBoard() i DefineFields() wymagaja pobrania wysokosci i szerokosci okna. Czy jest jakis sposob, by wywolac je w funkcji main(), a nie w ConsoleSettings(), gdzie zdeklarowane sa zmienne Width i Height? I co w wypadku, gdyby jakas inna teoretyczna funkcja potrzebowala argumentow np z funkcji DrawBoard() i ConsoleSettings()? Da sie je przekazac?
pozdr

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

void Intro();
void ConsoleSettings();												//rozmiary boardu
void GameSettings();												       //tempo i definicja klawiszy
void DrawBoard(int &HowWide, int &HowHigh);							//czysci ekran i rysuje board o podanych rozmiarach
void DefineFields(int &Horizontal, int &Vertical);
void InputError(int &Size);											//jesli podano wartosci spoza skali, pomysl o walidacji inputow
void KeyboardError(int &Key);										//klawisze kursorow skladaja sie z dwoch liczb(?)

int main()
{
	Intro();
	GameSettings();
	ConsoleSettings();
	DefineFields(Width, Height);
	DrawBoard(Width, Height);
	
	return 0;
}

void Intro()
{
...
}

void ConsoleSettings()
{
	int Width;
	int Height;
	
	std::cout << "Podaj szerokosc pola w zakresie od 5 do 40: ";
	std::cin >> Width;
	
	if (Width < 5 || Width > 40)
	{
		InputError(Width);
	}
	std::cout << "Podaj wysokosc pola w zakresie od 5 do 40: ";
	std::cin >> Height;

	if (Height < 5 || Height > 40)
	{
		InputError(Height);
	}

	//DefineFields(Width, Height);
	//DrawBoard(Width, Height);

	return;
}

void GameSettings()
{
...
}

void InputError(int &Size)
{
...
}

void KeyboardError(int &Key)
{
...
}

void DrawBoard(int &HowWide, int &HowHigh)
{
	//system("cls");

	// GORNA RAMA-----------------------------------------------------------------------
	for (int i = 0; i <= HowWide; i++)
	{
		std::cout << "--";
	}
	std::cout << std::endl;
	
	// BOCZNE RAMY----------------------------------------------------------------------
	for (int j = 0; j < HowHigh; j++)
	{
		std::cout << "|";

		for (int k = 0; k < HowWide; k++)
		{
			std::cout << "  ";
			if (k == HowWide - 1)
			{
				std::cout << "|" << std::endl;
			}
		}
	}

	// DOLNA RAMA-------------------------------------------------------------------------
	for (int l = 0; l <= HowWide; l++)
	{
		std::cout << "--";
	}
	std::cout << std::endl;

	return;
}

void DefineFields(int &Horizontal, int &Vertical)
{
	char **Board;
	Board = new char *[Horizontal];
	for (int i = 0; i < Horizontal; i++)
	{
		Board[i] = new char[Vertical];
	}

	for (int i = 0; i < Horizontal; i++)
	{
		for (int j = 0; j < Vertical; j++)
			Board[i][j] = 'e';								//e - Empty field
	}

	/*for (int i = 0; i < Horizontal; i++)
	{
		for (int j = 0; j < Vertical; j++)					//test tablicy
		{
			std::cout << Board[i][j];
		}
	}*/

	int SnakePosX, SnakePosY;
	int FoodPosX, FoodPosY;

	SnakePosX = rand() % Horizontal;
	SnakePosY = rand() % Vertical;

	Board[SnakePosX][SnakePosY] = 's';						//s - Snake on field

	do
	{
		FoodPosX = rand() % Horizontal;
		FoodPosY = rand() % Vertical;
	} while (Board[FoodPosX][FoodPosY] != 'e');
	Board[FoodPosX][FoodPosY] = 'f';						//f- Food on field

	return;
}
0

mozesz uzywac globali -> bardzo zle rozwiazanie (ale nadal bedzie dzialac)
mozesz zwrocic strukture/klase ktora bedzie zawierac width/height z ConsoleSettings i pozniej uzywac jej gdzie chcesz

0

Nie chciałbym używać globali, bo już kilka razy się na nich sparzyłem, poza tym, tak jak piszesz, ponoć bardzo zły nawyk. A klas nigdy nie używałem ani ich się nie uczyłem, dopiero zaczynam programować. No ale pora każda jak inna, by zacząć się ich uczyć... Jakieś źródła godne polecenia?

0

http://fasadin.4programmers.net/
opisalem tam podstawy klas z funkcjami oraz uzyciem. Jest pisane jezykiem dla bardzo poczatkujacych

0

Postanowilem uzyc struktur. Wiem, wiem, C++ obiektowym jezykiem jest, ale struktury sa od razu publiczne, poza tym tez jeszcze nie uzywalem. Stworzylem strukture BoardProperties, ktora zawiera wartosci zmiennych Width oraz Height pobrane od uzytkownika.

struct BoardProperties
{
	int Width;
	int Height;
};

...

void ConsoleSettings()
{
	int Width;
	int Height;
	
	std::cout << "Podaj szerokosc pola w zakresie od 5 do 40: ";
	std::cin >> Width;
	
	if (Width < 5 || Width > 40)
	{
		InputError(Width);
	}
	std::cout << "Podaj wysokosc pola w zakresie od 5 do 40: ";
	std::cin >> Height;

	if (Height < 5 || Height > 40)
	{
		InputError(Height);
	}

	BoardProperties ConsoleSize;
	ConsoleSize.Width = Width;
	ConsoleSize.Height = Height;

	std::cout << "ConsoleSize.Width = " << ConsoleSize.Width << std::endl;					//Test struktury
	std::cout << "ConsoleSize.Height = " << ConsoleSize.Height << std::endl;

	DefineFields(Width, Height);
	DrawBoard(Width, Height);

	return;
}
 

Tylko jak powinienem ich teraz uzywac, by moc stosowac je w innych funkcjach, np do rysowania boardu o wymiarach zdefiniowanych przez uzytkownika?

void DrawBoard(int &HowWide, int &HowHigh)
{
	//system("cls");

	// GORNA RAMA-----------------------------------------------------------------------
	for (int i = 0; i <= HowWide; i++)
	{
		std::cout << "--";
	}
	std::cout << std::endl;
	
	// BOCZNE RAMY----------------------------------------------------------------------
	for (int j = 0; j < HowHigh; j++)
	{
		std::cout << "|";

		for (int k = 0; k < HowWide; k++)
		{
			std::cout << "  ";
			if (k == HowWide - 1)
			{
				std::cout << "|" << std::endl;
			}
		}
	}

	// DOLNA RAMA-------------------------------------------------------------------------
	for (int l = 0; l <= HowWide; l++)
	{
		std::cout << "--";
	}
	std::cout << std::endl;

	return;
}
 

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