_kbhit i _getch - poruszanie postacią w prostej grze - kilka znaków w buforze

0

Witam :) początkujący phoghamista 1 rok studiów, nudzi mi się na wykładach i zaczynam się bawić kodem. Co pierwsze? hmm może prosty snake? challenge accept!

Idzie mi całkiem nieźle w tym programie, ale mam jeden szczegół z którym sobie nie mogę poradzić,
mianowicie przy wciskaniu jednego klawisza z drobnym odstępem to w pętli do opoznienia on zostaje w buforze i w funkcji elegancko działa a potem się usuwa while(_kbhit())_getch();

No i fajnie, ale jak kliknie się kilka razy to chyba bufor ma np A B i odczyta A zamiast B, tak przynajmniej myślę, poradzi ktoś może coś??

while (true)
	{
		sterowanie(mapa, ruch, pozx, pozy);
		reload_mapy(mapa, mapa_x, mapa_y, mapa_z);

		Sleep(500);
	}
void sterowanie(int *** mapa, char & ruch, int &pozx, int &pozy)
{
	
	if (_kbhit())
	{
		switch (_getch())
		{
		case 'w':
			if (ruch != 's')ruch = 'w';
			break;
		case 's':
			if (ruch != 'w')ruch = 's';
			break;
		case 'a':
			if (ruch != 'd')ruch = 'a';
			break;
		case 'd':
			if (ruch != 'a')ruch = 'd';
			break;
		}
	}
	while (_kbhit())_getch();
	if (ruch == 'w' ) { mapa[pozx - 1][pozy][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozx--;  }
	if (ruch == 's' ) { mapa[pozx + 1][pozy][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozx++;  }
	if (ruch == 'a' ) { mapa[pozx][pozy - 1][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozy--;  }
	if (ruch == 'd' ) { mapa[pozx][pozy + 1][1] = 1; mapa[pozx][pozy][1] = 0; mapa[pozx][pozy][2] = 1; pozy++;  }

}
0

challenge accept

Please consider accepted in case of trying to show off.


Nie bardzo rozumiem co chciałeś przekazać tutaj:

się usuwa while(_kbhit())_getch();

Usuwa Ci się fragment kodu, czy usuwa Ci się znak z bufora? Rozwiń to. Poza tym nie bardzo rozumiem po co chcesz pobierać jeden znak wpisany do bufora, a drugi (lub resztę) omijać? Nie dajesz komentarzy w kodzie i nie wyjaśniasz prezentując swój problem i swój kod.

Po drugie:

A B i odczyta A zamiast B, tak przynajmniej myślę

Czemu sam tego nie sprawdzisz?

Po trzecie: trochę przekombinowałeś swój kod. Przecież kod, który wykonywany jest gdy: if (ruch == 'w' ) można śmiało przenieść bezpośrednio do wykrycia ruchu w górę, czyli do case 'w':. Wtedy zmienna ruch (czemu jest ona typen int?) będzie zupełnie niepotrzebna...

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