Snake na tablicach ?

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

MJ
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 10 lat
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.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:107
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 :)

edytowany 1x, ostatnio: Hell4Ge
MJ
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 10 lat
0

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


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:107
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)

edytowany 1x, ostatnio: Hell4Ge
MJ
Ok czaję, zamiana miejsca do którego zmierzamy zastępując go znakiem z końca, a koniec oznaczyć przez pole puste. Jak najbardziej poprawne. Ja mówię tylko jak ja kiedyś programowałem Snake'a
0

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

VI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:212
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

MJ
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 10 lat
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ł ;-)


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay
0

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

Kopiuj
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; 
H4
nie uzywaj system cls, gdzies jest funkcja do czyszczenia okna konsoli
VI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:212
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:

Kopiuj
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

edytowany 2x, ostatnio: Visher

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.