И так, что это такое? Это судоку.
Да, не доделал, ибо надоело. Алгоритм (или можете называть это копипастинг) базируется на этом. Если будет желание — доделаю.
ТУДУ лист:
Сделать проверку всего, а не только строк.
Запретить изменение выданных по умолчанию чисел
Рандомизировать заполнение заготовок
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