Кoгда у меня не получаются сложные большие алгоритмы, я по одной добавляю строки в простые игры, и вот ... за 2 месяца - вторая игрушка. Правда последние выходные и эту пятницу я посвятил только ей - увлёкся. (опять под Кварк)
Логический форт-лабиринт. Форт - потому, что присутствуют стеки - возвратов и данных. В общем - поле из квадратиков
, на нем - цифры и логические или арифм. операции, выделен квадратик с вопросом, ходы - стрелками, при переходе на квадратик выполняется операция, которая на нем изображена, если число - оно кладётся на стек данных, если он не заполнен. Глубина обоих стеков - 8.
Со стека данных можно поместить число на стек возвратов и обратно
PАGEUP PAGEDOWN.
Квадратики раскрашены - в шахматном или ином порядке и стек возвратов не может быть заполнен при смене цвета - только при переходе между одноцветными полями. Задача игры - достигнуть поля со смайликом :
)) с пустым стеком возвратов и нулём на верху стека данных. Без нуля или с заполненным стеком возвратов не пустит
Понятно, что игрушка иммитирует форт в некоторой степени и подойдёт для обучения форту. Зрелый фортер может проверить, насколько виртуозно его стековое и логическое мышление. Лабиринт - потому, что решение не так просто: есть тупики и безвыходные ситуации.
Возможны 3 цвета квадратиков. При прохождении квадратика, он приобретает один из 3 оттенков серого цвета, повторно пройти квадратик невозможно, он недоступен, также при невозможном ходе подаётся сигнал.
Есть возврат хода. Из-за того, что в Кварке почему-то нет векторного слова
backspaсeэто клавиши F10 F11 F12 - иммитируют широкий бекспейс. ходить обратно можно небесконечно, а до 3 раз - после первого раза на квадрате появляется крохотный залёный маркер, после второго - жёлтый, после третьего - красный "Всё - вперёд пройдёшь, а обратно не пропущу "
после загрузки нужно нажать клавишу F2 - "старт такой же игры (нулевой, если такой же не было)" стартовая игра 4х4
доступно пока ещё 2 игры ( 6х6 и 8х8) игры меняются циклически по F3
Стартовую позицию нужно придумывать, т.к. рандомизация создаёт или бессмысленно лёгкие или невыполнимые стартовые позиции
(см. следующее сообщение)Код:
" user32.dll" LOADLIBRARY " MessageBeep" GETPROCADDRESS VALUE MessageBeep_API
: ERROR_POS 16 MessageBeep_API
API1 DROP ;
: END_SUCCESS 0 MessageBeep_API
API1 DROP ;
-1 VALUE game?_value
: game? game?_value ;
HERE 32 CELLS ALLOT VALUE VSTACK
0 VALUE VSTACK_P
0 VALUE VSTACK_ERR
: >VS \ ( n --> )
\ поместить на стек
VSTACK_P 8 = IF 1 TO VSTACK_ERR ELSE VSTACK_P DUP 1 + TO VSTACK_P CELLS VSTACK + ! THEN
;
: VS> \ ( --> n )
\ снять со стека
VSTACK_P 0 = IF -1 TO VSTACK_ERR ELSE VSTACK_P 1 - DUP TO VSTACK_P CELLS VSTACK + @ THEN
;
: VSDEPTH VSTACK_P ;
: GET_VSTACK_ERR VSTACK_ERR 0 TO VSTACK_ERR ;
HERE 32 CELLS ALLOT VALUE VRSTACK
0 VALUE VRSTACK_P
0 VALUE VRSTACK_ERR
: >VRS \ ( n --> )
\ поместить на стек
VRSTACK_P 8 = IF 1 TO VRSTACK_ERR ELSE VRSTACK_P DUP 1 + TO VRSTACK_P CELLS VRSTACK + ! THEN
;
: VRS> \ ( --> n )
\ снять со стека
VRSTACK_P 0 = IF -1 TO VRSTACK_ERR ELSE VRSTACK_P 1 - DUP TO VRSTACK_P CELLS VRSTACK + @ THEN
;
: VRSDEPTH VRSTACK_P ;
: GET_VRSTACK_ERR VRSTACK_ERR 0 TO VRSTACK_ERR ;
\ 4 colors
10 10 250 RGB VALUE _RED 50 120 250 RGB VALUE _ORANGE
110 110 112 RGB VALUE _GRAY 250 250 10 RGB VALUE _LIGHTBLUE
10 250 250 RGB VALUE _YELLOW 70 250 70 RGB VALUE _GREEN
255 255 255 RGB VALUE _WHITE 40 40 40 RGB VALUE NEAR_BLACK
255 0 255 RGB VALUE _MAGENTA 173 171 172 RGB VALUE _LIGHTGRAY
218 218 211 RGB VALUE _VERYLIGHTGRAY2 218 218 211 RGB VALUE _VERYLIGHTGRAY
0 VALUE _BLACK
1 VALUE NUMBER_GREEN
2 VALUE NUMBER_YELLOW
3 VALUE NUMBER_RED
4 VALUE NUMBER_LIGHTBLUE
5 VALUE NUMBER_ORANGE
6 VALUE NUMBER_MAGENTA
7 VALUE NUMBER__VERYLIGHTGRAY2
8 VALUE NUMBER_GRAY
9 VALUE NUMBER_LIGHTGRAY
10 VALUE NUMBER_VERYLIGHTGRAY
11 VALUE NUMBER_WHITE
12 VALUE NUMBER_BLACK
: color... \ ( number --> color )
CASE
0 OF _BLACK ENDOF
NUMBER_GREEN OF GREEN ENDOF
NUMBER_RED OF _RED ENDOF
NUMBER_LIGHTBLUE OF _LIGHTBLUE ENDOF
NUMBER_YELLOW OF _YELLOW ENDOF
NUMBER_GRAY OF _GRAY ENDOF
NUMBER_LIGHTGRAY OF _LIGHTGRAY ENDOF
NUMBER_WHITE OF _WHITE ENDOF
NUMBER_BLACK OF NEAR_BLACK ENDOF
NUMBER_ORANGE OF _ORANGE ENDOF
NUMBER_MAGENTA OF _MAGENTA ENDOF
NUMBER__VERYLIGHTGRAY2 OF _VERYLIGHTGRAY ENDOF
NUMBER_VERYLIGHTGRAY OF _VERYLIGHTGRAY ENDOF
ENDCASE
;
100 VALUE coord_start_X \ coordinates of game-board
170 VALUE coord_start_Y
0 VALUE potential_direction
4 VALUE board_size.tiny
6 VALUE board_size.small
8 VALUE board_size.medium
10 VALUE board_size.large
12 VALUE board_size.huge
board_size.tiny VALUE board_size
board_size 1 - VALUE last_selected_y
0 VALUE last_selected_x
48 VALUE sq_size_ \ size of square
0 VALUE stack_X
0 VALUE ret_X
: stack_X()
coord_start_X sq_size_ board_size * 30 + + TO stack_X
;
: ret_X()
coord_start_X sq_size_ board_size * 130 + + TO ret_X
;
stack_X() ret_X()
: show_stack _YELLOW SETCOLOR
stack_X coord_start_Y TEXTXY " DATA STACK"
PRINT
9 1 DO
stack_X I 20 * 34 + coord_start_Y +
OVER OVER TEXTXY " " PRINT TEXTXY
I 1 -
DUP VSDEPTH <
IF CELLS VSTACK + @ .
ELSE DROP
THEN
LOOP
GREEN SETCOLOR
ret_X coord_start_Y TEXTXY " RETURN STACK"
PRINT
9 1 DO
ret_X I 20 * 34 + coord_start_Y +
OVER OVER TEXTXY " " PRINT TEXTXY
I 1 -
DUP VRSDEPTH <
IF CELLS VRSTACK + @ .
ELSE DROP
THEN
LOOP
;
: VS_ERR_PRINT
_RED SETCOLOR 0 > IF
stack_X coord_start_Y 194 + TEXTXY " OVERFLOW " PRINT
ELSE
stack_X coord_start_Y 54 + TEXTXY " UNDERFLOW " PRINT
THEN ;
: VRS_ERR_PRINT
_RED SETCOLOR 0 > IF
ret_X coord_start_Y 194 + TEXTXY " OVERFLOW " PRINT
ELSE
ret_X coord_start_Y 54 + TEXTXY " UNDERFLOW " PRINT
THEN ;
: TO_RET
VS> GET_VSTACK_ERR
DUP
IF ERROR_POS VS_ERR_PRINT
ELSE
DROP >VRS
GET_VRSTACK_ERR
DUP
IF ERROR_POS VRS_ERR_PRINT >VS
ELSE DROP show_stack
THEN
THEN
;
' TO_RET TO K_PGUP
: FROM_RET
VRS> GET_VRSTACK_ERR
DUP
IF ERROR_POS VRS_ERR_PRINT
ELSE
DROP >VS
GET_VSTACK_ERR
DUP
IF ERROR_POS VS_ERR_PRINT >VRS
ELSE DROP show_stack
THEN
THEN
;
' FROM_RET TO K_PGDOWN
0 VALUE square_tick.tickness
0 VALUE square_tick.size
0 VALUE square_tick.color
: square_tick \ ( X Y color size tick --> )
TO square_tick.tickness TO square_tick.size
TO square_tick.color
\ (presently: X Y )
OVER OVER square_tick.size +
square_tick.tickness 0 DO OVER OVER I - square_tick.size square_tick.color HLINE LOOP
DROP square_tick.size + OVER
square_tick.tickness 0 DO OVER I - OVER square_tick.size square_tick.color VLINE LOOP
DROP DROP
square_tick.tickness 0 DO OVER I + OVER square_tick.size square_tick.color VLINE LOOP
square_tick.tickness 0 DO OVER OVER I + square_tick.size square_tick.color HLINE LOOP
DROP DROP
;
CREATE ARR 32 CELLS ALLOT
: elementes... SWAP CELLS ARR + ! ;
1 1 VALUE _? " ?" elementes...
2 2 VALUE _NOT " NOT" elementes...
4 4 VALUE _INVerse " INV" elementes...
5 5 VALUE _OR " OR" elementes...
3 3 VALUE _XOR " XOR" elementes...
6 6 VALUE _AND " AND" elementes...
8 8 VALUE _DUP " DUP" elementes...
7 7 VALUE _+ " + " elementes...
9 9 VALUE _- " - " elementes...
10 10 VALUE _* " * " elementes...
11 11 VALUE _/ " / " elementes...
12 12 VALUE _<> " <> " elementes...
13 13 VALUE _< " < " elementes...
14 14 VALUE _> " > " elementes...
15 15 VALUE _= " = " elementes...
16 16 VALUE _ROT " ROT" elementes...
17 17 VALUE _:)) " :))" elementes...
17 VALUE elementes_all
: do_? -1 ;
: do_NOT VSDEPTH 1 < IF 0 ELSE VS> NOT >VS -1 THEN ;
: do_INVerse VSDEPTH 1 < IF 0 ELSE VS> -1 XOR >VS -1 THEN ;
: do_OR VSDEPTH 2 < IF 0 ELSE VS> VS> OR >VS -1 THEN ;
: do_XOR VSDEPTH 2 < IF 0 ELSE VS> VS> XOR >VS -1 THEN ;
: do_AND VSDEPTH 2 < IF 0 ELSE VS> VS> AND >VS -1 THEN ;
: do_DUP VSDEPTH 7 > IF 0 ELSE VS> DUP >VS >VS -1 THEN ;
: do_+ VSDEPTH 2 < IF 0 ELSE VS> VS> + >VS -1 THEN ;
: do_- VSDEPTH 2 < IF 0 ELSE VS> VS> SWAP - >VS -1 THEN ;
: do_* VSDEPTH 2 < IF 0 ELSE VS> VS> * >VS -1 THEN ;
: do_/ VSDEPTH 2 < VS> DUP >VS 0 = OR IF 0 ELSE VS> VS> SWAP / >VS -1 THEN ;
: do_<> VSDEPTH 2 < IF 0 ELSE VS> VS> = NOT >VS -1 THEN ;
: do_< VSDEPTH 2 < IF 0 ELSE VS> VS> SWAP < >VS -1 THEN ;
: do_> VSDEPTH 2 < IF 0 ELSE VS> VS> SWAP > >VS -1 THEN ;
: do_= VSDEPTH 2 < IF 0 ELSE VS> VS> = >VS -1 THEN ;
: do_ROT VSDEPTH 3 < IF 0 ELSE VS> VS> VS> SWAP >VS SWAP >VS >VS -1 THEN ;
: do_:)) VRSTACK_P 0 = VSTACK_P 0 > AND VS> 0 = AND IF END_SUCCESS 0 TO game?_value -1 ELSE 0 THEN ;
: element_execute
CASE
_? OF do_? ENDOF
_NOT OF do_NOT ENDOF
_INVerse OF do_INVerse ENDOF
_OR OF do_OR ENDOF
_XOR OF do_XOR ENDOF
_AND OF do_AND ENDOF
_DUP OF do_DUP ENDOF
_+ OF do_+ ENDOF
_- OF do_- ENDOF
_* OF do_* ENDOF
_/ OF do_/ ENDOF
_<> OF do_<> ENDOF
_< OF do_< ENDOF
_> OF do_> ENDOF
_= OF do_= ENDOF
_ROT OF do_ROT ENDOF
_:)) OF do_:)) ENDOF
ENDCASE
;
\ board
HERE 144 CELLS ALLOT VALUE PATH_VECT 0 VALUE PATH_VECT_point
HERE 144 CELLS ALLOT VALUE PATH_BOARD
HERE 144 CELLS ALLOT VALUE GAME_BOARD
HERE 144 CELLS ALLOT VALUE COLOR_BOARD
HERE 144 CELLS ALLOT VALUE VALUES_RESULTS
HERE 576 CELLS ALLOT VALUE REVERSE_BOARD
HERE 4096 CELLS ALLOT VALUE DATASTACK_
HERE 4096 CELLS ALLOT VALUE RETSTACK_
: BOARD_ 0 PATH_BOARD 144 FILL 0 REVERSE_BOARD 144 FILL ;
: PATH_BOARD_add 4 last_selected_x last_selected_y board_size * + CELLS PATH_BOARD + !
;
: PATH_BOARD_away 0 SWAP CELLS PATH_BOARD + !
;
: PATH_VECT_add PATH_VECT_point DUP CELLS PATH_VECT + potential_direction SWAP !
1 + TO PATH_VECT_point
;
: PATH_VECT_add_from_stack PATH_VECT_point DUP 1 + TO PATH_VECT_point
CELLS PATH_VECT + !
;
: PATH_VECT_away PATH_VECT_point 1 - DUP CELLS PATH_VECT + @ SWAP
TO PATH_VECT_point
;
: stacks_store.copy_data \ ( address - )
CELLS 9 * 8 0 DO DUP I CELLS + DATASTACK_ + I CELLS VSTACK + @ SWAP ! LOOP
8 CELLS + DATASTACK_ + VSTACK_P SWAP !
;
: stacks_store.copy_ret \ ( address - )
CELLS 9 * 8 0 DO DUP I CELLS + RETSTACK_ + I CELLS VRSTACK + @ SWAP ! LOOP
8 CELLS + RETSTACK_ + VRSTACK_P SWAP !
;
: stacks_store
DUP stacks_store.copy_data
stacks_store.copy_ret
;
: stacks_cansel.copy_data \ ( address - )
CELLS 9 * 8 0 DO DUP I CELLS + DATASTACK_ + @ I CELLS VSTACK + ! LOOP
8 CELLS + DATASTACK_ + @ TO VSTACK_P
;
: stacks_cansel.copy_ret \ ( address - )
CELLS 9 * 8 0 DO DUP I CELLS + RETSTACK_ + @ I CELLS VRSTACK + ! LOOP
8 CELLS + RETSTACK_ + @ TO VRSTACK_P
;
: stacks_cansel
DUP stacks_cansel.copy_data
stacks_cansel.copy_ret
;
36 VALUE show_boards.color_size \ размер цвета поля (или поля цвета )
5 VALUE show_boards.color_tick \ толщина поля цвета
7 VALUE show_boards.color_shift \ сдвиг поля цвета
42 VALUE show_boards.pos_size \ размер квадратика. обозн. позицию
4 VALUE show_boards.pos_shift \ сдвиг квадратика. обозн. позицию
5 VALUE show_boards.pos_tick \ толщина квадратика. обозн. позицию
9 VALUE show_boards.mark_size \ размер маркера возврата (допустимость бэк...)
5 VALUE show_boards.mark_tick \ толщина маркера возврата (допустимость бэк...)
30 VALUE show_boards.mark_shift \ сдвиг маркера возврата
14 VALUE show_boards.text_shift
: color_board
12 0 DO
12 0 DO
J board_size * I + CELLS COLOR_BOARD +
I 2 / 2 MOD 0 = J 2 / 2 MOD 0 = XOR IF NUMBER_LIGHTBLUE ELSE NUMBER_ORANGE THEN SWAP !
LOOP
LOOP
NUMBER_RED board_size 1 - CELLS COLOR_BOARD + !
NUMBER_RED board_size DUP 1 - * CELLS COLOR_BOARD + !
;
color_board
0 VALUE show_board.temp
: last_selected_abs last_selected_y board_size * last_selected_x + CELLS ;
: show_board \ ( -- )
\ доску
board_size 0
DO
board_size 0
DO
sq_size_ I * coord_start_X + sq_size_ J * coord_start_Y +
OVER OVER \ серый квадрат
2 + SWAP 2 + SWAP
_GRAY sq_size_ 2 - 2 square_tick
OVER show_boards.text_shift + OVER show_boards.text_shift +
J board_size * I + CELLS COLOR_BOARD + @
J board_size * I + CELLS PATH_BOARD + @ +
color...
SETCOLOR
TEXTXY J board_size * I + CELLS GAME_BOARD + @
DUP ABS 256 >
IF DUP 0 < IF -1 * 255 AND -1 * ELSE 255 AND THEN .
ELSE CELLS ARR + @ PRINT
THEN
OVER show_boards.color_shift + OVER show_boards.color_shift +
J board_size * I + CELLS COLOR_BOARD + @
J board_size * I + CELLS PATH_BOARD + @ +
color...
show_boards.color_size show_boards.color_tick
square_tick
J board_size * I + CELLS REVERSE_BOARD + @
DUP 0 = IF DROP DROP DROP ELSE TO show_board.temp
OVER show_boards.mark_shift + 2 + OVER show_boards.mark_shift + 2 +
show_board.temp
color...
show_boards.mark_size 2 - show_boards.mark_tick square_tick
SWAP show_boards.mark_shift + SWAP show_boards.mark_shift +
0
show_boards.mark_size 2 square_tick
THEN
LOOP
LOOP
sq_size_ last_selected_x * coord_start_X + sq_size_ last_selected_y * coord_start_Y +
SWAP show_boards.pos_shift + SWAP show_boards.pos_shift +
_WHITE
show_boards.pos_size show_boards.pos_tick square_tick
show_stack
;
: startxy
board_size 1 - TO last_selected_y
0 TO last_selected_x
;
: clear_two
last_selected_x sq_size_ * coord_start_X + sq_size_ last_selected_y * coord_start_Y +
_BLACK sq_size_ DUP 2 / square_tick
sq_size_ * coord_start_Y + SWAP sq_size_ * coord_start_X + SWAP
_BLACK sq_size_ DUP 2 / square_tick
;
: possibility_before
OVER OVER board_size * + CELLS DUP
PATH_BOARD + @ 0 = SWAP
COLOR_BOARD + @ last_selected_x
last_selected_y board_size * + CELLS COLOR_BOARD + @ =
VRSDEPTH 0 = OR AND
;
: step_to_do
last_selected_x last_selected_y board_size * + stacks_store
OVER OVER board_size * + CELLS GAME_BOARD + @
DUP ABS 256 >
IF DUP 0 < IF -1 * 255 AND -1 * ELSE 255 AND THEN >VS
GET_VSTACK_ERR DUP IF VS_ERR_PRINT 0 ELSE DROP -1 THEN
ELSE element_execute
THEN
;
: game_step
TO potential_direction
possibility_before
IF step_to_do
IF PATH_BOARD_add PATH_VECT_add
OVER OVER
clear_two TO last_selected_y TO last_selected_x show_board
ELSE ERROR_POS DROP DROP
THEN
ELSE ERROR_POS DROP DROP
THEN
;
: _right
game?
IF last_selected_x board_size 1 - < IF last_selected_x 1 + last_selected_y 2 game_step ELSE ERROR_POS THEN
THEN
;
' _right TO K_RIGHT
: _left
game?
IF last_selected_x 0 > IF last_selected_x 1 - last_selected_y 4 game_step ELSE ERROR_POS THEN THEN
;
' _left TO K_LEFT
: _up
game?
IF last_selected_y 0 > IF last_selected_x last_selected_y 1 - 1 game_step ELSE ERROR_POS THEN
THEN
;
' _up TO K_UP
: _down
game?
IF last_selected_y board_size 1 - < IF last_selected_x last_selected_y 1 + 3 game_step ELSE ERROR_POS THEN
THEN
;
' _down TO K_DOWN
: back_move
PATH_VECT_point 0 >
game? AND
IF
PATH_VECT_away DUP
CASE
1 OF last_selected_x last_selected_y 1 + ENDOF
2 OF last_selected_x 1 - last_selected_y ENDOF
3 OF last_selected_x last_selected_y 1 - ENDOF
4 OF last_selected_x 1 + last_selected_y ENDOF
ENDCASE
OVER OVER board_size * + CELLS REVERSE_BOARD + DUP @
NUMBER_RED =
IF
ERROR_POS DROP DROP DROP PATH_VECT_add_from_stack
ELSE
DUP @ 1 + SWAP ! OVER OVER board_size * + PATH_BOARD_away
OVER OVER board_size * + stacks_cansel
OVER OVER clear_two
TO last_selected_y TO last_selected_x DROP
show_board
THEN
ELSE ERROR_POS THEN
;
' back_move DUP DUP TO K_F10 TO K_F11 TO K_F12
\ GAME BEGIN начало игры и т.п. загрузка новых игр по пути наименьшего сопротивления
0 VALUE game_map.index 0 VALUE game_map.err 0 VALUE game_map.non
: E,EXEM DROP -1 TO game_map.err ;
: E,EM game_map.err IF DROP ELSE TO game_map.err THEN ;
: N,EM game_map.non IF DROP ELSE TO game_map.non THEN ;
: E,? game_map.index DUP board_size DUP * >
IF E,EXEM ELSE DUP 1 + TO game_map.index CELLS GAME_BOARD + ! THEN ;
: E, DUP elementes_all > OVER 1 < OR IF E,EM ELSE E,? THEN ;
: N,? DUP 0 < IF -512 + ELSE 512 + THEN E,? ;
: N, DUP ABS 99 > IF N,EM ELSE N,? THEN ;
\ массив доступных игр
HERE 8 2 * CELLS ALLOT VALUE available_games
0 VALUE available_games_point
\ 2 CELLS - строка описания игры и адрес слова-загрузчика, которое содержит (загружает) данные
: available_games.to \ ( xt c-addr -- success number )
available_games_point 14 >
IF
" слишком много элементов для available_games " PRINT 0
ELSE
available_games_point CELLS available_games + !
available_games_point 1 + CELLS available_games + ! -1
available_games_point DUP 2 + TO available_games_point
THEN
;
\ игра должна определеяться словом ????
\ : ???? ['] game_description " game verbal description " available_games.to ; ????
: example_4
board_size.tiny TO board_size
color_board \ стандарт, или можно определить своё
startxy \ стандарт, или можно определить своё
\ доска
_XOR E, -3 N, _INVerse E, _:)) E,
_* E, _OR E, _XOR E, _+ E,
_= E, _> E, _INVerse E, 3 N,
_? E, _- E, _- E, _AND E,
\ стек так и выглядит
7 >VS
6 >VS
4 >VS
2 >VS
1 >VS
-1 >VS
;
: example_4_des ['] example_4 " простой пример маленькой игры - минимум 3 решения "
available_games.to ;
example_4_des DROP DROP
\ end example game description
VECT game.map 0 VALUE game.descr
0 VALUE game.last
0 VALUE game.lastp
: new_game \ ( number -- )
DUP 12 > OVER 1 + CELLS available_games + @ 0 = OR
IF " ненормальный номер игры " PRINT DROP
ELSE
DUP TO game.lastp DUP
CELLS available_games + @ TO game.descr 1 + CELLS available_games + @ TO game.map
0 TO game_map.index 0 TO game_map.err 0 TO game_map.non
0 TO VSTACK_P 0 TO VRSTACK_P
game.map
game_map.err game_map.non OR
last_selected_x last_selected_y board_size * + CELLS GAME_BOARD + @ _? = NOT OR
0 = IF
game.lastp TO game.last \ потенциальный номер игры в реально послед.
stack_X() ret_X()
BOARD_
0 TO PATH_VECT_point
CLS show_board coord_start_X coord_start_Y 28 - TEXTXY _LIGHTGRAY SETCOLOR game.descr PRINT
-1 TO game?_value
ELSE
CLS
0 TO game?_value
show_board
coord_start_X coord_start_Y 28 - TEXTXY
" невозможно загрузить игру: ошибка в расположении элементов либо начальной позиции" PRINT
THEN
THEN
;
: game_cycle game.last 2 +
DUP
14 > OVER CELLS available_games + @ 0 = OR IF DROP 0 THEN
DUP
CELLS available_games + @ 0 = IF 160 90 TEXTXY " No available games " PRINT DROP ELSE new_game THEN
;
' game_cycle TO K_F3
: game_again
game.last DUP
CELLS available_games + @ 0 =
IF 160 90 TEXTXY " No available games " PRINT DROP ELSE new_game THEN
;
' game_again TO K_F2
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
: example_6a
board_size.small TO board_size
color_board \ стандарт
startxy \ стандарт
\ доска
4 N, _- E, _INVerse E, 4 N, _<> E, _:)) E,
_ROT E, 4 N, _+ E, _- E, _OR E, _+ E,
6 N, -3 N, _DUP E, 3 N, _+ E, 1 N,
_/ E, _OR N, _+ E, 4 N, 2 N, _/ E,
4 N, -3 N, 9 N, _NOT E, 4 N, _<> E,
_? E, 4 N, _* E, _AND E, 4 N, 4 N,
\ стек
1 >VS
2 >VS
3 >VS
4 >VS
4 >VS
4 >VS
;
: example_6a_des ['] example_6a " также простой пример игры 6х6 - обнаружено минимум 2 решений " available_games.to ;
example_6a_des DROP DROP
\ -------------------------------------------------------------------------
: startxy8e
board_size 2 - TO last_selected_y
1 TO last_selected_x
;
: color_board8e
8 0 DO
8 0 DO
J board_size * I + CELLS COLOR_BOARD +
I board_size 1 - = J board_size 1 - = OR
I 0 = J 0 = OR
OR IF NUMBER_MAGENTA
ELSE
I 2 / 2 MOD 0 = J 2 / 2 MOD 0 = XOR IF NUMBER_LIGHTBLUE ELSE NUMBER_ORANGE THEN THEN
SWAP !
LOOP
LOOP
NUMBER_RED board_size 1 - CELLS COLOR_BOARD + !
NUMBER_RED board_size DUP 2 - * 1 + CELLS COLOR_BOARD + !
;
: example_8e \ exotic
board_size.medium TO board_size
color_board8e
startxy8e
\ доска
_DUP E, 4 N, 2 N, 5 N, 2 N, 3 N, _<> E, _:)) E,
5 N, _< E, 1 N, 7 N, _< E, _= E, 1 N, _<> E,
_- E, 5 N, _= E, _> E, 3 N, 5 N, _= E, 3 N,
3 N, 7 N, _< E, _= E, 1 N, 7 N, _> E, 2 N,
_- E, _= E, 3 N, 5 N, _= E, _> E, 3 N, _NOT E,
1 N, _< E, 1 N, 7 N, _< E, _= E, 1 N, _DUP E,
_INVerse E, _? E, _> E, _= E, 3 N, 5 N, _> E, 4 N,
2 N, _DUP E, 1 N, 2 N, 4 N, 2 N, 6 N, _ROT E,
\ стек
1 >VS
2 >VS
2 >VS
2 >VS
2 >VS
2 >VS
;
: example_8e_des ['] example_8e " экзотическая игра 8х8 - обнаружено минимум 1 решениe " available_games.to ;
example_8e_des DROP DROP
\ -------------------------------------------------------------------------
КОД ИСПРАВЛЕН 23,00