Snake na tablicach ?

0

Witam. Otóż podjąłem próby pisania typowego węża i stanąłem na problemie przesuwania go po mapie, próbowałem wyszukać odpowiednich informacji do forum lecz nie doprowadziło mnie do tego co chciałbym wiedzieć ,a mianowicie jak stworzyć to używając tylko instrukcji iteracyjnych, funkcji i tablic ? Próbowałem stworzyć tablice która zapamiętuje poszczególny element węza ale to złudna robota i sprawdzenie za każdym razem tej tablicy to 3 pętle.

Pozdrawiam

0

Przesuwasz tablicę, tak, że tab[last] = tab[last - 1] i iterujesz do początku (to będzie tablica dwuwymiarowa, ale tłumaczę sposób). Natomiast tab[0] przesuwasz w odpowiednią stronę.
Jeżeli chodzi o zjedzenie ciasteczka, to głowę przesuwasz, a w jej miejsce wstawiasz nowy kafelek, całą resztę zostawiasz. A potem znowu przesuwasz tak jak przy linijce wyżej.

0

Ja bym utworzył funkcję kasującą ostatni klocek węża (wywoływaną przy dowolnym poruszeniu go, np. strzałkami?), oraz tworzącą klocek w X miejscu w zależności od wciśniętej strzałki
Tablicę z wężem możesz wypełnić jedynkami, puste pola zerami, a żarcie dwójką

Z kasowaniem ostatniego klocka miał byś największy problem ;)

Powodzenia :)

0

Po co usuwać ostatni kafelek? Przecież jak usuniesz, to skróci Ci się wąż.

0

Usuwanie tylnego kawałka i dodawanie kolejnego na początku to jest takie prostsze przesuwanie (przecież nasz wąż wygląda tak samo więc nie ma potrzeby przesuwania każdego pktu jego ciała, skoro można usunąc ostatni i dodać początkowy)

0

A mógłbym prosić o jakiś pseudokod jak ma to wyglądać ?Pozdrawiam

0

Na tablicach robota będzie do d**y. Poczytaj o vectorach. Tam możesz usuwać i dodawać elementy, zwiększając lub zmniejszając ich ilość.
Podczas ruchu wstawiasz w konsolę spację na ostatnim elemencie vectora, a następnie na samym początku dodajesz kolejny element z pozycją zależną od kierunku ruchu i wstawiasz to w miejsce jakiś znak.

A jeżeli nie robisz w konsoli, to wystarczy zamienić funkcję od wstawiania znaku na pozycję, na wstawianie pixela.

jak coś pytaj, gg: 8312170

0

A po co vectory? Tworzysz tablicę dwuwymiarową i masz od razu ograniczenie mapy.
Ale widzę, że już podałeś nr gadu, więc zapewne masz pomysł ;-)

0

Taki oto mój kod "na brudno", mam problemy z poruszaniem w góre i w lewo, oto fragment kodu:

for(;;)
  {
  temp1=60;
  temp2=20;
  temp3=1;
  temp4=1;
  system("cls");
  //
  for(y=0;y<sizey;++y)
  {
                      for(x=0;x<sizex;++x)
                      {
                                          if(y==0||y==19) printf("-");
                                          else if(x==0||x==59) printf("|");
                                          else if(waz[x][y]==1) 
                                          {
                                               printf("O");
                                               if(temp1>x||temp2>y)
                                               {
                                               temp1=x;
                                               temp2=y;
                                               }
                                               if(temp3<x||temp4<y)
                                               {
                                               temp3=x;
                                               temp4=y;
                                               }
                                          }
                                          else if(xjedz==x&&yjedz==y) printf("*");
                                          else printf(" ");
                      }
                      printf("\n");
  }
  printf("%d,%d||||%d,%d",temp1,temp2,temp3,temp4);
 /* 
  //sterowanie
  sleep(100);
  while(kbhit()) */
  wybor=_getch();
  switch(wybor)
  {
               case 'w':
                    if(zap=='s') continue;
                    if(zap=='w')
                    {
waz[temp3][temp4]=1;
                    }
                    else
                    {
                    waz[temp1+licznik][temp2-1]=1;
                    waz[temp1][temp2]=0;
                    }
                    break;
               case 's':
                    if(zap=='w') continue;
                    waz[temp3][temp4+1]=1;
                    waz[temp1][temp2]=0;
                    break;
               case 'd':
                     if(zap=='a') continue;
                    waz[temp3+1][temp4]=1;
                    waz[temp1][temp2]=0;
                    break;
               case 'a':  
                     if(zap=='d') continue;
                    waz[temp1][temp2]=0;
                    waz[temp1-1][temp2+licznik]=0;
                    break;
  }
    zap=wybor; 
0

Taki sposób jest bez sensu. Za każdym ruchem czyścisz ekran i rysujesz wszystko od nowa - wydajność zerowa.
Używaj biblioteki conio2 - tam masz bardzo dobre funkcje, m.in. putchxy(x, y, 'a') który wstawia znak 'a' na pozycję x, y. Także jest clrscr() do czyszczenia ekranu, gotoxy(x, y) do przesunięcia kursora w dane miejsce wiersza poleceń. Stosując putchxy będziesz na jeden ruch zmieniał tylko dwie rzeczy :)
No i jak już pisałem, poczytaj o vectorach, będziesz miał w bardzo oszczędnej pamięciowo wersji wszystkie elementy snake'a.

I co do poruszania się, zrealizuj to tak:

char key;
int relPosX, relPosX

if (kbhit()) // Jeżeli w buforze klawiatury jest jakiś znak
{
	key = getch();
	
	switch (key)
	{
		case 'w':
			relPosX = 0;
			relPosY = -1;
			break;
		case 's':
			relPosX = 0;
			relPosY = 1;
			break;
		case 'a':
			relPosX = -1;
			relPosY = 0;
			break;
		case 'd':
			relPosX = -1;
			relPosY = 0;
			break;
		default:
			break;
	}
}

Sleep(800);

I obliczasz sobie następną pozycję na którą wejdzie snake.

Sleep() masz w windows.h

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