Вот такой вот квест, из TGE (редактор квестов для Космических рейнджеров).
clrscr
'Узнал царь, что в некотором царстве, тридевятом государстве
растут молодильные яблоки. Решил царь послать трех
своих сыновей за яблоками.
Два старших сына отправились первыми.
Немного погодя отправился и младший сын, Иван.
Ехал на коне Иван до перепутья.
Видит - большой камень посреди дороги лежит.
На камне написано :
"Налево пойдешь - коня потеряешь.
Направо - сам сгинешь.
Прямо пойдешь - и коня потеряешь, и сам сгинешь.".
Расстроился Иван, сел на камень и думает.
Думал-думал, и придумал. Достал он свой трехгранный кубик,
загадал для каждой грани направление и бросил под ноги.
' write
'Выбор' var
1 4 rand 'Выбор' mov
Выбор 4 = 'label0002' jt
'В путь!
' write
'label0001' jmp
:label0002
'Вдруг, откуда ни возьмись…
' write
:label0001
read
Выбор 1 = 'Прямо' jt
Выбор 2 = 'Налево' jt
Выбор 3 = 'Направо' jt
Выбор 4 = 'Василиса' jt
clrscr
:Прямо
clrscr
'Выпало Ивану ехать прямо. Вдруг появился змей
Горыныч. Пока Иван просил змея его не трогать,
конь возьми да и помри со страху.
Змей хотел коня забрать, но не вышло.
Решил он тогда Ивана себе на золотые
прииски в рабство угнать.
Работал Иван у Горыныча три года и три дня.
Выдохся полностью, все здоровье начисто растерял…
' write
read
'Проиграл' jmp
:Налево
clrscr
'Выпало Ивану ехать налево. Вдруг выскочили разбойники,
сбили Ивана с коня, а самого пощадили.
Погоревал он о своем добром коне и отправлися в путь.
' write
read
'Локация2' jmp
:Направо
clrscr
'Выпало Ивану ехать направо. Вдруг выскочили
разбойники, сбили Ивана с коня. Пока Иван
дрался с разбойниками, конь возьми да
и ускачи обратно в царские конюшни.
Разбойники одолели Ивана и решили его
продать в рабство змею Горынычу.
Работал Иван у Горыныча три года и три дня.
Выдохся полностью, все здоровье начисто растерял…
' write
read
'Проиграл' jmp
:Василиса
clrscr
'Появляется Василиса Предудрая,
красна девица, и молвит Ивану:
- Что стоишь, как пень, добрый молодец!
Пришёлся ты мне по сердцу,
хочу за тебя замуж выйти,
а в приданое у меня пара килограммов молодильных яблочек!
Обрадовался тут Иван-царевич неожиданному счастью.
Вернулся домой, женился на Василисе по-быстрому
и стали они поживать, да добра наживать.
А молодильные яблочки отдали царю-батюшке
и прожил он после этого тыщу лет!
' write
read
'конец' jmp
:Локация2
clrscr
'Вот идет Иван через рощу. В роще заяц, попал в капкан.
Просит заяц Ивана человеческим голосом освободить его.
Как Ивану поступить?
1. Убить зайца, съесть и дальше пойти.
2. Помочь несчастной зверюшке.
'write
read
dup '1' = 'Локация3' jt
dup '2' = 'Локация3' jt
'Локация2' jmp
:Локация3
clrscr
'Шел, шел Иван и забрел в тридевятое царство.
Долго ему пришлось стараться, чтобы добыть
молодильные яблоки. Вот возвращается Иван
обратно домой. А тут старшие братья его уже ждут
в засаде. Не смог справиться Иван с братьями,
убили они его и разрубили тело на мелкие кусочки,
а яблоки отобрали и сами решили отнести домой.
' write read
swap
dup '2' = 'Заяцжив' jt
'############################
Да, может стоило все же помочь зайцу?
А то лежит Иван, изрубленный на кусочки
и уже никогда не оживет.
' write
'совсемконец' jmp
:Заяцжив
clrscr
'Не проходит и часа…
' write read
'Прибегает Заяц с мертвой и живой водой. Мертвой оросил
Ивана - стало тело целым. Живой оросил - поднялся
Иван на ноги, отер лоб и промолвил: "Как долго я спал!".
Рассказал ему Заяц о том, что братья сделали.
Разгневался Иван, нагнал братьев,
отобрал яблоки и прочитал им нравоучительную лекцию.' write read
clrscr
'Обрадовался Царь возвращению сыновей,
наелся яблок и закатил пир на весь мир!' write read
'конец' jmp
:Проиграл
'
Сожрал Ивана Горыныч на ужин, так как работать царевич больше не мог.
' write
'совсемконец' jmp
:конец
'Поздравляю!' write
:совсемконец
{2b}
clrscr
'Узнал царь, что в некотором царстве, тридевятом государстве
растут молодильные яблоки. Решил царь послать трех
своих сыновей за яблоками.
Два старших сына отправились первыми.
Немного погодя отправился и младший сын, Иван.
Ехал на коне Иван до перепутья.
Видит - большой камень посреди дороги лежит.
На камне написано :
"Налево пойдешь - коня потеряешь.
Направо - сам сгинешь.
Прямо пойдешь - и коня потеряешь, и сам сгинешь.".
Расстроился Иван, сел на камень и думает.
Думал-думал, и придумал. Достал он свой трехгранный кубик,
загадал для каждой грани направление и бросил под ноги.
' write
'Выбор' var
1 4 rand 'Выбор' mov
Выбор 4 = 'label0002' jt
'В путь!
' write
'label0001' jmp
:label0002
'Вдруг, откуда ни возьмись…
' write
:label0001
read
Выбор 1 = 'Прямо' jt
Выбор 2 = 'Налево' jt
Выбор 3 = 'Направо' jt
Выбор 4 = 'Василиса' jt
clrscr
:Прямо
clrscr
'Выпало Ивану ехать прямо. Вдруг появился змей
Горыныч. Пока Иван просил змея его не трогать,
конь возьми да и помри со страху.
Змей хотел коня забрать, но не вышло.
Решил он тогда Ивана себе на золотые
прииски в рабство угнать.
Работал Иван у Горыныча три года и три дня.
Выдохся полностью, все здоровье начисто растерял…
' write
read
'Проиграл' jmp
:Налево
clrscr
'Выпало Ивану ехать налево. Вдруг выскочили разбойники,
сбили Ивана с коня, а самого пощадили.
Погоревал он о своем добром коне и отправлися в путь.
' write
read
'Локация2' jmp
:Направо
clrscr
'Выпало Ивану ехать направо. Вдруг выскочили
разбойники, сбили Ивана с коня. Пока Иван
дрался с разбойниками, конь возьми да
и ускачи обратно в царские конюшни.
Разбойники одолели Ивана и решили его
продать в рабство змею Горынычу.
Работал Иван у Горыныча три года и три дня.
Выдохся полностью, все здоровье начисто растерял…
' write
read
'Проиграл' jmp
:Василиса
clrscr
'Появляется Василиса Предудрая,
красна девица, и молвит Ивану:
- Что стоишь, как пень, добрый молодец!
Пришёлся ты мне по сердцу,
хочу за тебя замуж выйти,
а в приданое у меня пара килограммов молодильных яблочек!
Обрадовался тут Иван-царевич неожиданному счастью.
Вернулся домой, женился на Василисе по-быстрому
и стали они поживать, да добра наживать.
А молодильные яблочки отдали царю-батюшке
и прожил он после этого тыщу лет!
' write
read
'конец' jmp
:Локация2
clrscr
'Вот идет Иван через рощу. В роще заяц, попал в капкан.
Просит заяц Ивана человеческим голосом освободить его.
Как Ивану поступить?
1. Убить зайца, съесть и дальше пойти.
2. Помочь несчастной зверюшке.
'write
read
dup '1' = 'Локация3' jt
dup '2' = 'Локация3' jt
'Локация2' jmp
:Локация3
clrscr
'Шел, шел Иван и забрел в тридевятое царство.
Долго ему пришлось стараться, чтобы добыть
молодильные яблоки. Вот возвращается Иван
обратно домой. А тут старшие братья его уже ждут
в засаде. Не смог справиться Иван с братьями,
убили они его и разрубили тело на мелкие кусочки,
а яблоки отобрали и сами решили отнести домой.
' write read
swap
dup '2' = 'Заяцжив' jt
'############################
Да, может стоило все же помочь зайцу?
А то лежит Иван, изрубленный на кусочки
и уже никогда не оживет.
' write
'совсемконец' jmp
:Заяцжив
clrscr
'Не проходит и часа…
' write read
'Прибегает Заяц с мертвой и живой водой. Мертвой оросил
Ивана - стало тело целым. Живой оросил - поднялся
Иван на ноги, отер лоб и промолвил: "Как долго я спал!".
Рассказал ему Заяц о том, что братья сделали.
Разгневался Иван, нагнал братьев,
отобрал яблоки и прочитал им нравоучительную лекцию.' write read
clrscr
'Обрадовался Царь возвращению сыновей,
наелся яблок и закатил пир на весь мир!' write read
'конец' jmp
:Проиграл
'
Сожрал Ивана Горыныч на ужин, так как работать царевич больше не мог.
' write
'совсемконец' jmp
И так, что это такое? Это судоку.
Да, не доделал, ибо надоело. Алгоритм (или можете называть это копипастинг) базируется на этом. Если будет желание — доделаю.
ТУДУ лист:
Сделать проверку всего, а не только строк.
Запретить изменение выданных по умолчанию чисел
Рандомизировать заполнение заготовок
Q: В чем смысл игры? A: Необходимо заполнить свободные клетки цифрами от 1 до 9 так, чтобы в каждой строке, в каждом столбце и в каждом малом квадрате 3x3 каждая цифра встречалась бы только один раз. wiki
Q: Как в это играть? A: НомерСтроки НомерСтолбца слитно, после пробела число, которое будем ставить. Пример: 13 9
Q: И нафига? A: Чтобы было.
clrscr
'номерстроки' var 0 'номерстроки' mov
'номерстолбца' var 0 'номерстолбца' mov
'ent' var '
' 'ent' mov
'массивреальногополя' var arr 'массивреальногополя' mov
'массиввидимогополя' var arr 'массиввидимогополя' mov
'заготовкасчислами' var arr 'заготовкасчислами' mov
'массивотправка' var arr 'массивотправка' mov
'суммапроверки' var
'произведениепроверки' var
'победитель' var 0 'победитель' mov
'команда' var
'каунтер' var 0 'каунтер' mov
'заготовка1' var 'hgifeadcbfecdgbaihdbacihgefidbghcfaecahbfeidggfeadihbcecgiafbhdbidhcgefaahfebdcgi' 'заготовка1' mov ;наглый копипастинг.
'заготовка2' var 'ifcdbgeaheadcihbgfhbgafedicbeaghfcdidcieabhfgghfidcaebfdhbgaicecibfedghaagehcifbd' 'заготовка2' mov ;наглый копипастинг.
'заготовка3' var 'bahdfgceiigfchebdaedcbiahgfgbefdcaihhfaiebdcgdcigahfbefigacdehbahdebigfccebhgfiad' 'заготовка3' mov ;наглый копипастинг.
'заготовка4' var 'gefadbhicdcbihgafeaihefcdgbbhadiefcgfgehcabdiidcgbfeahhagcedibfcbifahgedefdbgicha' 'заготовка4' mov ;наглый копипастинг.
'заготовка5' var 'iadchgbfebhgfaecdicefdbiaghhiagebfcddfbicheagegcadfhibgbihfcdeaachegdibffdebiaghc' 'заготовка5' mov ;наглый копипастинг.
'заготовка6' var 'hgacbdefiidbfegachcefihadbggbhdiecafafihcbgdedceagfihbbhceaifgdfigbdcheaeadgfhbic' 'заготовка6' mov ;наглый копипастинг.
;выбираем случайную заготовку
'заготовка' var 'заготовка' 1 6 rand str add val 'заготовка' mov
;получаем шаг
;'шаг' var 0 9 rand 'шаг' mov
;заполняем массив замены букв на цифры
;'массивзамены' var arr 'массивзамены' mov
:циклзаполнениямассивазамены
каунтер заготовка get
dup 'a' = 'заменаA' callt
dup 'b' = 'заменаB' callt
dup 'c' = 'заменаC' callt
dup 'd' = 'заменаD' callt
dup 'e' = 'заменаE' callt
dup 'f' = 'заменаF' callt
dup 'g' = 'заменаG' callt
dup 'h' = 'заменаH' callt
'i' = 'заменаI' callt
каунтер inc 'каунтер' mov
каунтер 82 < 'циклзаполнениямассивазамены' jt
'label100500' jmp
:заменаA
'1' каунтер заготовкасчислами set
ret
:заменаB
'2' каунтер заготовкасчислами set
ret
:заменаC
'3' каунтер заготовкасчислами set
ret
:заменаD
'4' каунтер заготовкасчислами set
ret
:заменаE
'5' каунтер заготовкасчислами set
ret
:заменаF
'6' каунтер заготовкасчислами set
ret
:заменаG
'7' каунтер заготовкасчислами set
ret
:заменаH
'8' каунтер заготовкасчислами set
ret
:заменаI
'9' каунтер заготовкасчислами set
ret
:label100500
;заполняем реальную таблицу числами
1 'номерстроки' mov
0 'номерстолбца' mov
0 'каунтер' mov
:циклзаполнения01
0 'номерстолбца' mov
:циклзаполнения02
номерстолбца inc 'номерстолбца' mov
каунтер заготовкасчислами get номерстроки str номерстолбца str add массивреальногополя set
каунтер inc 'каунтер' mov
номерстолбца 9 < 'циклзаполнения02' jt
номерстроки inc 'номерстроки' mov
номерстроки 10 < 'циклзаполнения01' jt
;заполняем виртуальную таблицу
1 'номерстроки' mov
0 'номерстолбца' mov
:циклзаполнения1
0 'номерстолбца' mov
:циклзаполнения2
номерстолбца inc 'номерстолбца' mov
0 1 rand 1 = 'надозаполнитьфигней' jt
номерстроки str номерстолбца str add массивреальногополя get номерстроки str номерстолбца str add массиввидимогополя set
'аненадозаполнятьфигней' jmp
:надозаполнитьфигней
'.' номерстроки str номерстолбца str add массиввидимогополя set
:аненадозаполнятьфигней
номерстолбца 9 < 'циклзаполнения2' jt
номерстроки inc 'номерстроки' mov
номерстроки 10 < 'циклзаполнения1' jt
:начатьотрисовку
0 'номерстроки' mov
0 'номерстолбца' mov
:отрисовкаполя
номерстроки 9 = 'конецотрисовки' jt
'white' col
' +-+-+-+ +-+-+-+ +-+-+-+' ent add write
:новаястрока
номерстроки inc 'номерстроки' mov
номерстроки '|' add
0 'номерстолбца' mov
:столбец
номерстолбца inc 'номерстолбца' mov
номерстроки str номерстолбца str add массиввидимогополя get add '|' add
номерстолбца 3 mod 0 > 'столбец' jt
' |' add
номерстолбца 9 < 'столбец' jt
:конецстолбца
номерстроки add ent add write
номерстроки 3 mod 0 > 'новаястрока' jt
' +-+-+-+ +-+-+-+ +-+-+-+' ent add write
' 1 2 3 4 5 6 7 8 9' ent add write
'отрисовкаполя' jmp
:конецотрисовки
read 'команда' mov
'добавитьчисло' call
1 'победитель' mov
'проверитьвсё' call
победитель 1 = 'победилже' jt
clrscr
'начатьотрисовку' jmp
:добавитьчисло
3 команда get 0 команда get 1 команда get add массиввидимогополя set
ret
:проверкавходящего
;сложим
'1' массивотправка get num
'2' массивотправка get num add
'3' массивотправка get num add
'4' массивотправка get num add
'5' массивотправка get num add
'6' массивотправка get num add
'7' массивотправка get num add
'8' массивотправка get num add
'9' массивотправка get num add 'суммапроверки' mov
;перемножим
'1' массивотправка get num
'2' массивотправка get num mul
'3' массивотправка get num mul
'4' массивотправка get num mul
'5' массивотправка get num mul
'6' массивотправка get num mul
'7' массивотправка get num mul
'8' массивотправка get num mul
'9' массивотправка get num mul 'произведениепроверки' mov
суммапроверки 45 = 'непобедил' callf
произведениепроверки 362880 = 'непобедил' callf
ret
:непобедил
0 'победитель' mov
ret
:проверитьвсё
1 'номерстроки' mov
:циклпроверки01
0 'номерстолбца' mov
:циклпроверки02
номерстолбца inc 'номерстолбца' mov
номерстолбца str номерстроки str номерстолбца str add массиввидимогополя get массивотправка set
номерстолбца 9 < 'циклпроверки02' jt
'проверкавходящего' call
номерстроки inc 'номерстроки' mov
номерстроки 10 < 'циклпроверки01' jt
ret
:победилже
clrscr
'ВЫПОБЕДИТЕЛЬ!' write
:заменаA
'1' каунтер заготовкасчислами set
ret
:заменаB
'2' каунтер заготовкасчислами set
ret
:заменаC
'3' каунтер заготовкасчислами set
ret
:заменаD
'4' каунтер заготовкасчислами set
ret
:заменаE
'5' каунтер заготовкасчислами set
ret
:заменаF
'6' каунтер заготовкасчислами set
ret
:заменаG
'7' каунтер заготовкасчислами set
ret
:заменаH
'8' каунтер заготовкасчислами set
ret
:заменаI
'9' каунтер заготовкасчислами set
ret
:добавитьчисло
3 команда get 0 команда get 1 команда get add массиввидимогополя set
ret
:проверкавходящего
;сложим
'1' массивотправка get num
'2' массивотправка get num add
'3' массивотправка get num add
'4' массивотправка get num add
'5' массивотправка get num add
'6' массивотправка get num add
'7' массивотправка get num add
'8' массивотправка get num add
'9' массивотправка get num add 'суммапроверки' mov
;перемножим
'1' массивотправка get num
'2' массивотправка get num mul
'3' массивотправка get num mul
'4' массивотправка get num mul
'5' массивотправка get num mul
'6' массивотправка get num mul
'7' массивотправка get num mul
'8' массивотправка get num mul
'9' массивотправка get num mul 'произведениепроверки' mov
clrscr ;вдруг кликнули 2 раза
'ent' var '
' 'ent' mov ;nl нифига не работает у меня
'количествоходов' var ;любые пятнашки решаются за 0-80 ходов.
'массивполя' var arr 'массивполя' mov
'номерстроки' var
'номерстолбца' var
'пятнашка' var 1 'пятнашка' mov
'команда' var 0 'команда' mov
'победитель' var 0 'победитель' mov
'пустышкаX' var ;понадобятся дальше. Для временного хранения.
'пустышкаY' var
'пятнашкаX' var
'пятнашкаY' var
;массив со случайными пятнашками.
'пятнашки' var arr 'пятнашки' mov
;заполняем по порядку
:ЦФпятнашек
пятнашка str пятнашка str пятнашки set
пятнашка inc 'пятнашка' mov
пятнашка 16 < 'ЦФпятнашек' jt
;теперь всё это тусуем, 50 пробежек, 2 шашки меняем местами. Использую переменную 'пятнашка'.
1 'пятнашка' mov
:ЦТпятнашек
1 15 rand dup пятнашки get
1 15 rand dup пятнашки get ;в буфере теперь 'ячейка/пятнашка/ячейка/пятнашка', в обратном порядке
'команда' mov
пятнашки set
команда swap
пятнашки set
пятнашка inc 'пятнашка' mov
пятнашка 51 < 'ЦТпятнашек' jt
;Init()
;заполняем поле пятнашками
1 'номерстроки' mov
1 'пятнашка' mov
:ЦЗстроки
1 'номерстолбца' mov
:ЦЗстолбца
пятнашка пятнашки get номерстроки str номерстолбца str add массивполя set
пятнашка inc 'пятнашка' mov
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ЦЗстолбца' jt
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ЦЗстроки' jt
' ' '44' массивполя set ;16 ячейка пуста
:циклигры;*********************************************************************
clrscr
;рисуем игровое поле:
1 'номерстроки' mov
:ЦОстроки
1 'номерстолбца' mov
'╔═══╗╔═══╗╔═══╗╔═══╗' ent add write
:ЦОстолбца
'║ ' номерстроки str номерстолбца str add массивполя get 'добавитьпробел' call '║' add write ;рисует клетку. Если число меньше 10 то добавляет справа отступ.
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ЦОстолбца' jt
ent '╚═══╝╚═══╝╚═══╝╚═══╝' add ent add write
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ЦОстроки' jt
;нарисовали поле
;получить действие пользователя
read num round 'команда' mov ;округляем туда-сюда
'возможностьхода' call
'циклигры' jmp;*********************************************************************
;functions
;function StepPossible(Number)
:возможностьхода
;во первых проверим правильно ли ввели число
команда num 1 < 'циклигры' jt
команда num 15 > 'циклигры' jt
;теперь проверяем, возможен ли вообще такой ход?
;для этого получаем координаты пустышки и нужного нам числа
1 'номерстроки' mov
:ЦПстроки
1 'номерстолбца' mov
:ЦПстолбца
команда num номерстроки str номерстолбца str add массивполя get num = 'запомнитьпятнашку' callt
' ' номерстроки str номерстолбца str add массивполя get str = 'запомнитьпусто' callt
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ЦПстолбца' jt
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ЦПстроки' jt
;запомнили. Что же дальше? Ход возможен только если пятнашка и пустышка рядом.
;пятнашка над пустышкой
пустышкаX пятнашкаX = пустышкаY пятнашкаY sub 1 = and 'ходим' callt
;пятнашка под пустышкой
пустышкаX пятнашкаX = пятнашкаY пустышкаY sub 1 = and 'ходим' callt
;пятнашка слева от пустышки
пустышкаX пятнашкаX sub 1 = пятнашкаY пустышкаY = and 'ходим' callt
;пятнашка справа от пустышки
пятнашкаX пустышкаX sub 1 = пятнашкаY пустышкаY = and 'ходим' callt
;'ходим' call
ret
;function Step(number)
:ходим
' ' пятнашкаY str пятнашкаX str add массивполя set;меняем местами пятнашку
команда пустышкаY str пустышкаX str add массивполя set;и пустышку
количествоходов inc 'количествоходов' mov
1 'победитель' mov
'проверитьпобедитель' call
1 победитель = 'theend' jt
ret
;function Razrad(number)
:добавитьпробел
dup num 9 > 'недобавлятьпробел' jt
add ' ' add
'конецдобавления' jmp
:недобавлятьпробел
add
:конецдобавления
ret
;function SaveFifteen(X,Y)
:запомнитьпятнашку
номерстроки 'пятнашкаY' mov
номерстолбца 'пятнашкаX' mov
ret
;function SaveNull(X,Y)
:запомнитьпусто
номерстроки 'пустышкаY' mov
номерстолбца 'пустышкаX' mov
ret
;function CheckWinner()
:проверитьпобедитель
1 'пятнашка' mov
1 'номерстроки' mov
:ППстроки
1 'номерстолбца' mov
:ППстолбца
команда num номерстроки str номерстолбца str add массивполя get dup
пятнашка <> ' ' <> or 'непобедитель' callt
пятнашка inc 'пятнашка' mov
номерстолбца inc 'номерстолбца' mov
номерстолбца 5 < 'ППстолбца' jt
номерстроки inc 'номерстроки' mov
номерстроки 5 < 'ППстроки' jt
ret
:непобедитель
0 'победитель' mov
ret
:theend
'THE END' write