Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++][Problem] Gra Snake, problem.


Rekomendowane odpowiedzi

Opublikowano

Chciałem zrobić Snejka.

 

#include <iostream>
using namespace std;
struct pos
{
int x, y;
};
class map
{
public:
	void test(int* status)
	{
	//COROBIC
	}
};
int main()
{
int status[40][20];
map level1;
pos snake[100];	 // pozycja czlonu numer [i] weza
   level1.test(*status);
return 0;
}

 

Tam gdzie jest wpisany //COROBIC mam problem. Jak mogę zobaczyć wartość status[a]?

//Zakaz gifów-Dektored

Opublikowano

Jeśli bardzo musisz znać odpowiedź na swoje pytanie:

 

class CMap { 
public: 
  void test ( int const& status ) const { // const'y możesz opuścić, jednak nazwa funkcji sugeruje, iż powinny tam być
      std::cout << "Stan pola a * b " << status[a][b]; 
  } 
}; 

int main() { 
  int status[40][20];
  // ... 
  level1.test( status ); 
}

 

Innymi słowy:

Przekazuj tablicę przez referencję, a nie przez wskaźnik.

 

Jeśli natomiast KONIECZNIE musisz przez wskaźnik:

void test( int const* status ) { 
  std::cout << "Wartość pola a * b, przy szerokości = 40: " << status+(40*a+; 
}

 

 

Natomiast hasło na dziś: enkapsulacja.

 

Tablicę status[40][20], która - jak rozumiem - reprezentuje mapę, z której każdy fragment może być pustym polem, ścianą albo wężem - umieściłbym w klasie CMap.

 

Poza tym, zamiast int'a skorzystałbym z typu wyliczeniowego (ENUM) opisującego każdy możliwy stan pola mapy ( wąż, puste, ściana etc. ).

Ta sygnatura jest pusta.

Opublikowano

@UP

Dzięki.

 

Teraz mam nowy problem. Dlaczego przy ruchu pojawiają się tylko 2 człony węża, a nie 10?

 

 

#include <iostream>
#include <windows.h>
#include <conio.h>
/* TO DO
-Rysowanie mapy	   +
-Ruch weza			?
-Rozstawianie owocow
-Utworzenie konfliktow z:
-sciana
-wezem
-owocem
-Podsumowanie
-Menu
-Wiecej lvli
*/
using namespace std;
struct pos
{
int x, y;
};
enum c_status
{
clr, // clear
wll, // wall
snk, // snake
frt  // fruit
};
class c_map
{
public:
	c_status status[40][20];
	pos snake[100];	 // pozycja czlonu numer [i] weza
	int snake_dir; //0 lewo, 1 gora, 2 prawo, 3 dol
	void snake_set_dir()
	{
		char dir = getch();
		switch(dir)
		{
			case 'a':
				snake_dir=0;
			break;
			case 'w':
				snake_dir=1;
			break;
			case 'd':
				snake_dir=2;
			break;
			case 's':
				snake_dir=3;
			break;
		}
	}
	void snake_move()
	{
		for (int i = 1; i != 10; i++)
		{
		if (snake[i].x < snake[i-1].x)
			(snake[i].x)++;
		if (snake[i].x > snake[i-1].x)
			(snake[i].x)--;
		if (snake[i].y < snake[i-1].y)
			(snake[i].y)++;
		if (snake[i].y > snake[i-1].y)
			(snake[i].y)--;
		}
		switch (snake_dir)
		{
			case 0:
				(snake[0].x)--;
			break;
			case 1:
				(snake[0].y)--;
			break;
			case 2:
				(snake[0].x)++;
			break;
			case 3:
				(snake[0].y)++;
			break;
		}

		for (int i = 0; i !=10; i++)
		{
			set_status((snake[i].x), (snake[i].y), snk);
		}
	}
	void set_status(int x, int y, c_status set)
	{
		status[x][y]=set;
	}
	void status_clr_map()
	{
		for (int x=0; x != 40; x++)
		{
			for (int y=0; y != 20; y++)
			{
				status[x][y] = clr;
			}
		}
	}
	void status_clr_all()
	{
		for (int x=0; x != 40; x++)
		{
			for (int y=0; y != 20; y++)
			{
				status[x][y] = clr;
			}
		}
		for (int i=0; i != 100; i++)
		{
			snake[i].x = 0;
			snake[i].y = 0;
		}

	}

	void draw()
	{
		system("cls");
		for (int y = 0; y != 20; y++)
		{
			for (int x = 0; x != 40; x++)
			{
				switch (status[x][y])
				{
					case 0:
						cout << " ";
					break;
					case 1:
						cout << "#";
					break;
					case 2:
						cout << "x";
					break;
					case 3:
						cout << "O";
					break;
				}
			}
			cout << endl;
		}
	}
};
int main()
{
c_map level1;
//pos fruit;
level1.status_clr_all();
for (;
{
level1.status_clr_map();
level1.snake_set_dir();
level1.snake_move();
level1.draw();
}
return 0;
}

 

 

//Zakaz gifów-Dektored

Opublikowano

 

 

#include <iostream>
#include <windows.h>
#include <conio.h>
/* TO DO
-Rysowanie mapy	+
-Ruch weza					  ?
-Rozstawianie owocow
-Utworzenie konfliktow z:
	-sciana
	-wezem
	-owocem
-Podsumowanie
-Menu
-Wiecej lvli
*/
using namespace std;
struct pos
{
	int x, y;
};
enum c_status
{
	clr, // clear
	wll, // wall
	snk, // snake
	frt  // fruit
};
class c_map
{
	public:
			c_status status[40][20];
			pos snake[100];  // pozycja czlonu numer [i] weza
			int snake_dir; //0 lewo, 1 gora, 2 prawo, 3 dol
			void snake_set_dir()
			{
					char dir = getch();
					switch(dir)
					{
							case 'a':
									snake_dir=0;
							break;
							case 'w':
									snake_dir=1;
							break;
							case 'd':
									snake_dir=2;
							break;
							case 's':
									snake_dir=3;
							break;
					}
			}
			void snake_move()
			{
					for (int i = 10; i != 0; i--)
					{
					snake[i].x = snake[i-1].x;   //tu duzo pozmienialem

					snake[i].y = snake[i-1].y;

					}
					switch (snake_dir)
					{
							case 0:
									(snake[0].x)--;
							break;
							case 1:
									(snake[0].y)--;
							break;
							case 2:
									(snake[0].x)++;
							break;
							case 3:
									(snake[0].y)++;
							break;
					}

					for (int i = 0; i !=10; i++)
					{
							set_status((snake[i].x), (snake[i].y), snk);
					}
			}
			void set_status(int x, int y, c_status set)
			{
					status[x][y]=set;
			}
			void status_clr_map()
			{
					for (int x=0; x != 40; x++)
					{
							for (int y=0; y != 20; y++)
							{
									status[x][y] = clr;
							}
					}
			}
			void status_clr_all()
			{
					for (int x=0; x != 40; x++)
					{
							for (int y=0; y != 20; y++)
							{
									status[x][y] = clr;
							}
					}
					for (int i=0; i != 100; i++)
					{
							snake[i].x = 0;
							snake[i].y = 0;
					}

			}

			void draw()
			{
					system("cls");
					for (int y = 0; y != 20; y++)
					{
							for (int x = 0; x != 40; x++)
							{
									switch (status[x][y])
									{
											case clr:
													cout << " ";
											break;
											case wll:
													cout << "#";
											break;
											case snk:
													cout << "x";
											break;
											case frt:
													cout << "O";
											break;
									}
							}
							cout << endl;
					}
			}
};
int main()
{
	c_map level1;
	//pos fruit;
	level1.status_clr_all();
	for (;
	{
	level1.status_clr_map();
	level1.snake_set_dir();
	level1.snake_move();
	level1.draw();
	}
	return 0;
}


Opublikowano

@UP

Dzięki.

 

To teraz nowy problem. Potrzebuję czegoś takiego jak getch(), ale żeby nie wstrzymywało programu do czasu otrzymania jakiegoś guzika.

//Zakaz gifów-Dektored

Opublikowano

Najrostsze i najmniej CPUżerne będzie kbhit

 

Nie należy do standardu, ale zarówno g++ i msvc tę funkcję implementują.

Biblioteka conio.h.

 

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

int main() {
int a;

while (true) {
	if ( kbhit() ) {
		a = getch();
		std::cout << a << std::endl;
		if ( ! (a ^ 27) )
			break;
	}
}

}

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...