Forth
http://fforum.winglion.ru/

[BF] TETRIS
http://fforum.winglion.ru/viewtopic.php?f=16&t=787
Страница 1 из 2

Автор:  forth@km.ru [ Вс июн 03, 2007 19:42 ]
Заголовок сообщения:  [BF] TETRIS

первое реальное приложение для ФортОС (BF), игрушка, графика монохромная для портабельности на разное железо, управление с клавы или джойстика, тоже отображенного на клаву

я уже публиковал на форуме исходник для старой версии движка, нужно только сделать рефакторинг, что-то выкинуть, попытаться упростить код для понимания

Автор:  Hishnik [ Вс июн 03, 2007 20:13 ]
Заголовок сообщения: 

/me вчувствуется в термин "рефакторинг тетриса" :shuffle;

Автор:  вопрос [ Вс июн 03, 2007 20:35 ]
Заголовок сообщения: 

Ну чего там, всё нуно рефакторизовать, даже тетрис, автор имеет право после такой работы.

Автор:  Hishnik [ Вс июн 03, 2007 20:41 ]
Заголовок сообщения: 

Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?

Автор:  in4 [ Пн июн 04, 2007 00:12 ]
Заголовок сообщения: 

Хищник писал(а):
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?

Да, в качестве следующей лабораторной работы... ;)

Автор:  forth@km.ru [ Чт июн 14, 2007 23:00 ]
Заголовок сообщения: 

ну например версия движка (а) -- тупая однозадачка, а версия (б) умеет нити: вот и получается что для (б) лучше раализовать тот же ТЕТРИС в виде нескольких параллельных нитей, код получается понимабельнее, проще и красивше
тот же пример для движка (1) который умеет только точки выводить и (2) 2D с поддержкой векторных примитивов
или версия (йо) с цветными анимашками, свистелками и перделками зачищается и получается симулятор китайского брелка
вполне себе рефакторинг

Автор:  forth@km.ru [ Чт июн 14, 2007 23:02 ]
Заголовок сообщения: 

Код:
10 CONSTANT _w   _w const w      \ ширина стакана
20 CONSTANT _h   _h const h      \ высота стакана

Автор:  forth@km.ru [ Чт июн 14, 2007 23:03 ]
Заголовок сообщения: 

для повышения читабельности кода применил макросы

Код:
: w[h[
\ макрос начала цикла по стакану
   h 0 # ( h 0 ) do
      w 0 # ( w 0 ) do
;


Код:
: ]]
\ макрос конца цикла по 2м координатам
      loop
   loop
;

Автор:  forth@km.ru [ Чт июн 14, 2007 23:08 ]
Заголовок сообщения: 

Код:
_w _h ~* CONSTANT ~poolsz      \ \ размер буфера стакана
~poolsz const poolsz         \ /

Код:
~poolsz buffer pool         \ буфер стакана

Код:
: pool[] ( x y -- offset=y*w+x )
\ пересчет кооржинат в стакане в смещение от начала буфера
   ( y ) w * ( x ) +
;

Код:
{ pool@ ( x y -- value )
\ чтение состояния элемента
   ( x y )    pool[]       \ координаты --> смещение от начала буфера
   ( offset ) pool +       \ смещение --> адрес памяти
   ( addr )   c@          \ элемент стакана кодируется байтом
}

Код:
{ pool! ( value x y -- )
\ запись элемента стакана
   ( x y )          pool[]      \ смещение
   ( offset )     pool +      \ адрес
   ( value addr ) c!      \ запись элемента
}

Автор:  forth@km.ru [ Чт июн 14, 2007 23:12 ]
Заголовок сообщения: 

блин, поползло все форматирование в нотепаде сделанное 8-\

Автор:  forth@km.ru [ Чт июн 14, 2007 23:18 ]
Заголовок сообщения: 

Код:
0 var (c)   : c (c) @ ;      \ размер элемента стакана в пикселах

Код:
: CALCULATE_c ( -- )
\ определение размера элемента в пикселах
\ по размерам экрана и размерам стакана
\ слово вызывается после старта графического драйвера
   gr/Xsz w / ( Xsz/w )
   gr/Ysz h / ( Ysz/h )
          min ( cvalue ) (c) !
;


Если размеры экрана (граф.окна) могут меняться в процессе работы программы, нужно переписать слово c так, чтобы оно проверяло что размеры экрана изменились, и выводило требуемый размер ячейки в зависимости от новых размеров экрана:

Код:
{ c ( -- sz )
\ вариант с отслеживанием динамически меняющегося размера графического окна
\ без кеширования -- движок шустрый, операции деления дешевы, вычисляем с каждый
\ раз заново, не сравнивая предыдущие и текущие значения Xsz Ysz
     gr/Xsz w / ( Xsz/w ) gr/Ysz h / ( Ysz/h ) min ( cvalue )
}

Автор:  forth@km.ru [ Чт июн 14, 2007 23:22 ]
Заголовок сообщения: 

вспомогательные переменные и макросы, используются при отрисовке клеток стакана

Код:
0 var cell/x            \ \ экранные координаты угла элемента
0 var cell/y            \ /

Код:
: x1   cell/x @ ;   : x2   x1 c +     ;
: y1   cell/y @ ;   : y2   y1 c +    ;

Код:
: x[y[
\ макрос заголовка цикла по 2м координатам
   y2 y1 do
      x2 x1 do
;

Автор:  forth@km.ru [ Чт июн 14, 2007 23:24 ]
Заголовок сообщения: 

Код:
{ pool/draw ( x y -- )
\ отрисовка x;y элемента стакана
   over ( x ) c * cell/x !      \ экранная координата X элемента
   dup  ( y ) c * cell/y !      \ экранная координата Y элемента
   ( x y )
   pool@ if         \ чтение состояния элемента стакана
      x[y[ i j gr/set ]]
   else
      x[y[ i j gr/clr ]]
   endif
}

Код:
{ REDRAW ( -- )
\ перерисовка экрана
   w[h[ i j pool/draw ]]      \ цикл отрисовки стакана
}

Автор:  forth@km.ru [ Чт июн 14, 2007 23:26 ]
Заголовок сообщения: 

вот этот ^^^ кусок -- иллюстрация как пользоваться выше определенными макросами
тут главное не переусердствовать, а то получится как тот пример шахмат на Си, написанный целиком на макросах 8-)

Автор:  forth@km.ru [ Чт июн 14, 2007 23:28 ]
Заголовок сообщения: 

Для запуска программы в текущем состоянии нужно слово, которое бы случайно заполняло стакан, чтобы видеть как работает перерисовка (и что она вообще работает). В конечной программе тоже будет аналогичное слово, но заполняться будет только нижняя половина стакана -- при рестарте игры и когда выбито сколько-то линий и становится скушно заполнять стакан почти со дна.
Код:
{ POOLRANDFILL ( -- )
\ слово нужно для демонстрации работы REDRAW
\ выполняется перед перерисовкой экрана, заполняет стакан случайным образом
   w[h[   1 # rnd ( value ) i j pool!   ]]
}

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/