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

Tetris


Rekomendowane odpowiedzi

Opublikowano

Żeby nie spamować... Nowy temat. Będę pisał Tetrisa, dlatego mam kilka pytań:

-poszczególne części klocka, będą w tablicy, czy jest to dobre rozwiązanie?

-jakie istnieją typy klocków, oraz jak wyglądają? może jest to gdzieś opisane? nic do tej port nie znalazłem

-czy klocki są w 100% losowe? czy losują się tak, żeby można było je ułożyć dobrze w 1 rzędzie?

//Przypomniała mi się pewna strona...

http://pl.wikipedia.org/wiki/Tetris

//Nawet nie krytykujcie, tylko powiedzcie/naprowadźcie czy jest wszystko dobrze, oraz czy zmierzam w dobrym kierunku :)

http://wklej.to/HjWWl

zapomniałem dodać do gry bool'a czy gra trwa

 

WAŻNE!!!!!!!!!!!!!!!!!!!!!

Czy jak użyję break; to wychodzi z pojedynczej pętli czy ze wszystkich?

Dalej, nie używam kolizji, jak czytałem o odtwarzaniu tej gry, wielu ludzi to robiło, tylko wszystko zapisuje w dwuwymiarowej tablicy, gdzie np. 1 to typ klocka 1, wtedy kolor to np. czerwony... Mniejsza, chodzi o obrót. Jak się zabrać?

//Już chyba wiem, zrobię tak:

-pierwszy klocek x+=1;y+=1;

-drugi klocek x+=1;y-=1;

-trzeci klocek x-=1;y-=1;

na przykładzie klocka T, z innymi klockami może być inaczej, ale dam radę ;) Oczywiście do klas dodałem w 'klocki' punkt przyłożenia, względem niego klocek będzie się obracał... Z resztą łapta: http://wklej.to/ENknl

Opublikowano

typy klocków i inne info masz w artykule na wiki o tetrisie

1. Części klocka zrób tak:

tablica_X[iloscklocków][4]

tablica_Y[iloscklocków][4]

2. dla każdego klocka przypisuj odległość poszczególnej części klocka od jego lewego, górnego rogu

czyli, np

Dim $vKlockiX[7][4] = [[0, 0, 0, 0],[0, 1, 2, 1],[0, 1, 0, 1],[0, 0, 0, 1],[1, 1, 1, 0],[0, 1, 1, 2],[0, 1, 1, 2]];pozycje klockow

Dim $vKlockiY[7][4] = [[0, 1, 2, 3],[0, 0, 0, 1],[0, 0, 1, 1],[0, 1, 2, 2],[0, 1, 2, 2],[1, 1, 0, 0],[0, 0, 1, 1]]

 

każda liczba oznacza odległość od punktu 0,0 kolejnych klocków

czyli dla drugiego klocka (pogrubiony) będzie to wyglądać tak

-- 0 1 2 3

0 X X X

1 -- X

2

3

(zacytowałem z mojego posta z autoit, żeby nie pisać tego drugi raz.)

 

3. klocki lecą całkowicie losowo.

 

@edit. 4. Jak będziesz potrzebował zrobić obracanie to, albo pisz dla każdego klocka wszystkie 4 pozycje, albo zrób jeden algorytm obracający klocek wokół wybranej kratki/bloczku. Nie jest on trudny.(Rozrysuj sobie np klocek z powyżej, rozpisz sobie pozycje poszczególnych bloczków w kolejności takiej jak są w początkowym i szukaj zależności między tymi liczbami.) Mi zajął 5 linijek. (jak chcesz to Ci mogę z nim pomóc)

 

@edit2

5. Instrukcja break pozwoli nam przerwać działanie jednej z pętli: for, while, do while oraz instrukcji switch.

 

@edit poprawiłem ort...

 

@edit4

//Już chyba wiem, zrobię tak:

-pierwszy klocek x+=1;y+=1;

-drugi klocek x+=1;y-=1;

-trzeci klocek x-=1;y-=1;

na przykładzie klocka T, z innymi klockami może być inaczej, ale dam radę ;) Oczywiście do klas dodałem w 'klocki' punkt przyłożenia, względem niego klocek będzie się obracał... Z resztą łapta: http://wklej.to/ENknl

nope. Zrób tak jak napisałem w punkcie 2. a pozycje obliczaj tylko przy wyświetlaniu, lub sprawdzaniu

 

@edit5.

chodzi o obrót. Jak się zabrać?

punkt 4.

Opublikowano

Jeśli chodzi o kombinowanie z tablicą, to nie zrobię tego z kilku prostych powodów:

-dla mnie to utrudnianie kodu

-wszystko mam już obmyślone

-jestem przyzwyczajony do planszy w tablicy dwuwymiarowej

A co do obrotu, to napisz na PW, albo tutaj jak wolisz, oraz dzięki wam, że pomagacie, gdyby nie wy, do wszystkiego sam bym nie doszedł -> zaniechał jakiś projekt, co skutkuje tym, że bym się nie rozwinął :< Pomagacie tym, że nawet nie odpisujecie, bo wtedy sam dochodzę do czegoś...

//

-jeśli klocek znajduje się wyżej (y jest mniejsze) niż punkt odniesienia, wtedy x-=1; y+=1;

-jeśli klocek znajduje się niżej (y jest większe), wtedy x+=1; y-=1;

Z kolei rysowanie będzie mniej więcej wyglądało tak:

jeżeli plansza[y][x] == 1 wtedy rysuj czerwony_kwadrat na pozycji x*szerokosc i y*wysokosc obrazka

//Dobra, obrót póki co mam taki:

void klocek::obrot() {
if(kloc.typ!=TETR_O) {
	for(int xs=kloc.width-1;xs=>0;xs--) {
		for(int ys=kloc.height-1;ys=>0;ys--) {
			if(planszatemp[ys][xs]==typ) {
				if(ys>pp.y) {
					kloc.ksztalttemp[ys][xs]=0;
					kloc.ksztalttemp[ys-1][xs]=0;
				} else {
					kloc.ksztalttemp[ys][xs]=0;
					kloc.ksztalttemp[ys+1][xs]=0;
				}
				if(xs>pp.x) {
					kloc.ksztalttemp[ys][xs]=0;
					kloc.ksztalttemp[ys][xs-1]=0;
				} else {
					kloc.ksztalttemp[ys][xs]=0;
					kloc.ksztalttemp[ys][xs+1]=0;
				}
			}
		}
	}
}
}

Jeszcze tylko kloc.ksztalttemp wyrysować pod wspolrzednymi x i y na tablicy gry :)

Oraz jeszcze jednego nie przewidziałem... Wykorzystanie klasy 'klocek'... Kiedy się losuje? Ale tym zajmę się jutro... Chyba, że ktoś to właśnie czyta

Opublikowano

Func obroc_prawo($klocek) ;obracanie w prawo
Local $tmp[4]
For $i = 0 To 3
	$tmp[$i] = $vKlockiX[$klocek][$i]
	$vKlockiX[$klocek][$i] = $vMaxRozmiary[$klocek] - $vKlockiY[$klocek][$i]
	$vKlockiY[$klocek][$i] = $tmp[$i]
Next
If $iObrot = 4 Then $iObrot = 1
kolizja_sciana($klocek) ;sprawdzanie kolizji
If kolizja($klocek) Then obroc_lewo($klocek);drugie sprawdznie kolizji
rysuj(4)
EndFunc   ;==>obroc_prawo
Func obroc_lewo($klocek) ;obracanie w lewo
Local $tmp[4]
For $i = 0 To 3
	$tmp[$i] = $vKlockiY[$klocek][$i]
	$vKlockiY[$klocek][$i] = $vMaxRozmiary[$klocek] - $vKlockiX[$klocek][$i]
	$vKlockiX[$klocek][$i] = $tmp[$i]
Next
If $iObrot = 0 Then $iObrot = 4
EndFunc   ;==>obroc_lewo

(kod z autoit)

//zmienna $klocek oznacza rodzaj aktualnego klocka (0-6);

//zmienna $i oznacza aktualnie brany pod zamianę mały bloczek (z którego składa się cały klocek,)

 

//przyjrzyjmy się funkcji "Func obroc_prawo($klocek)"

	If $iObrot = 4 Then $iObrot = 1 //ta linia nie jest konieczna jak jej potrzebowałem, sam nie wiem do czego ;d

kolizja_sciana($klocek) ;sprawdzanie kolizji //u mnie to wygladalo tak ze jesli byla kolizja ze ścianą to go przesuwał do możliwych wsp.

 If kolizja($klocek) Then obroc_lewo($klocek);drugie sprawdznie kolizji //a jeśli z klockiem to odręcał w drugą strone.

rysuj(4)//nie wazne

 

Wytłumaczę to.

For $i = 0 To 3
	$tmp[$i] = $vKlockiX[$klocek][$i]
	$vKlockiX[$klocek][$i] = $vMaxRozmiary[$klocek] - $vKlockiY[$klocek][$i]
	$vKlockiY[$klocek][$i] = $tmp[$i]
Next

Np po obracaniu klocka T pozycje będą następujące (obracamy w prawo wokół klocka o pozycji 1,1

bez obrotu -

x - 0 1 2 1

y - 0 0 0 1

 

//teraz zamieniamy "z" za "y" i odwrotnie. Do tego potrzebna nam jest zmienna tmp.

//następnie wartość każdego pola w "x" będzie wynosiła (punkt obrotu [jest on jednakowy dla osi "X" jak i "y"] + 1 - " wartość danej komórki z tablicy "x") (nie wiem dlaczego +1. znaczy mniej więcej wiem ale nie umiem tego wytłumaczyć xD)

//czyli wcześniej zdefiniowana zmienna "punkt obrotu" zawiera punkt (jednocześnie x i y na osi) wokół którego ma się obracać klocek. jednak sęk w tym, że musi ona mieć wartość taką jakby tablica zaczynała się od pozycji 1

//dla każdego kolejnego obrotu to samo.

//dla obrotu w lewo robimy to w odwrotnej kolejności. (w razie gdy wystąpi kolizja i chcemy tego uniknąć, to trzeba cofnąć obrót)

1. obrót -

x - 2 2 2 1

y - 0 1 2 1

2. obrót -

x - 2 1 0 1

y - 2 2 2 1

3. obrót -

x - 0 0 0 1

y - 2 1 1 1

 

 

Ale się rozpisałem ;d

Sory jeśli zbyt zagmatwane, ale nie umiem tego lepiej wytłumaczyć.

@edit któryś tam.

jak nie ogarniesz to zrób po prostu tablice zawierającą położenia dla wszystkich 4 obrotów, albo rozrysuj sobie wszystko na kartce i spróbuj sobie ogarnąć/rozrysować powyższy przykład.

Opublikowano

Z obrotem to sobie poradziłem... Patrz ostatni edit, tylko w Tetrisie, jak jest z obrotami? Tylko w lewo? Czy w prawo? A może w obydwie strony? U mnie jest póki co w lewo... Ale teraz pytanie: jak losować klocek (tworzyć), kiedy, tworząc nową zmienną klocek blabla; w tym blabla już jest wylosowany (konstruktory), ale jak tym operować? Sopel, jakbyś mógł pisać w C++, C#, bo autoit jest wkurzające... Trudno mi coś w ogóle zrozumieć...

//Chyba wiem, jak klocek dotknie na dole chociaż 1 innego klocka, to wtedy losuje nowego... Tylko problem, jak usunąć tą zmienną, oraz wstawić nową o tej samej nazwie?

Opublikowano

ja ten kod kopiuje ze swojego i nie che mi się go przepisywać, a jest raczej taki prosty, że każdy go zrozumie.

Stwórz tablice o wymiarze 2 (np "aktualneklocki[2]")

stwórz zmienną "iloscklockowwylosowanych" czy jakos tak o wartości 0

po kazdym losowaniu zwiększaj ją o 1.

jeśli "iloscklockowwylosowanych" < 2

{
aktualneklocki[iloscklockowwylosowanych] = losuj 0-6
iloscklockowwylosowanych += 1
}

 

przy przesuwaniu i wszystkim co się dzieje używaj aktualneklocki[0]

a przy wyświetlaniu następnego aktualneklocki[1]

 

jeśli klocek opadł i bardziej nie może to zmniejsz "iloscklockowwylosowanych" o 1 i

aktualneklocki[0] = aktualneklocki[1]

 

obracać możesz tylko w prawo

 

postaram się pisać w miare możliwości w c++, ale takie skrawki kodów będe pisał tak jak w tym poście.

Opublikowano

Żałosne... Myślisz, że wstawisz obrazek i jesteś fajny? Najpierw przemyśl... Pytałem o sposób obrotu, Sopel przedstawił swój, ale mi nie odpowiadał, skoro Cię to tak wkurza TO PO CO KURWA CZYTASZ?

//A jeśli chodzi o te tablicę, to Sopel miał dwie tablice, coś typu TablicaX, TablicaY... Ja mam jedną dwuwymiarową

Opublikowano

polecam Ci zrobić jakieś lepsze opadanie, na zasadzie, że zaczyna np od wartości 10 i stopniowo zmniejsza, aż do -10. Za każdym razem dodaje ją do wysokości. będzie płynniej.

PS. jak robisz ssy z minecrafta to wyłączaj gui (F1 bodajże)

Opublikowano

Nie robiłem... Na google znalazłem ;D Ale grafiką kolega się zajmie... Tak dla picu... Pytanko, przy platformówkach, to ludzie zapisują planszą do tablicy? Np. Mario, u mnie na razie jest sztywnie plansza rysowana, ale to na brudno... A kolizje to tylko getpixel() (wykluczając diamenty i kolce)

Opublikowano

nie wiem czy getpixel() jest dobrym rozwiązaniem kolizji. ja bym wszystkie zapisał do pliku.

Potem wczytał je do tablicy.

Tablica byłaby 3 wymiarowa

int iTablica[ilosc lvli][maksymalna ilosc kolizji][4];

w ostatnich komórkach tablicy trzymałbyś wsp x, y oraz wys i szer.

Sprawdzałbyś kolizje tylko dla danego poziomu.

 

Pytanko, przy platformówkach, to ludzie zapisują planszą do tablicy?

Chyba koniecznie.

Wczytywanie z pamięci jest szybsze niż z pliku.

W tablicy (lub w jakimś obiekcie, nie wiem jak to dokładnie działa) trzymasz dane dotyczące tekstury, wsp wierzchołków (ew x,y wys szer.), i jeszcze najlepiej typ obiektu (czy jest solidny, przedmiotem, czy też jakimś elementem w który można wejść i pełni on tylko funkcję wizualną.) oraz innych przydatnych informacji. Robiąc tak mógłbyś przy kolizjach korzystać z tego zamiast oddzielnej tablicy z kolizjami (takiej jak napisałem wyżej)

Opublikowano

Chodzi o metodę getpixel(), czy np. int tab[10][10]={plansza} I domyślam się, że to drugie :) I przypuśćmy, że nasze kafelki są 40x40, wtedy wyświetlamy tak?

for(int x=0;x<10;x++) {
	  for(int y=0;y<10;y++) {
		    if(plansza[y][x]==1) rysuj(1);
	  }
}

Opublikowano

Czy wg. Twojego kodu musisz rysować pojedyncze bloczki, których x,y i inne potrzebne są podawane przez parametry do funkcji rysuj().

Możesz dać, że jeśli == 0 to rysuje na kolor tła. (tylko przy czyszczeniu linii bo inaczej nie ma potrzeby)

 

Postaraj się pisać jaśniej, bo to musiałem przeczytać 30 razy zanim skumałem o co chodzi ;d

Choć możliwe, że i tak źle zrozumiałem Twoje przesłanie.

Opublikowano

Moim kodem się nie przejmuj... Odwaliłem to tak jak w easykoderze :P Ale to robiłem dla picu... Jak będę następny raz robić, to zrobię jak napisałem. A funkcji 'rysuj' nie mam, tylko dałem to, podstawiając funkcję obojętnie jakiej biblioteki graficznej, a 1, to parametry np. ziemii, np:

masked_blit( ziemiaplatf, ziemia, 0,0, x, y, ziemiaplatf->w, ziemiaplatf->h); // w tamtym poście chodziło o tą funkcje, a 1 to były te parametry :P Troszeczkę pokomplikowałem

Opublikowano

To w końcu piszesz tetrisa czy to drugie, bo już się pogubiłem ;d.

 

Żadnych kafelków.

Wszystko ma się opierać na obiektach, które mają wyznaczone pozycje i atrybuty, a nie na odwrót (czyli kafelkach, które mają przypisane tekstury itp.)

Ograniczysz w ten sposób ilość zużywanej pamięci (bo ilości bloków na planszy będzie znaczeni mniej niż jakby podzielić planszę na małe klocki 40x40)

Po co robić kafelki skoro masz bardziej doskonałe pixele?

Opublikowano

Nie zrozumiałeś jednak... Mówiłem o Tetrisie, że robię sobie z nim przerwę :P A kafelki - zdjęcia, kafelek = load_bmp("ziemia.bmp", default_palette);... Rysowanie kafelka -> wyświetlanie zdjęcia w aplikacji

//Dobra, nie będę co chwile wrzucać, tylko będę edytować ten link: http://speedy.sh/n2na3/gierka.rar

Opublikowano

A czy istnieje taka biblioteka graficzna, która nie wspiera programowania obiektowego? Pierwszy raz słyszę... A ja nie chcę być fajny, w przeciwieństwie do Ciebie, ale ten post mnie wkurzył po prostu... Najpierw przeczytaj z 5x...

//Pytanko, w allegro jak jest dźwięk, to przy minimalizacji on się tnie... Da się jakoś wykryć minimalizację okna? Patrzyłem na dokumentację i nie znalazłem... Albo jakiś sposób na naprawę tego? Allegro jest tak zbudowane, że robi coś tylko jak nie jest zminimalizowane, z tego co znalazłem. Oraz pytanie, na sposób wejścia jakiś... Np. moje logo, wchodzi od czarnego koloru, do swojego, i się przyciemnia znowu do czarnego

Opublikowano

A czy istnieje taka biblioteka graficzna, która nie wspiera programowania obiektowego? Pierwszy raz słyszę... A ja nie chcę być fajny, w przeciwieństwie do Ciebie, ale ten post mnie wkurzył po prostu... Najpierw przeczytaj z 5x...

 

Zastanówmy się... czyżby Allegro? Nieee, to byłoby zbyt proste...

Ta sygnatura jest pusta.

Opublikowano

Zniżyłes się pizdo do najmniejszego poziomu... Myślisz, że jesteś moderatorem na forum to wszystko możesz? Teraz idź frajerzyć do realnego świata dzieciaczku i odbijaj sobie na forum... Takie pizdy nie powinny się nawet mieszać, to forum jest tak słabo rozwinięte, dlatego że taki debil jak ty daje bany...

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...