Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт апр 25, 2024 00:09

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Змейка
СообщениеДобавлено: Вт июн 19, 2007 18:54 
Воооот. Сделал ремейк змейки для Кварка. :)
Код:
: 2* SHL ;
: 2/ SHR ;

" kernel32.dll" LOADLIBRARY
" GetTickCount" GETPROCADDRESS CONSTANT 'GetTickCount

: GetTickCount \ ( -- ticks )
'GetTickCount API0 ;

VARIABLE RND

: RANDOMIZE GetTickCount RND ! ;
RANDOMIZE

: SGN \ ( u -- -1 | 0 | 1 )
DUP 0 = IF ELSE
DUP 0 MAX 0 = IF DROP -1 ELSE
DROP 1 THEN THEN ;

: NEGATE \ ( x -- -x )
0 SWAP - ;

: ABS \ ( x -- u )
DUP SGN -1 = IF NEGATE THEN ;


: RANDOM \  ( -- u )
RND @ 69069 * 31415 + 278720333 MOD DUP RND ! ;

: CHOOSE  \ ( u1 -- u2 )
   278720333 SWAP /
   RANDOM ABS SWAP /
;

: DUPS // Arr[1..M] M --> Arr[1..M] Arr[1..M]
DUP 0 DO
  DUP PICK SWAP
LOOP
DROP
;

: DROPS // Arr[1..M] M -->
0 DO DROP LOOP
;

// Графика
: RGB-> // Color --> R G B
65536 /MOD
256 /MOD
ROT ROT SWAP
;

: Gradient // Percent Color1 Color2 --> Color
           // Переход от цвета1 к цвету2
           // Percent - 0..100
SWAP RGB->
3 PICK RGB-> // DS: Percent Color2 R1 G1 B1 R2 G2 B2
3 PICK - 7 PICK * 100 / 3 PICK + 3 XCHG DROP // DS: Percent Color2 R1 G1 Bnew R2 G2
3 PICK - 6 PICK * 100 / 3 PICK + 3 XCHG DROP // DS: Percent Color2 R1 Gnew Bnew R2
3 PICK - 5 PICK * 100 / 3 PICK + 3 XCHG DROP // DS: Percent Color2 Rnew Gnew Bnew
RGB
2 XCHG DROP DROP
;

: FillBox // x y ширина высота цвет -->
3 PICK 2 PICK + 4 PICK DO
  4 PICK I 4 PICK 3 PICK HLINE
LOOP
5 DROPS
;

: GradientBox // x y ширина высота цвет1 цвет2 -->
  4 PICK 3 PICK + 5 PICK DO
  5 PICK I // x i
  5 PICK   // ширина
  OVER 8 PICK - 100 * 6 PICK / // Percent=(i-y)/высота
  5 PICK 5 PICK Gradient // Percent цвет1 цвет2 --> color
  HLINE
LOOP
6 DROPS
;
// Графика кончилась

// Кнопки
: FIELD
CREATE
  OVER , +
DOES>
@ +
;

: int
4 FIELD
;

0
int ->кнХ
int ->кнУ
int ->кнШирина
int ->кнВысота
int ->кнРаботай
int ->кнНадпись
int ->кнЦвет1
int ->кнЦвет2
CONSTANT Кнопка

100 VALUE MaxButtons
QUAN CurButtons
CREATE Buttons[] MaxButtons 4 * ALLOT

: СоздатьКнопку // addr -->
Кнопка ALLOT
25 OVER ->кнХ !
25 OVER ->кнУ !
96 OVER ->кнШирина !
32 OVER ->кнВысота !
0xBFBFBF  OVER ->кнЦвет1 !
0x707070  OVER ->кнЦвет2 !
" Button" OVER ->кнНадпись !
['] NOOP  OVER ->кнРаботай !
CurButtons
  SWAP OVER 4 * Buttons[] + !
1+ TO CurButtons
;

0 CONSTANT обычную
1 CONSTANT подсвеченую
2 CONSTANT нажатую

QUAN кнАдрес
QUAN dbLigth
: КнопкуРисуй // addr Подсвечивать? -->
TO dbLigth
TO кнАдрес

кнАдрес ->кнХ @
кнАдрес ->кнУ @
кнАдрес ->кнШирина @
кнАдрес ->кнВысота @
dbLigth обычную = NOT IF
  0xFFFFFF
ELSE
  50
  кнАдрес ->кнЦвет1 @
  кнАдрес ->кнЦвет2 @
  Gradient
THEN
FillBox

кнАдрес ->кнХ @ 3 +
кнАдрес ->кнУ @ 3 +
кнАдрес ->кнШирина @ 6 -
кнАдрес ->кнВысота @ 6 -
кнАдрес ->кнЦвет1 @
кнАдрес ->кнЦвет2 @
dbLigth нажатую = IF SWAP THEN
GradientBox

// Надпись на кнопке
кнАдрес ->кнХ @ 15 +
кнАдрес ->кнУ @ кнАдрес ->кнВысота @ SHR SHR +
TEXTXY
50 кнАдрес ->кнЦвет1 @ кнАдрес ->кнЦвет2 @ Gradient SETBGCOLOR
0x000000 SETCOLOR
  кнАдрес ->кнНадпись @ PRINT
0x000000 SETBGCOLOR
0x00FF00 SETCOLOR
;

: ПроверитьКнопку // addr --> 0 | -1
TO кнАдрес
0
MOUSE-X @
кнАдрес ->кнХ @ DUP
кнАдрес ->кнШирина @ +
WITHIN IF
  MOUSE-Y @
  кнАдрес ->кнУ @ DUP
  кнАдрес ->кнВысота @ +
  WITHIN IF
   DROP -1
  THEN
THEN
;

: Нажата? // addr -->
DUP ПроверитьКнопку IF
  DUP нажатую КнопкуРисуй
  ->кнРаботай @ EXECUTE
ELSE DROP THEN
;

: Подсветить? // addr -->
DUP ПроверитьКнопку IF
  подсвеченую КнопкуРисуй
ELSE DROP THEN
;

: РисоватьКнопки
CurButtons 0 DO
  Buttons[] I 4 * + @ обычную КнопкуРисуй
LOOP
;

: ЧтоНажато? // -->
CurButtons 0 DO
  Buttons[] I 4 * + @ Нажата?
LOOP
;

: ЧтоПодсветить? // -->
CurButtons 0 DO
  Buttons[] I 4 * + @ Подсветить?
LOOP
;
//  Кнопки кончились

CREATE кнЗаново
кнЗаново DUP СоздатьКнопку
  450 OVER ->кнХ !
  50  OVER ->кнУ !
  " Начать" OVER ->кнНадпись !
  DROP

20 VALUE Ширина
20 VALUE Высота
20 VALUE РазмерКвадрата
CREATE Поле Ширина Высота * ALLOT

: SetПоле // s x y -->
Ширина * + Поле + C!
;

: GetПоле // x y --> s
Ширина * + Поле + C@
;

CREATE ЦветКлетки[] 12 ALLOT
0 CONSTANT Стена RED ЦветКлетки[] !
1 CONSTANT Пусто WHITE ЦветКлетки[] 4 + !
2 CONSTANT Яблоко 0x7FFF ЦветКлетки[] 8 + !

: СоздатьПоле
Высота 0 DO
  Ширина 0 DO
   I Ширина 1- = I 0 = OR
   J Высота 1- = J 0 = OR OR IF Стена ELSE Пусто THEN
   I J SetПоле
  LOOP
LOOP
;

: СтирайПоле
0 0
Ширина РазмерКвадрата * Высота РазмерКвадрата *
0
FillBox
;

: КакойЦвет? // i --> color
4 * ЦветКлетки[] + @
;

: РисуйПоле
Высота 0 DO
  Ширина 0 DO
   I РазмерКвадрата *
   J РазмерКвадрата *
   РазмерКвадрата DUP
   I J GetПоле КакойЦвет?
   FillBox
  LOOP
LOOP
;

50 VALUE MaxLen
CREATE Змея MaxLen 2 * ALLOT
QUAN CurLen
-1 CONSTANT ТутЗмея

QUAN ВзглядЗмеи
0 CONSTANT Вверх
1 CONSTANT Вправо
2 CONSTANT Вниз
3 CONSTANT Влево

: ЗмеяSetXY // x y i -->
2* Змея +
2 PICK OVER C!
1+ C!
DROP
;

: ЗмеяGetXY // i --> x y
2* Змея +
DUP C@
SWAP
1+ C@
;

: УбитьИВозродитьЗмею
MaxLen 0 DO
  -1 DUP I ЗмеяSetXY
LOOP
3 TO CurLen
CurLen 0 DO
  CurLen 2 + I -
  Высота 2/
  I ЗмеяSetXY
LOOP
Вправо TO ВзглядЗмеи
;

: РисуйЗмею
CurLen 0 DO
  I ЗмеяGetXY
  SWAP РазмерКвадрата *
  SWAP РазмерКвадрата *
  РазмерКвадрата DUP
  I 0 = IF 0x00FF00 ELSE 0xFF0000 THEN
  FillBox
LOOP
;

: ГдеГолова? // --> x y
0 ЗмеяGetXY
;

QUAN есть?
: ТутЗмея? // x y --> 0|-1
0 TO есть?
CurLen 0 DO
  2 DUPS
  I ЗмеяGetXY
  ROT =
  ROT ROT = AND IF -1 TO есть? THEN
LOOP
2 DROPS
есть?
;

: КудаСмотрит? // --> dx dy
ВзглядЗмеи Вверх  = IF 0 -1 THEN  // dx dy
ВзглядЗмеи Вправо = IF 1  0 THEN
ВзглядЗмеи Вниз   = IF 0  1 THEN
ВзглядЗмеи Влево  = IF -1 0 THEN
;

: СледующаяКлетка // x y dx dy --> x y
ROT +
ROT ROT +
SWAP
;

: ЧтоТам? // x y --> i
2 DUPS
  ТутЗмея? // x y x y
  IF
   2 DROPS
   ТутЗмея
  ELSE
   GetПоле
  THEN
;

: СоздатьЯблоко // -->
Яблоко
0 0
BEGIN
  2 DROPS
  Ширина CHOOSE Высота CHOOSE
  2 DUPS
ЧтоТам? Пусто = UNTIL
SetПоле
;

: СъестьЯблоко // x y -->
Пусто ROT ROT SetПоле
CurLen 1+ TO CurLen
СоздатьЯблоко
;

: Ползи! // x y -->
CurLen 1 DO
  CurLen I - 1- ЗмеяGetXY
  CurLen I -    ЗмеяSetXY
LOOP
0 ЗмеяSetXY
;

: РисуйВсе
РисуйПоле
РисуйЗмею
;

: GameOver
РазмерКвадрата Ширина * 10 TEXTXY
" GAME OVER!!!" PRINT
['] NOOP TO <TIMER>
;

: развернуться // направление(0..3) -->
DUP ВзглядЗмеи + 2 MOD 0 = IF
  DROP
ELSE
  TO ВзглядЗмеи
THEN
;

: Игра
ГдеГолова?
КудаСмотрит?
СледующаяКлетка 2 DUPS ЧтоТам?
  DUP Стена  =
  OVER ТутЗмея = OR IF GameOver THEN
      Яблоко = IF 2 DUPS СъестьЯблоко THEN
Ползи!
РисуйВсе
;

: Заново
СоздатьПоле
УбитьИВозродитьЗмею
СоздатьЯблоко

РисуйВсе

100 TIMER_INTERVAL !
['] Игра TO <TIMER>
;
' Заново кнЗаново ->кнРаботай !

: Вверх!
Вверх развернуться
;

: Вправо!
Вправо развернуться
;

: Вниз!
Вниз развернуться
;

: Влево!
Влево развернуться
;

CREATE кнВверх
кнВверх DUP СоздатьКнопку
  490 OVER ->кнХ !
  160 OVER ->кнУ !
  32  OVER ->кнШирина !
  " ^" OVER ->кнНадпись !
  ' Вверх! SWAP ->кнРаботай !
' Вверх! TO K_UP

CREATE кнВправо
кнВправо DUP СоздатьКнопку
  530 OVER ->кнХ !
  200  OVER ->кнУ !
  32  OVER ->кнШирина !
  " >" OVER ->кнНадпись !
  ' Вправо! SWAP ->кнРаботай !
' Вправо! TO K_RIGHT

CREATE кнВниз
кнВниз DUP СоздатьКнопку
  490 OVER ->кнХ !
  200  OVER ->кнУ !
  32  OVER ->кнШирина !
  " v" OVER ->кнНадпись !
  ' Вниз! SWAP ->кнРаботай !
' Вниз! TO K_DOWN

CREATE кнВлево
кнВлево DUP СоздатьКнопку
  450 OVER ->кнХ !
  200 OVER ->кнУ !
  32  OVER ->кнШирина !
  " <" OVER ->кнНадпись !
  ' Влево! SWAP ->кнРаботай !
' Влево! TO K_LEFT

: LeftClick
РисоватьКнопки
ЧтоНажато?
;
' LeftClick TO <MOUSE_LEFT>

: MouseMove
РисоватьКнопки
ЧтоПодсветить?
;
' MouseMove TO <MOUSE_MOVE>

CLS
РисоватьКнопки


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB