Gra Snake - uderzenie w ogon.

0

Witam. Chcę napisać grę Snake. Wszystko już zrobiłem, czyli wąż idzie z określoną prędkością i zostawia po sobie ślad.
Jest to napisane w taki sposób

CClientDC dc(this);	

CPen rpen (PS_SOLID, 10, RGB(0, 255,0) );
dc.SelectObject(&rpen);


	if ( gora == 1 )
	{
	dc.MoveTo(x,y);
	dc.LineTo(x,y--);
	}

Czy jest to dobry sposób na napisanie takiej gry?
I co muszę zrobić aby program reagował na wjechanie w ogon węża?

0

Zwykle gra wąż jest oparta na odmianie automatu komórkowego.
Masz jakąś tablicę dwuwymiarową, do której wpisujesz pozycje wszystkich części węża przeszkód itp. Głową węża sprawdzasz zawartość tej tablicy i w ten sposób wiesz na co ona trafiła.

0

A można prosić o przykład takiego kodu? Bo za nic mogę tego napisać...

0

Wiem, że to nie tablica dwuwymiarowa, ale próbowałem na zwykłem bo nie wiem jak wykorzystać dwuwymiarową w tym przypadku..

if ( gora == 1 )
        {
        dc.MoveTo(x,y);       // rysowanie od tych wspolrzednych...
        dc.LineTo(x,y--);     // .... do tych
        }

tablicaX[x2]=x;
x2++;
tablicaY[y2]=y;
y2++;

for (x2=0;x2<1000;x2++)
{
for (y2=0;y2<1000;y2++)
if ( (tablicaX[x2] == x) && (tablicaY[y2] == y) )
MessageBox("crash");


}

Teoretycznie to powinno działać ale MessageBox pokazuje mi się tylko przy pierwszym ruchu.

Oczywiście na samym początku programu do zmiennych x2 i y2 mam przypisane 0 (więc nie idzie od np. -17543)

0

Odświeżam, gdyż zależy mi na szybkiej odpowiedzi..
Jak mogę poprawnie porównywać elementy tablicy dwuwymiarowej?
Prosiłbym o pomoc.

0

tab[a][b] == tab[x][y]

0

Tak tylko zawsze mi pokazuje MessageBoxa.
A jak według Ciebie powinno wyglądać zapisywanie do takiej tablicy? Wiem, że powinienem użyć podwójnej pętli for, tyle że po każdym ruchu ma być zapisywane do takiej tablicy, więc for nie za bardzo się do tego nadaje..

0

Sam nie wiesz czego chcesz. Nie porównuj wszystkiego ze wszystkim tylko sprawdzaj czy na docelowym polu jest wartość komórki ciała węża.

if (tab[docelowe_x][docelowe_y] == WAZ) jebut();

0

łopatologicznie:
Waż porusz się po czymś w stylu szachownicy. Każde pole tej szachownicy jest reprezentowane przez jedną komórkę tablicy dwuwymiarowej.
Poruszając węża wypełniasz tablice odpowiednią wartością oznaczającą segment węża. Przy każdym ruchu sprawdzasz co jest na polu/komórce przed głową węża jesli ogon to "jebut" jeśli puste pole to krok naprzód, jeśli jabłko to do przodu i pozwalasz wężowi rosnąć przez 3 kolejki.
ale kodu ci nie dam, sam się pomęcz (przynajmniej dopóki sam nie pokażesz jakiegoś sensownego kodu, bo kodować za ciebie nie będziemy).

0

Ok, rozumiem...Tylko:

if (nChar == 'w')
	{
	dc.MoveTo(x,y);
	y=y-10;

	dc.LineTo(x,y);
	}

	if (nChar == 's')
	{

	dc.MoveTo(x,y);
	y=y+10;

	dc.LineTo(x,y);
	}

	if (nChar == 'a')
	{

	dc.MoveTo(x,y);
	x=x-10;
	
	dc.LineTo(x,y);
	}

	if (nChar == 'd')
	{

	dc.MoveTo(x,y);
	x=x+10;
	
	dc.LineTo(x,y);
	}

	stareY[y2++]=y;
	stareX[x2++]=x;

	for (x2;x2<100;x2++)
	{
		for (y2;y2<100;y2++)
		{
			tablica[x2][y2] = stareY[y2];
	
		}

	}

I mój problem polega na tym, że nie wiem jak to tablicy wierszy (tablica [x2] [y2] ) przypisać wartość stareX[x2].
Czy ten kod jest już sensowniejszy?
Bo wiem że tablica dwuwymiarowa to tablica[wspolrzedna_x] [wspolrzedna_y] . Tylko nie wiem jak prawidłowo do niej przypisać poszczególne wartości.
Bo potem z porównaniem to myslę że sobie jakoś poradzę.

0

Nie no męcze się z tym od kilku dni i dalej nie dostanę sensownej pomocy? ;/

0

I mój problem polega na tym, że nie wiem jak to tablicy wierszy (tablica [x2] [y2] ) przypisać wartość stareX[x2].

Zapamiętać stare X przed zmianą, potem zapisać ponownie w pierwotnym miejscu?

0

Ok pozmieniałem trochę i jest dużo lepiej aczkolwiek...


s++;



	if (nChar == 'w')
	{
i++;
j++;
	tabY[j]=y;
	tabX[i]=x;
	k=j;
	n=i;

 	dc.MoveTo(x,y);

	y=y-10;
	
	for (i=1;i<=s;i++)
		for (j=1;j<=s;j++)
		if ( (tabY[j]==y) && (tabX[i]==x) )
		MessageBox("YYY");
	j=k;
	i=n;
	dc.LineTo(x,y);
	}

Tak wygląda kod w przypadku każdego kierunku poruszania się (W S A D ). Oczywiście zmienna s++ jest poza tym. I działanie jest następujące. Komunikat pokazuje się gdy głowa węża jest na starej pozycji XY, tyle że trochę źle to ocenia.

user image

Legenda
pomarańczowy -> glowa węża
czerwony -> ciało węża
niebieski -> linie współrzędnych
zielone kółka -> przecięcie się ciała węża ze współrzędnymi.

Czyli reasumując, komunikat wyświetla się jeśli głowa węża znajduje się na współrzędnej Y ciała węża i współrzędnej X węża, tyle że tą współrzędną (np X ) nie obiera sobie z tego samego momentu gdzie znajdowała się pozycja ciała współrzędnej Y.
Troche masło maślane ale mam nadzieje, że rozumeisz o co chodzi.

Edit:
Chyba sobie poradziłem ;). Użyłem tylko jednej pętli for (bez zagnieżdzenia) i jednego indeksu (operuję tylko i )
Więc jak widzicie żadnej tablicy dwuwymiarowej nie trzeba :P

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