Autor Wątek: Algorytm do tetrisa  (Przeczytany 6947 razy)

Offline hibomir

  • Użytkownik

# Lipiec 13, 2006, 12:05:46
Chce napisac sobie tetrisa po tym jak napisalem sneaka, ale juz na poczatku mam problem z ktorym sie juz zetknolem. Mianowicie chodzi o algorytm obracania figur. Wiadomo figury moga miec rozne ksztalty (I,L,T...) i jak je obracac wszystkie za pomoca jednej funkcji. Jak  mozecie dzajcie jakies wskazowki. Z gory dzieki

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mi-ku

  • Użytkownik
    • miku DevBlog

# Lipiec 13, 2006, 12:14:30
Wskazówka:
Wystarczą dwie pętle for (jedna w drugiej) i tymczasowa tablica.

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Lipiec 13, 2006, 12:37:22
Albo zmienna interpretacja indeksów w tablicy :)

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Lipiec 13, 2006, 16:38:29
Obie metody są do kitu, gdyż figury o różnych kształtach obracają się wokół różnych osi, jeśli zmusimy je, by obracały się zawsze wokół tej samej, to będzie to wyglądało w grze nienaturalnie. Najfajniejsze tetrisy wychodzą, jeśli przechowuje się po cztery postacie każdej figury (reprezentujące figurę obróconą o różne kąty) oddzielnie.

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Lipiec 13, 2006, 16:47:10
Nie mogę się zgodzić. O ile dobrze wrysujesz je w kratki to wszystkie metody są ok.

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Lipiec 13, 2006, 16:56:49
Nie są. Próbowałem dosłownie wszystkiego i nie wychodziło. Poskutkował dopiero sposób, który opisałem w poprzednim poście :).

Offline Aklimx

  • Użytkownik
    • NeHe PL::Index

# Lipiec 13, 2006, 17:42:52
a czemu nie mieć siatki klocka tylko w jednej pozycji i '2' oznaczyc os (tu bedzie to punkt) obrotu (przy oznaczeniu: 0-puste, 1-pole klocka, 2-os obrotu)? jezeli nie ma w siatce '2' to nie obracamy, jezeli jest to liczymy obrot wokol tego punktu.

@Shyha: jak chcesz wrysowac nastepujace klocki

   1
 111

             oraz

 11
 11

          tak zeby obracanie bylo zawsze poprawne?
« Ostatnia zmiana: Lipiec 13, 2006, 17:48:37 wysłana przez Aklimx »

Offline fofoo

  • Użytkownik
    • WebLog

# Lipiec 13, 2006, 23:35:31
Można też robić tak:

oldCenter = klocek.center
klocek.rotate(90)
klocek.center = oldCenter

Pomysł polega na tym, że każdy klocek ma ustalone który 'punkt' jest jego środkiem. Jeśli podczas obrotu srodek zmieni swoje położenie, to my nawracamy ten klocek na odpowednią poyzje. Pozdrawiam.

Offline dx0ne

  • Użytkownik
    • Pierdoły od dx0ne'a

# Lipiec 13, 2006, 23:53:54
Mozna rowniez przyjac stala wielkosc matrycy i obracac całą matryce co jest proste oraz dla wszystkich jednakowe.

Offline nameczanin

  • Użytkownik
    • devlog

# Lipiec 14, 2006, 01:23:56
jezeli chodzi o dynamiczne wyliczanie, to najlepszy - moim zdaniem - ten sposob ze srodkiem figury. Z drugiej jednak strony - szybciej chyba nawet stworzyc sobie samemu tablice. Tetris to zbyt mala gra na kombinowanie, chyba ze "sztuka dla samej sztuki" i pocwiczenia samej algorytmiki.

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Lipiec 14, 2006, 09:58:44
Miałem na myśli to co powiedział dxOne.
Raz robiłem tetrisa (nawet gdzieś kod mam) ale nie pamiętam jak tam zrobiłem (będę musiał go znaleźć) ale było albo narysowane wszystkie wersje, albo tradycyjne obracanie. Z całą pewnością miałem stały rozmiar maski dla wszystkich klocków (chyba 4x4). Na pewno najprościej sobie je wszystkie wyrysować :)

Offline Aklimx

  • Użytkownik
    • NeHe PL::Index

# Lipiec 14, 2006, 16:30:38
jak mi ktoś pokaże, że można tak wrysować wcześniej wymienione przeze mnie klocki w stałą maskę, żeby wynik był poprawny to uwierzę.

IMHO: zmienna maska (4x4, 5x5) lub os obrotu musi byc... liczę, że ktoś wyprowadzi mnie z błędu

Offline nameczanin

  • Użytkownik
    • devlog

# Lipiec 14, 2006, 17:44:47
IMHO: zmienna maska (4x4, 5x5) lub os obrotu musi byc... liczę, że ktoś wyprowadzi mnie z błędu
Zalezy - jak chcemy uzywac maski rowniez do kolizji, to w twoich oczach rzeczywiscie widze problem. Jezeli tylko do rysowania, to jaki trud?

Moze i mnie ktos poprawi, bo jak pisalem w innym topicu - chory jestem dzis :E.
Pozdr.

Offline Aklimx

  • Użytkownik
    • NeHe PL::Index

# Lipiec 14, 2006, 20:42:26
@nameczanin: co za różnica czy maska będzie o stałym rozmiarze czy nie? nie widze wpływu na algorytm wykrywania kolizji (rozmiar siatki jest znany, więc no problem)

Offline Koshmaar

  • Użytkownik
    • Homepage

# Lipiec 15, 2006, 00:01:22
Ja u siebie to zrobiłem w ten sposób: mam tylko jeden wzorek dla każdego klocka, a po normalnym obrocie przesuwam całość w lewo tyle razy ile trzeba aby uniknąć tej sytuacji:

 // 0011
 // 0011
 // 0000
 // 0000

a następnie tyle razy do góry ile trzeba aby uniknąć tego:

 // 0000
 // 0000
 // 0000
 // 1111

Co prawda kod jest namotany, ale działa - a i jako ćwiczenie algorytmiczne przydało się :-)