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

Offline snakeo

  • Użytkownik

# Lipiec 15, 2006, 00:14:07
Albo zmienna interpretacja indeksów w tablicy :)
Mowisz o transponowaniu? Jezeli tak to macierz transponowana macierzy transponowanej jest macierza wyjsciowa, tak wiec maksymalnie w ten sposob mozna uzyskac 2 obroty ;)
Nie są. Próbowałem dosłownie wszystkiego i nie wychodziło. Poskutkował dopiero sposób, który opisałem w poprzednim poście :).
Tez tak robilem jak mowisz i dziala, z zamiana dla 2ch obrotow tylko.
IMHO: zmienna maska (4x4, 5x5) lub os obrotu musi byc... liczę, że ktoś wyprowadzi mnie z błędu
Co do masek, to 4x4 do wiekszosci klockow starczy, do lini, czyli tego 1x4 robilem 5x5.
 Osi obrotu nie musi byc, mozesz obracac wokol jakiegos klocka tj bazowego, sa rozne wersje wiekszosc obraca wokol centralnego, ale mozesz rownie dobrze obracac wokol skrajnego.

A tak wogole, ktos tu pisal ze ma skomplikowany algorytm, hehe dobrze ze mojego nie widzial :)
« Ostatnia zmiana: Lipiec 15, 2006, 00:26:01 wysłana przez snakeomeister »

Offline Mr. Spam

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

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Lipiec 15, 2006, 10:32:07
Albo zmienna interpretacja indeksów w tablicy :)
Mowisz o transponowaniu? Jezeli tak to macierz transponowana macierzy transponowanej jest macierza wyjsciowa, tak wiec maksymalnie w ten sposob mozna uzyskac 2 obroty ;)

Nie. Chodzi o kierunki iteracji (++, +-, -+, --) i już powinno się poobracać ładnie :]  (może jest jeszcze jakiś knif, ale nie mam czasu sprawdzić teraz)

Offline snakeo

  • Użytkownik

# Lipiec 15, 2006, 15:26:05
Albo zmienna interpretacja indeksów w tablicy :)
Mowisz o transponowaniu? Jezeli tak to macierz transponowana macierzy transponowanej jest macierza wyjsciowa, tak wiec maksymalnie w ten sposob mozna uzyskac 2 obroty ;)

Nie. Chodzi o kierunki iteracji (++, +-, -+, --) i już powinno się poobracać ładnie :]  (może jest jeszcze jakiś knif, ale nie mam czasu sprawdzić teraz)

Racja, że też na to nie wpadłem ;) Następnym razem jak będe pisać to pod jave to tak zrobie ;)

Offline MadMax

  • Użytkownik
    • http://mobiledeveloper.cba.pl/

# Lipiec 15, 2006, 17:57:06
Witam

kiedys widzialem tetrisa w midletpascalu - wyglada ok. Kod zrodlowy jest tu : http://www.midletpascal.com/midlets/Tetris.zip

W tym kodzie klocki sa trzymane jako tablica i do obrotu wykonane sa 2 operacje: transpose i mirror.

czyli jak by to rozrysowac to przykladowo obrot w lewo wyglada tak:

1000
1000
1000
1111

transpose :

1111
0001
0001
0001

vertical mirror

0001
0001
0001
1111

kod :

procedure rotateLeft;
var i, j, t: integer;
begin
    { transpose the block }
    for i:=1 to 4 do
        for j:=i to 4 do
        begin
            t := block[i, j];
            block[i, j] := block[j, i];
            block[j, i] := t;
        end;

        { do the vertical mirror transformation }
        for i:=1 to 4 do
        begin
            t := block[i, 1];
            block[i, 1] := block[i, 4];
            block[i, 4] := t;

            t := block[i, 2];
            block[i, 2] := block[i, 3];
            block[i, 3] := t;
        end;

        if not blockPositionValid then rotateRight;
        else redrawGameScreen;
end;

Pozdrawiam,
MadMax.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Lipiec 16, 2006, 21:13:45
Mnie przychodzi do głowy taki pomysł, zaczerpniety z geometrii stosowanej w grafice:

Reprezentować figurę jako zbiór punktów (X, Y). Figura ma określoną pozycję środka, względem której obracamy. Aby obrócić:

1. Przesuwamy wszystkie punkty o (-ŚrodekX, -ŚrodekY) tak, żeby środek znalazł się w (0,0).
2. Obracamy za pomocą algorytmu do transpozycji macierzy (czyli zamiana współrzędnej X z Y) czy czegoś takiego, nie jestem pewien dokładnie... Pozycję środka też obracamy.
3. Wracamy do pozycji prawidłowej dodając do współrzednej każdego klocka (+NowyŚrodekX, +NowyŚrodekY).