Jak maina rozbić na funkcje?

Jak maina rozbić na funkcje?
DA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:12
0

Dobry wieczór, zwracam się do Was z problemem, z którym nie mogę sobie poradzić- otóż napisałem "projekt" na studia, mowa tu o programie udającym snake'a. Po zaprezentowaniu go prowadzącemu ćwiczenia usłyszałem, iż powinienem rozbić maina na funkcje aby main był jak najkrótszy. Jako że bardzo mi zależy, aby moja praca została wysoko oceniona, podjąłem się tego zadania. Problem w tym, że nie mam kompletnie pomysłu jak sobie z tym poradzić. Jestem początkujący w tych sprawach i przy próbie rozbicia tego na funkcje co chwile wywala mi jakiś błąd. Gdyby ktoś byłby w stanie wskazać mi drogę do rozwiązania, jakąkolwiek wskazówkę, byłbym bardzo wdzięczny. Pozdrawiam cieplutko :)

PS zamieszczam kod, aby było wiadomo o co chodzi :)

Kopiuj
 // Snake podejscie pierwsze 21.11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
#include <cstdio>

using namespace std;

void idzdoxy(int x, int y)
{
	HANDLE hCon;
	COORD dwPos;

	dwPos.X = x;
	dwPos.Y = y;

	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hCon, dwPos);
}

char *tr(char *str)																												//funkcja na polskie znaki
{
	static char buff[256];
	char cp[] = "\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
	if (strlen(str) >= sizeof(buff)) return str;
	char *bf = buff;
	while (*str)
	{
		char *pos = strchr(cp + 18, *str);
		*(bf++) = pos ? *(pos - 18) : *str;
		++str;
	}
	*bf = 0;
	return buff;
}

void poprawnosc(int *x, int z1, int z2)
{
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	while (*x < z1 || *x > z2)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin >> *x;
	}
}


void poczatek(int pole[][])
{
	for (int i = 0; i < wys; i++)
	{
		for (int j = 0; j < szer; j++)
		{
			pole[j][i] = 0;																											//wypelnianie tablicy zerami
		}
	}

	do {
		Xj = rand() % szer;																											//pozycja poczatkowa jedzenia			
		Yj = rand() % wys;
	} while (pole[Xj][Yj] != 0);

	pole[Xj][Yj] = 2;

	if (wybor == 0)
	{
		Xw = rand() % szer;																												//pozycja poczatkowa dla 0		
		Yw = rand() % wys;
	}
	else
	{
		Xw = 1;
		Yw = 1;
	}
	pole[Xw][Yw] = 1;
}

int main()
{
	int szer, wys, dl = 0, speed, gracdalej;
	int gora, dol, lewo, prawo;
	char pole[50][50];
	int hX[10000]; int hY[10000]; int ruchy = 0;
	int Xw, Yw, Xj, Yj;
	int klawisz, punkty = 0, wybor;
	char zwrot = 'p';

	srand(time(NULL));
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);

	cout << "Witam w programie Snake autorstwa Daniela Kalety" << endl;																//intro
	Sleep(1000);

	cout << tr("Na początek podaj szerokość planszy, na której chcesz zagrać (od 5 do 35): ");										//szerokosc
	cin >> szer;
	while(cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> szer;
	}
	int *wszer = &szer;
	poprawnosc(wszer, 5, 35);

	cout << tr("Teraz podaj wysokość tej planszy (od 5 do 35): ");																	//wysokosc
	cin >> wys;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> wys;
	}
	int *wwys = &wys;
	poprawnosc(wwys, 5, 35);

	cout << tr("A więc zadeklarowana przez Ciebie plansza będzie miała wymiary: ") << szer << " x " << wys << endl;					//wypisanie wymiarow planszy

	cout << tr("Podaj tempo gry w jakim życzysz sobie zagrać od 1 do 50: ");
	cin >> speed;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> speed;
	}
	int *wspeed = &speed;
	poprawnosc(wspeed, 1, 50);

	cout << tr("Czy chcesz, aby uderzenie o ściane powodowało koniec gry? Wpisz 0- nie, 1-tak: ");									//czy kolizja
	cin >> wybor;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> wybor;
	}
	while (wybor <0 || wybor>1)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, sprobój jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin >> wybor;
	}

	cout << "Na koniec zadeklaruj przyciski sterowania" << endl;

	cout << tr("Góra: ") << endl;
	gora = _getch();
	if (gora == 224)gora += _getch();
	if (gora == 0)gora -= _getch();

	cout << tr("Dół: ") << endl;
	dol = _getch();
	if (dol == 224)dol += _getch();
	if (dol == 0)dol -= _getch();

	cout << tr("Lewo: ") << endl;
	lewo = _getch();
	if (lewo == 224)lewo += _getch();
	if (lewo == 0)lewo -= _getch();

	cout << tr("Prawo: ") << endl;
	prawo = _getch();
	if (prawo == 224)prawo += _getch();
	if (prawo == 0)prawo -= _getch();

	Sleep(2000);
	system("cls");																													//zakonczenie procesu konfiguracji





	do
	{


		for (int i = 0; i < wys; i++)
		{
			for (int j = 0; j < szer; j++)
			{
				pole[j][i] = 0;																											//wypelnianie tablicy zerami
			}
		}

		do {
			Xj = rand() % szer;																											//pozycja poczatkowa jedzenia			
			Yj = rand() % wys;
		} while (pole[Xj][Yj] != 0);

		pole[Xj][Yj] = 2;

		if (wybor == 0)
		{
			Xw = rand() % szer;																												//pozycja poczatkowa dla 0		
			Yw = rand() % wys;
		}
		else
		{
			Xw = 1;
			Yw = 1;
		}
		pole[Xw][Yw] = 1;





		idzdoxy(0, 0);
																																		//rysowanie planszy
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		for (int i = 0; i <= szer + 1; i++)					//gorna ramka																
			cout << (char)178 << (char)178;


		for (int i = 0; i < wys; i++)
		{
			cout << endl << (char)178 << (char)178;			//prawa ramka
			for (int j = 0; j < szer; j++)
			{
				if (pole[j][i] == 0)
				{
					cout << "  ";				//wypelniacz pola
				}
				if (pole[j][i] == 1)
				{
					SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
					cout << (char)219 << (char)219;  //waz
				}

				if (pole[j][i] == 2)
				{
					SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
					cout << (char)123 << (char)125;  //jedzenie
				}
			}
			SetConsoleTextAttribute(hOut, FOREGROUND_RED);
			cout << (char)178 << (char)178;					//lewa ramka
		}

		cout << endl;

		for (int i = 0; i <= szer + 1; i++)																								//koniec rysowania planszy
			cout << (char)178 << (char)178;





		for (;;)																														//GRA !!!!
		{
			ruchy++;
			hX[ruchy] = Xw;
			hY[ruchy] = Yw;



			Sleep(1000 / (speed + (dl / 2)));																								//predkosc
			if (wybor == 1)
				punkty++;

			if (_kbhit())
			{
				klawisz = _getch();
				if (klawisz == 224)klawisz += _getch();
				if (klawisz == 0) klawisz -= _getch();

				if (klawisz == gora && zwrot != 'd') zwrot = 'g';																				//deklaracja poruszania
				if (klawisz == dol && zwrot != 'g') zwrot = 'd';
				if (klawisz == lewo && zwrot != 'p') zwrot = 'l';
				if (klawisz == prawo && zwrot != 'l') zwrot = 'p';
			}



			if (zwrot == 'l') Xw--;																											//ruch weza
			if (zwrot == 'p') Xw++;
			if (zwrot == 'g') Yw--;
			if (zwrot == 'd') Yw++;




			if (wybor == 0)
			{
				if (Xw == szer) Xw = 0;																										//brak kolizji na scianach
				if (Xw == -1) Xw = szer - 1;
				if (Yw == wys) Yw = 0;
				if (Yw == -1) Yw = wys - 1;
			}

			if (wybor == 1)																													//kolizja na scianach
			{
				{
					if (Xw == szer || Xw == -1)
						break;
					if (Yw == wys || Yw == -1)
						break;
				}
			}





			if (pole[Xw][Yw] == 1)																											//jedzenie samego siebie
			{
				break;
			}





			if (pole[Xw][Yw] == 2)																											//jedzenie jedzenia :D
			{
				punkty = punkty + (2 * speed);
				dl++;
				do {
					Xj = rand() % szer;																										//pozycja nowego jedzenia			
					Yj = rand() % wys;
				} while (pole[Xj][Yj] != 0);

				pole[Xj][Yj] = 2;
				idzdoxy(Xj * 2 + 2, Yj + 1);
				SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
				cout << (char)123 << (char)125;
				SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
			}
			else
			{
				if (ruchy > 0) pole[hX[ruchy - dl]][hY[ruchy - dl]] = 0;																	//usuwanie ogona
				idzdoxy(hX[ruchy - dl] * 2 + 2, hY[ruchy - dl] + 1);
				cout << "  ";
			}

			pole[Xw][Yw] = 1;
			idzdoxy(Xw * 2 + 2, Yw + 1);
			SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
			cout << (char)219 << (char)219;

			idzdoxy(0, wys + 1);
			SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
			cout << endl << "Punkty: " << punkty;
			SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);


		}

		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cout << endl << "Koniec gry, zdobyte punkty: " << punkty;
		cout << endl << tr("Czy chcesz zagraæ jeszcze raz na tych samych ustawieniach? 0- nie, 1-tak: ");
		cin >> gracdalej;
		while (gracdalej < 0 || gracdalej>1)
		{
			cout << tr("Niestety nie ma takiej opcji, sprobój jeszcze raz: ");
			cin >> gracdalej;
		}
		if (gracdalej == 1)
		{
			system("cls");
			punkty = 0;
			dl = 0;
		}


	} while (gracdalej == 1);

	cout << "Zatem do widzenia!";
	Sleep(1500);

	return 0;
}

carlosmay
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Pabianice
1

Jak maina rozbić na funkcje?

Szukaj w main fragmentów kodu odpowiadających za jedną czynność.
Napisz dla tego fragmentu odpowiednią funkcję i w miejsce owego fragmentu wstaw wywołanie funkcji.
Im krótsze zrobisz funkcje, łatwiej je ogarnąć i ew. wykorzystać cyklicznie.

Np. ten fragment pojawia się więcej niż raz, więc można z niego zrobić funkcję zwracającą poprawnie wczytaną wartość.

Kopiuj
cout << tr("Na początek podaj szerokość planszy, na której chcesz zagrać (od 5 do 35): ");                                        //szerokosc
    cin >> szer;
    while(cin.good() == false)
    {
        SetConsoleTextAttribute(hOut, FOREGROUND_RED);
        cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
        cin.clear();
        cin.ignore(1000, '\n');
        cin >> szer;
    }
    int *wszer = &szer;
    poprawnosc(wszer, 5, 35); 

Identyfikatory staraj się pisać po angielsku.


edytowany 1x, ostatnio: carlosmay
DA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:12
0

Ok, to faktycznie planowałem wstawić do funkcji poprawność, tak jak sprawdzanie czy liczba należy do poproszonego przedziału, tylko miałem nie lada problem z wstawieniem cin.good() do tejże funkcji w dobry sposób. Nawiązując jednak jeszcze do ogółu- poza tym sprawdzaniem, czy dane na strumieniu wejściowym są poprawne nie ma za bardzo powtarzających się części kodu, a jakbym chciał zrobić funkcję rysowania planszy czy czegokolwiek to przekazywanie argumentów itd mija się chyba z celem, bo kodu przybędzie zamiast ubyć, prawda?

carlosmay
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Pabianice
1

a jakbym chciał zrobić funkcję rysowania planszy czy czegokolwiek to przekazywanie argumentów itd mija się chyba z celem, bo kodu przybędzie zamiast ubyć, prawda?

Kodu przybędzie, ale kod zyska na czytelności.
Lepiej czytać kilku wierszowe moduły, niż przedzierać się przez setki linii jednej długiej niezrozumiałej funkcji.

edit: w main() zostaw tylko ogólny szkielet programu.
A resztę podziel na funkcje: jedna funkcja - jedna funkcjonalność, stosowanie się do zasady DRY itd.


edytowany 1x, ostatnio: carlosmay
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:10 minut
  • Postów:6650
2

Nie mija się z celem. Chcemy zrobić czytelny kod, który możesz przeczytać nie wchodząc w szczegóły.

Kiedy masz klika linijek z nazwami funkcji, to przeczytasz dużo szybciej niż przechodząc przez cały bełkot czytając komentarze, co robi dany kawałek kodu.


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
carlosmay
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Pabianice
2

DA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:12
0

O, tego typu argumenty bardzo mnie przekonują, dziękuje bardzo za wyjaśnienie i link. Po wstępnym przeglądnięciu mogę stwierdzić, że czeka mnie jutro ciekawa i pouczająca lektura :)

DA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:12
0

Jako, że termin mam na dziś, godzinę 23:59 to zacząłem już robić, aby mieć pewność, że zdążę. Nie przeczytałem jeszcze zawartości linku, lecę na czuja póki co. W chwili obecnej mam takie coś, kod może faktycznie zyskał na czytelności, ale gdy chce teraz napisać funkcję szkieletplanszy (nie zmieniłem jeszcze nazw na angielskie) to nie wiem jak tam te wszystkie wartości zreturnować :/ Czy moje myślenie w ogóle jest prawidłowe?

Kopiuj
 // Snake podejscie pierwsze 21.11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
#include <cstdio>

using namespace std;

void idzdoxy(int x, int y)
{
	HANDLE hCon;
	COORD dwPos;

	dwPos.X = x;
	dwPos.Y = y;

	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hCon, dwPos);
}

char *tr(char *str)																												//funkcja na polskie znaki
{
	static char buff[256];
	char cp[] = "\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
	if (strlen(str) >= sizeof(buff)) return str;
	char *bf = buff;
	while (*str)
	{
		char *pos = strchr(cp + 18, *str);
		*(bf++) = pos ? *(pos - 18) : *str;
		++str;
	}
	*bf = 0;
	return buff;
}

void poprawnosc(int *x, int z1, int z2)
{
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	while (*x < z1 || *x > z2)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin >> *x;
	}
}

int szerokosc()
{
	int szer;
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
	cout << tr("Na początek podaj szerokość planszy, na której chcesz zagrać (od 5 do 35): ");										//szerokosc
	cin >> szer;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> szer;
	}
	int *wszer = &szer;
	poprawnosc(wszer, 5, 35);

	return szer;
}

int wysokosc()
{
	int wys;
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
	cout << tr("Teraz podaj wysokość tej planszy (od 5 do 35): ");																	//wysokosc
	cin >> wys;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> wys;
	}
	int *wwys = &wys;
	poprawnosc(wwys, 5, 35);
	return wys;
}

int szybkosc()
{
	int speed;
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
	cout << tr("Podaj tempo gry w jakim życzysz sobie zagrać od 1 do 50: ");
	cin >> speed;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> speed;
	}
	int *wspeed = &speed;
	poprawnosc(wspeed, 1, 50);
	return speed;
}

int kolizja()
{
	int wybor;
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
	cout << tr("Czy chcesz, aby uderzenie o ściane powodowało koniec gry? Wpisz 0- nie, 1-tak: ");									//czy kolizja
	cin >> wybor;
	while (cin.good() == false)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> wybor;
	}
	while (wybor <0 || wybor>1)
	{
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, sprobój jeszcze raz: ");
		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cin >> wybor;
	}
	return wybor;
}

int dogory()
{
	int gora;
	cout << tr("Góra: ") << endl;
	gora = _getch();
	if (gora == 224)gora += _getch();
	if (gora == 0)gora -= _getch();
	return gora;
}

int wdol()
{
	int dol;
	cout << tr("Dół: ") << endl;
	dol = _getch();
	if (dol == 224)dol += _getch();
	if (dol == 0)dol -= _getch();
	return dol;
}

int wlewo()
{
	int lewo;
	cout << tr("Lewo: ") << endl;
	lewo = _getch();
	if (lewo == 224)lewo += _getch();
	if (lewo == 0)lewo -= _getch();
	return lewo;
}

int wprawo()
{
	int prawo;
	cout << tr("Prawo: ") << endl;
	prawo = _getch();
	if (prawo == 224)prawo += _getch();
	if (prawo == 0)prawo -= _getch();
	return prawo;
}

char szkieletplanszy(int szer, int wys)
{
	char pole[50][50];
	for (int i = 0; i < wys; i++)
	{
		for (int j = 0; j < szer; j++)
		{
			pole[j][i] = 0;																											//wypelnianie tablicy zerami
		}
	}

	do {
		Xj = rand() % szer;																											//pozycja poczatkowa jedzenia			
		Yj = rand() % wys;
	} while (pole[Xj][Yj] != 0);

	pole[Xj][Yj] = 2;

	if (wybor == 0)
	{
		Xw = rand() % szer;																												//pozycja poczatkowa dla 0		
		Yw = rand() % wys;
	}
	else
	{
		Xw = 1;
		Yw = 1;
	}
	pole[Xw][Yw] = 1;

	return pole[50][50];
}

int main()
{
	int szer, wys, dl = 0, speed, gracdalej;
	int gora, dol, lewo, prawo;
	char pole[50][50];
	int hX[10000]; int hY[10000]; int ruchy = 0;
	int Xw, Yw, Xj, Yj;
	int klawisz, punkty = 0, wybor;
	char zwrot = 'p';

	srand(time(NULL));
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);

	cout << "Witam w programie Snake autorstwa Daniela Kalety" << endl;																//intro
	Sleep(1000);
	szer= szerokosc();
	wys = wysokosc();
	cout << tr("A więc zadeklarowana przez Ciebie plansza będzie miała wymiary: ") << szer << " x " << wys << endl;					//wypisanie wymiarow planszy
	speed = szybkosc();
	wybor = kolizja();

	cout << "Na koniec zadeklaruj przyciski sterowania" << endl;

	gora = dogory();
	dol = wdol();
	lewo = wlewo();
	prawo = wprawo();

	Sleep(2000);
	system("cls");																													//zakonczenie procesu konfiguracji


	do
	{


		/*for (int i = 0; i < wys; i++)
		{
			for (int j = 0; j < szer; j++)
			{
				pole[j][i] = 0;																											//wypelnianie tablicy zerami
			}
		}

		do {
			Xj = rand() % szer;																											//pozycja poczatkowa jedzenia			
			Yj = rand() % wys;
		} while (pole[Xj][Yj] != 0);

		pole[Xj][Yj] = 2;

		if (wybor == 0)
		{
			Xw = rand() % szer;																												//pozycja poczatkowa dla 0		
			Yw = rand() % wys;
		}
		else
		{
			Xw = 1;
			Yw = 1;
		}
		pole[Xw][Yw] = 1;*/



		for (int i=0; )

		idzdoxy(0, 0);
																																		//rysowanie planszy
		SetConsoleTextAttribute(hOut, FOREGROUND_RED);
		for (int i = 0; i <= szer + 1; i++)					//gorna ramka																
			cout << (char)178 << (char)178;


		for (int i = 0; i < wys; i++)
		{
			cout << endl << (char)178 << (char)178;			//prawa ramka
			for (int j = 0; j < szer; j++)
			{
				if (pole[j][i] == 0)
				{
					cout << "  ";				//wypelniacz pola
				}
				if (pole[j][i] == 1)
				{
					SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
					cout << (char)219 << (char)219;  //waz
				}

				if (pole[j][i] == 2)
				{
					SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
					cout << (char)123 << (char)125;  //jedzenie
				}
			}
			SetConsoleTextAttribute(hOut, FOREGROUND_RED);
			cout << (char)178 << (char)178;					//lewa ramka
		}

		cout << endl;

		for (int i = 0; i <= szer + 1; i++)																								//koniec rysowania planszy
			cout << (char)178 << (char)178;





		for (;;)																														//GRA !!!!
		{
			ruchy++;
			hX[ruchy] = Xw;
			hY[ruchy] = Yw;



			Sleep(1000 / (speed + (dl / 2)));																								//predkosc
			if (wybor == 1)
				punkty++;

			if (_kbhit())
			{
				klawisz = _getch();
				if (klawisz == 224)klawisz += _getch();
				if (klawisz == 0) klawisz -= _getch();

				if (klawisz == gora && zwrot != 'd') zwrot = 'g';																				//deklaracja poruszania
				if (klawisz == dol && zwrot != 'g') zwrot = 'd';
				if (klawisz == lewo && zwrot != 'p') zwrot = 'l';
				if (klawisz == prawo && zwrot != 'l') zwrot = 'p';
			}



			if (zwrot == 'l') Xw--;																											//ruch weza
			if (zwrot == 'p') Xw++;
			if (zwrot == 'g') Yw--;
			if (zwrot == 'd') Yw++;




			if (wybor == 0)
			{
				if (Xw == szer) Xw = 0;																										//brak kolizji na scianach
				if (Xw == -1) Xw = szer - 1;
				if (Yw == wys) Yw = 0;
				if (Yw == -1) Yw = wys - 1;
			}

			if (wybor == 1)																													//kolizja na scianach
			{
				{
					if (Xw == szer || Xw == -1)
						break;
					if (Yw == wys || Yw == -1)
						break;
				}
			}





			if (pole[Xw][Yw] == 1)																											//jedzenie samego siebie
			{
				break;
			}





			if (pole[Xw][Yw] == 2)																											//jedzenie jedzenia :D
			{
				punkty = punkty + (2 * speed);
				dl++;
				do {
					Xj = rand() % szer;																										//pozycja nowego jedzenia			
					Yj = rand() % wys;
				} while (pole[Xj][Yj] != 0);

				pole[Xj][Yj] = 2;
				idzdoxy(Xj * 2 + 2, Yj + 1);
				SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
				cout << (char)123 << (char)125;
				SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
			}
			else
			{
				if (ruchy > 0) pole[hX[ruchy - dl]][hY[ruchy - dl]] = 0;																	//usuwanie ogona
				idzdoxy(hX[ruchy - dl] * 2 + 2, hY[ruchy - dl] + 1);
				cout << "  ";
			}

			pole[Xw][Yw] = 1;
			idzdoxy(Xw * 2 + 2, Yw + 1);
			SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
			cout << (char)219 << (char)219;

			idzdoxy(0, wys + 1);
			SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
			cout << endl << "Punkty: " << punkty;
			SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);


		}

		SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
		cout << endl << "Koniec gry, zdobyte punkty: " << punkty;
		cout << endl << tr("Czy chcesz zagraæ jeszcze raz na tych samych ustawieniach? 0- nie, 1-tak: ");
		cin >> gracdalej;
		while (gracdalej < 0 || gracdalej>1)
		{
			cout << tr("Niestety nie ma takiej opcji, sprobój jeszcze raz: ");
			cin >> gracdalej;
		}
		if (gracdalej == 1)
		{
			system("cls");
			punkty = 0;
			dl = 0;
		}


	} while (gracdalej == 1);

	cout << "Zatem do widzenia!";
	Sleep(1500);

	return 0;
}

edytowany 1x, ostatnio: Daxpol
carlosmay
Nie przeczytałem jeszcze zawartości linku, lecę na czuja póki co. - Warto przeczytać. Myślę, że w godzinkę dasz radę, a korzyści ze zdobytej wiedzy mogą zaoszczędzić wiecej niż ta godzinka.
Xupicor
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 8 lat
1

Nie będę wszystkiego wytykał, bo za dużo roboty.

Z natury jestem leniwy i wolę coś zrobić raz i mieć z głowy niż robić to sto razy... Ty widocznie lubisz się powtarzać. Sam zobacz ile razy masz w kodzie:

Kopiuj
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
// albo
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);

wdol, wgore, wlewo, wprawo to praktycznie ta sama funkcjonalność w czterech funkcjach - nie dałoby się tego skrócić do jednej funkcji?

I co to niby jest:

Kopiuj
char pole[50][50];
//...
return pole[50][50]; // wtf?

Dlaczego //rysowanie planszy nie jest osobną funkcją? Podobnie z innymi komentarzami.

Jeżeli nie chcesz czegoś mieć w funkcjach, bo czujesz, że najwygodniej byłoby mieć funkcje i zmienne globalne, a wbijano Ci do głowy, że globalne to zło (nie bez powodu zresztą)... to czas na zapoznanie się z klasami.


DA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:12
3

Ok, wielkie dzięki za wskazówki, biorę się do roboty. Pozwolę sobie podzielić się efektami jak tylko jakieś uda mi się osiągnąć.

Xupicor napisał(a):

Nie będę wszystkiego wytykał, bo za dużo roboty.

Rozumiem, wnioskuje, że mój kod to jeden wielki burdel w takim razie. Tym bardziej ładnie proszę, aby w miarę możliwości wytykać mi takie błędy, będę nad nimi pracował i z czasem pozbędę się ich w przyszłości :)

Xupicor
A masz plusa, za nastawienie. ;p
fasadin
@Daxpol dostales link do mojeo kursu. Poczytaj tego linka uwaznie. Bo w ogole sie nie zastosowales do tego co tam pisalem
Xupicor
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 8 lat
1

Jeśli masz deadline to uważaj, żebyś się w zmianach nie zakopał. Po pierwsze zrób tak, żeby program działał poprawnie i spełniał wymagania. W najgorszym razie będzie brzydki stylistycznie, "prymitywny" i gwałcił DRY/KISS, ale może lepiej brzydki i działający niż rozkopany, czyli ani ładny, ani działający. ;)
Nie kompilowałem, ale tak na oko to to raczej nie działa, albo "działa przypadkiem". Przykładowo zwracasz pole[50][50] gdzie najwyższy indeks dla 50-elementowej tablicy to 49. No i już UB. A może tablicę chcesz tam zwrócić?

Mała stylistyczna uwaga - nie musisz zmiennych definiować na początku funkcji. Zrób to blisko miejsca użycia i najlepiej od razu inicjalizuj jakąś użyteczną wartością.

Pouczysz się trochę to nie będziesz pisał "najpierw na brzydko/po polsku", tylko od razu myślał w innych kategoriach i nawet "takie se próby" będą wyższej jakości.
Nie od razu Rzym zbudowano. ;)


DA
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Postów:12
0

Nie mam nic do stracenia, projekt został już pokazany, działał jak należy, tylko właśnie doczepiono się wielkiego maina. Teraz albo poprawie i będę miał więcej pkt, albo nic się nie zmieni.
Jak na razie szło bardzo dobrze, linijek ogólnie przybyło, ale main stał się chyba o połowę krótszy, mam wrażenie, że zmierzam w dobrym kierunku. Wszystko ładnie pięknie, dopóki funkcja miała za zadanie nic nie zwracać, lub zwracać jedną rzecz. Teraz funkcja "rysowanieplanszy" korzysta z zmiennych Xw i Yw, pracuje na nich, ale są one też mi potrzebne do wypełniania tablicy historii ruchów węża, tam mi wywala błąd (zaraz przy komentarzu GRA !!!!). Czy jest jakiś sposób na to, czy gdy pojawia się taki problem to mam próbować to upchnąć wszystko do jednej funkcji?

PS Jest tu jakiś "spoiler" czy coś w tym guście? Jak tak dalej pójdzie to stare posty będę musiał usuwać, bo długość strony będzie absurdalna przez te kody :P

Kopiuj
// Snake podejscie pierwsze 21.11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
#include <cstdlib>
#include <cstdio>

using namespace std;

void idzdoxy(int x, int y)
{
	HANDLE hCon;
	COORD dwPos;

	dwPos.X = x;
	dwPos.Y = y;

	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hCon, dwPos);
}

char *tr(char *str)																												//funkcja na polskie znaki
{
	static char buff[256];
	char cp[] = "\245\206\251\210\344\242\230\276\253\244\217\250\235\343\340\227\275\215ąćęłńóśżźĄĆĘŁŃÓŚŻŹ";
	if (strlen(str) >= sizeof(buff)) return str;
	char *bf = buff;
	while (*str)
	{
		char *pos = strchr(cp + 18, *str);
		*(bf++) = pos ? *(pos - 18) : *str;
		++str;
	}
	*bf = 0;
	return buff;
}

void kolortekstu()
{
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
}

void czerwony()
{
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_RED);
}

void kolorweza()
{
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}

void kolorjedzenia()
{
	HANDLE hOut;																													//nadanie koloru czcionce
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED);
}

int wprowadzaniedanych(int z1, int z2)
{
	int x;
	cin >> x;
	while (cin.good() == false)
	{
		czerwony();
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		kolortekstu();
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> x;
	}
	while (x < z1 || x > z2)
	{
		czerwony();
		cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, spróbuj jeszcze raz: ");
		kolortekstu();
		cin >> x;
	}
	return x;
}

int szerokosc()
{
	int szer;
	kolortekstu();
	cout << tr("Na początek podaj szerokość planszy, na której chcesz zagrać (od 5 do 35): ");										//szerokosc
	szer= wprowadzaniedanych(5,35);
	return szer;
}

int wysokosc()
{
	int wys;
	kolortekstu();
	cout << tr("Teraz podaj wysokość tej planszy (od 5 do 35): ");																	//wysokosc
	wys= wprowadzaniedanych(5, 35);
	return wys;
}

int szybkosc()
{
	int speed;
	kolortekstu();
	cout << tr("Podaj tempo gry w jakim życzysz sobie zagrać od 1 do 50: ");
	speed=wprowadzaniedanych(1, 50);
	return speed;
}

int kolizja()
{
	int wybor;
	kolortekstu();
	cout << tr("Czy chcesz, aby uderzenie o ściane powodowało koniec gry? Wpisz 0- nie, 1-tak: ");									//czy kolizja
	cin >> wybor;
	while (cin.good() == false)
	{
		czerwony();
		cout << tr("Wprowadziłeś literkę zamiast liczby, spróbuj jeszcze raz: ");
		kolortekstu();
		cin.clear();
		cin.ignore(1000, '\n');
		cin >> wybor;
	}
	while (wybor < 0 || wybor>1)
	{
		czerwony();
		cout << tr("Niestety Twoja liczba nie znajduje się w przedziale, sprobój jeszcze raz: ");
		kolortekstu();
		cin >> wybor;
	}
	return wybor;
}

int sterowanie()
{
	int klawisz;
	klawisz = _getch();
	if (klawisz == 224)klawisz += _getch();
	if (klawisz == 0)klawisz -= _getch();
	return klawisz;
}

int rysowanieplanszy(int szer, int wys, int wybor)
{
	char pole[50][50];
	int Xw, Yw, Xj, Yj;
	for (int i = 0; i < wys; i++)
	{
		for (int j = 0; j < szer; j++)
		{
			pole[j][i] = 0;																											//wypelnianie tablicy zerami
		}
	}

	do {
		Xj = rand() % szer;																											//pozycja poczatkowa jedzenia			
		Yj = rand() % wys;
	} while (pole[Xj][Yj] != 0);

	pole[Xj][Yj] = 2;

	if (wybor == 0)
	{
		Xw = rand() % szer;																												//pozycja poczatkowa dla 0		
		Yw = rand() % wys;
	}
	else
	{
		Xw = 1;
		Yw = 1;
	}
	pole[Xw][Yw] = 1;
	
	idzdoxy(0, 0);
	czerwony();
	for (int i = 0; i <= szer + 1; i++)					//gorna ramka																
		cout << (char)178 << (char)178;


	for (int i = 0; i < wys; i++)
	{
		cout << endl << (char)178 << (char)178;			//prawa ramka
		for (int j = 0; j < szer; j++)
		{
			if (pole[j][i] == 0)
			{
				cout << "  ";				//wypelniacz pola
			}
			if (pole[j][i] == 1)
			{
				kolorweza();
				cout << (char)219 << (char)219;  //waz
			}

			if (pole[j][i] == 2)
			{
				kolorjedzenia();
				cout << (char)123 << (char)125;  //jedzenie
			}
		}
		czerwony();
		cout << (char)178 << (char)178;					//lewa ramka
	}

	cout << endl;

	for (int i = 0; i <= szer + 1; i++)																								//koniec rysowania planszy
		cout << (char)178 << (char)178;

	return Xw, Yw;
}


int main()
{
	int dl=0;
	char pole[50][50];
	int hX[10000]; int hY[10000]; int ruchy = 0;
	int Xw, Yw, Xj, Yj;
	int klawisz, punkty = 0, wybor;
	char zwrot = 'p';

	srand(time(NULL));
	kolortekstu();
	cout << "Witam w programie Snake autorstwa Daniela Kalety" << endl;																//konfiguracja
	Sleep(1000);
	int szer;
	szer = szerokosc();
	int wys;
	wys = wysokosc();
	cout << tr("A więc zadeklarowana przez Ciebie plansza będzie miała wymiary: ") << szer << " x " << wys << endl;					//wypisanie wymiarow planszy
	int speed;
	speed = szybkosc();
	wybor = kolizja();

	cout << "Na koniec zadeklaruj przyciski sterowania" << endl;

	int gora, dol, lewo, prawo;																										//<<sterowanie
	cout << tr("Góra: ") << endl;
	gora = sterowanie();
	cout << tr("Dół: ") << endl;
	dol = sterowanie();
	cout << tr("Lewo: ") << endl;
	lewo = sterowanie();
	cout << tr("Prawo: ") << endl;
	prawo = sterowanie();																											//sterowanie>>

	Sleep(1000);
	system("cls");																													//zakonczenie procesu konfiguracji

	int gracdalej;
	do
	{
		rysowanieplanszy(szer,wys,wybor);
	
		for (;;)																														//GRA !!!!
		{
			/*ruchy++;
			hX[ruchy] = Xw;
			hY[ruchy] = Yw;*/



			Sleep(1000 / (speed + (dl / 2)));																								//predkosc
			if (wybor == 1)
				punkty++;

			if (_kbhit())
			{
				klawisz = _getch();
				if (klawisz == 224)klawisz += _getch();
				if (klawisz == 0) klawisz -= _getch();

				if (klawisz == gora && zwrot != 'd') zwrot = 'g';																				//deklaracja poruszania
				if (klawisz == dol && zwrot != 'g') zwrot = 'd';
				if (klawisz == lewo && zwrot != 'p') zwrot = 'l';
				if (klawisz == prawo && zwrot != 'l') zwrot = 'p';
			}



			if (zwrot == 'l') Xw--;																											//ruch weza
			if (zwrot == 'p') Xw++;
			if (zwrot == 'g') Yw--;
			if (zwrot == 'd') Yw++;




			if (wybor == 0)
			{
				if (Xw == szer) Xw = 0;																										//brak kolizji na scianach
				if (Xw == -1) Xw = szer - 1;
				if (Yw == wys) Yw = 0;
				if (Yw == -1) Yw = wys - 1;
			}

			if (wybor == 1)																													//kolizja na scianach
			{
				{
					if (Xw == szer || Xw == -1)
						break;
					if (Yw == wys || Yw == -1)
						break;
				}
			}





			if (pole[Xw][Yw] == 1)																											//jedzenie samego siebie
			{
				break;
			}





			if (pole[Xw][Yw] == 2)																											//jedzenie jedzenia :D
			{
				punkty = punkty + (2 * speed);
				dl++;
				do {
					Xj = rand() % szer;																										//pozycja nowego jedzenia			
					Yj = rand() % wys;
				} while (pole[Xj][Yj] != 0);

				pole[Xj][Yj] = 2;
				idzdoxy(Xj * 2 + 2, Yj + 1);
				kolorjedzenia();
				cout << (char)123 << (char)125;
				kolorweza();
			}
			else
			{
				if (ruchy > 0) pole[hX[ruchy - dl]][hY[ruchy - dl]] = 0;																	//usuwanie ogona
				idzdoxy(hX[ruchy - dl] * 2 + 2, hY[ruchy - dl] + 1);
				cout << "  ";
			}

			pole[Xw][Yw] = 1;
			idzdoxy(Xw * 2 + 2, Yw + 1);
			kolorweza();
			cout << (char)219 << (char)219;

			idzdoxy(0, wys + 1);
			kolortekstu();
			cout << endl << "Punkty: " << punkty;
			kolorweza();


		}

		kolortekstu();
		cout << endl << "Koniec gry, zdobyte punkty: " << punkty;
		cout << endl << tr("Czy chcesz zagrać jeszcze raz na tych samych ustawieniach? 0- nie, 1-tak: ");
		cin >> gracdalej;
		while (gracdalej < 0 || gracdalej>1)
		{
			cout << tr("Niestety nie ma takiej opcji, sprobój jeszcze raz: ");
			cin >> gracdalej;
		}
		if (gracdalej == 1)
		{
			system("cls");
			punkty = 0;
			dl = 0;
		}


	} while (gracdalej == 1);

	cout << "Zatem do widzenia!";
	Sleep(1500);

	return 0;
}


 
edytowany 2x, ostatnio: Daxpol
TU
  • Rejestracja:prawie 19 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Lublin
2

Stwórz sobie strukturę o nazwie "punkt" ("point") i zwracaj tę strukturę. Albo skorzystaj z pair, które już jest w c++:
http://www.cplusplus.com/reference/utility/pair/pair/

Wywal też te miliony enterów, sformatuj jakoś kod. Tutaj:

Kopiuj
            if (wybor == 1)                                                                                                                    //kolizja na scianach
            {
                {
                    if (Xw == szer || Xw == -1)
                        break;
                    if (Yw == wys || Yw == -1)
                        break;
                }
            }

na pewno chcesz otwierać i zamykać dwa nawiasy klamrowe?

edytowany 1x, ostatnio: Tulio
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
3

zrobie Ci maly code review

  • #include <conio.h> powinno byc oddzielone, zeby dzialalo tylko na windowsie. Wiec powinienes sprawdzac czy jest to uruchamiane na windowsie
  • #include "stdafx.h" do niczego Ci nie jest potrzebne, zapoznaj sie z tym jak pisac w visualu odpowiednio kod. Bo Ty w ogole nie uzywasz stdafx
  • piszesz w C++ wiec nie time.h tylko ctime odnosi sie do wszystkich biblotek ktore mozna zamienic
  • #include <windows.h> to samo co przy conio.h
  • Polskie nazewnictwo
  • beznadziejne nazewnictwo. Bez patrzenia w kod co ma niby robic funkcja Tr? ma sobie tyrkac trtrtr?
  • uzywanie char zamiast string
  • polskie znaki sie ustawia inaczej Jak uzyskać polskie znaki w strum. wyjścia
  • magic numbers
  • kolortekstu nie przyjmuje zadnego argumentu. Czyli to nie jest kolor tekstu tylko juz jakis konkretny kolor
  • czerwony. Co czerwony? Nazewnictwo jest strasznie slabe
  • void kolorweza() nic nie przyjmuje, nic nie zwraca
  • wiec co to ma niby robic? Co jezeli chce inny kolor weza?
  • void kolorjedzenia() to samo co wyzej
  • int wprowadzaniedanych(int z1, int z2) i niby czym ma byc to z1 i z2?
  • wyswieltasz i pobierasz dane w tej samej funkcji. To jest zlamanie jednej z zasady SOLID (a dokladniej pierwszej)
  • while (cin.good() == false). Zamiast tego !cin.good
  • kolizja() zamiast sprawdzac kolicje, to ustawia czy sciany beda przeszkoda czy nie... to juz ostatnie do nazewnictwa
  • formatowanie kodu. te ify bez {} kiedys sie na Tobie zemszcza
  • funkcje ktora maja wiecej niz 10 linii sa za duze (to nie jest jakas regula, ale w Twoim wypadku pomoze Ci to poprawic kod)
  • zamiast endl napisz '\n'
  • zamiast tablic uzyj std::vector
  • zamiast random uzyj device_random http://ideone.com/IxQCwU tutaj przyklad jak uzywac (warunek petli byl by cos pokazac komus, nie pisz tak bo to nie wyglada dobrze)
  • kod ma byc pisany tak, ze jezeli ktos kto nie zna sie na programowaniu powinien powiedziec co dana rzecz robi (patrzac po samych nazwach). U Ciebie jest chaos w formatowaniu i w nazewnictwie i ogolnie w pliku
  • doszedlem do maina i mi sie odechcialo. To znaczy zebys to wyrzucil i zaczal od nowa. Z jedna zasada. W mainie mozesz miec maksymalnie 5 linijek kodu
  • poczytaj o DRY, SOLID, MVC
  • poczytaj o klasach (sprawdz w moim kursie sa poczatki na temat klas)
edytowany 1x, ostatnio: fasadin
fasadin
@Daxpol zapomnialem Cie zawolac w poscie
Xupicor
"ma sobie tyrkać" - no padłem. xD
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)