Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Тушевание используя случайные чисела

Автор: Андрей 2.06.2004 18:47

Привет спецам...
Еще одна лабораторка на носу blink.gif
В примере ниже я вывожу на екран в графическом режиме букву , белую на черном.
Нужно сделать так, чтобы эта буква затушевалась, но не просто по порядку, а с применением генерации случайных чисел (буква как бы рассыпается).
Подскажите пожалуйста возможный способ решения.
Заранее благодарен.

	.model	tiny
.code  
org 100h
start:
push ax
mov ax, 0013h
int 10h
pop ax
mov si, 0
mov bx, offset kord

ciklas:
mov cx,[bx+si]
mov dx,[bx+si+2]
mov al, 00000111b
mov ah, 0Ch
int 10h
add si,4
cmp si, 604
jne ciklas

mov ah, 08h
int 21h
cmp al, 32
jne quit

quit: mov ax, 0003h
int 10h
ret

kord dw 50,50,51,50,52,50,53,50,  59,50,60,50,61,50,62,50
dw 50,51,51,51,52,51,53,51,  59,51,60,51,61,51,62,51
dw 50,52,51,52,52,52,53,52,  59,52,60,52,61,52,62,52
dw 50,53,51,53,52,53,53,53,  59,53,60,53,61,53,62,53
dw  50,54,51,54,52,54,53,54,  59,54,60,54,61,54,62,54
dw 50,55,51,55,52,55,53,55,  59,55,60,55,61,55,62,55
dw 50,56,51,56,52,56,53,56,  59,56,60,56,61,56,62,56
dw 50,57,51,57,52,57,53,57,  59,57,60,57,61,57,62,57
dw 50,58,51,58,52,58,53,58,  59,58,60,58,61,58,62,58
dw 50,59,51,59,52,59,53,59,  59,59,60,59,61,59,62,59
dw 50,60,51,60,52,60,53,60,  59,60,60,60,61,60,62,60
dw 50,61,51,61,52,61,53,61,  59,61,60,61,61,61,62,61
dw 50,62,51,62,52,62,53,62,  59,62,60,62,61,62,62,62
dw 50,63,51,63,52,63,53,63,  59,63,60,63,61,63,62,63
dw 50,64,51,64,52,64,53,64,  59,64,60,64,61,64,62,64
dw       51,65,52,65,53,65,  59,65,60,65,61,65
dw      52,66,53,66,54,66,55,66,56,66,57,66,58,66,59,66,60,66
dw      52,67,53,67,54,67,55,67,56,67,57,67,58,67,59,67,60,67
dw     53,68,54,68,55,68,56,68,57,68,58,68,59,68
end start

Автор: GLuk 2.06.2004 21:32

Привет!

А понятие "затушевалась" - это вроде как не одно и тоже, что рассыпалась?
Тебе, собственно, нужен код генерации псевдослучайного числа?
Тут стоит прикинуть от чего символ (кстати лучше их не описывать, а взять готовые из ПЗУ, или таблиц русификатора) будет рассыпаться. От удара справа, слева, сверху и все такое. Типа как вулканчик??

1) O O
O O
O O
OOO

Примерный вид символа "U"


2) По порядку (в смысле по рядам с любой стороны) вроде как нельзя?
Дык тогда самая простая реализация - это все символы разлетаются в стороны, типа как от удара в центр, по диагонали и вертикали. Начиная от крайних??

Немножко сумбурно... ;)

Автор: virt 2.06.2004 23:10

Андрей
может тебе надо чтоб она постепенно расплывалась?
тогда для случайных точек около буквы бери сумму её цвета и цветов 8 окружающих её точек и дели сумму на 9.-- это новый цвет для точки.
И так пока не надоестsmile.gif

Автор: Shadow 3.06.2004 1:31

я так понял нкжно что бы буква строилась по пикселам
причем положение пиксела в букве выбиралось случайно
--------
если это так построй матрицу и выбирай случайное в ней положение

Автор: Андрей 3.06.2004 14:53

Извините, плохо объяснил, что мне надо...
В том куске программы я вывожу на экран символ "U" по-пиксельно беря координаты из матрицы. Символ будет - белым по черному.
Надо сделать так, чтобы этот символ исчез (затушевался черным по черному), но не по порядку (слева-направо сверху-вниз), а в случайном порядке.
Я в Assemblerе новичок, потому большая просьба, если не трудно, дайте пожалуйста пример программы.

Автор: GLuk 4.06.2004 0:16

В смысле прогу что-ли за тебя написать?? blink.gif angry.gif

Вот держи лучше кусок кода для генерации псевдослучайных чисел:

Для начала нужны 2 переменных, для сохр-ия предыдущего значения:
типа:

Rand1 dw 20h
Rand2 dw 1024h

Привязка к текущему значению таймера, обычно оформляется отдельной процедурой:

   mov ah,2Ch
  int 21h
  mov Rand1,ax
  mov Rand2,dx


И собственно сама генерация:
Диапазон выбора задается через стек, т.е. положил 2048, то выбор случайного числа из диапазона: 0..2048. А возврат в AX.

   mov     ax,Rand1
  mov     bx,Rand2
  mov     cx,ax
  mul     RandA      ; RandA - любое число, на твой вкус
  shl     cx,1
  shl     cx,1
  shl     cx,1
  add     ch,cl
  add     dx,cx
  add     dx,bx
  shl     bx,1
  shl     bx,1
  add     dx,bx
  add     dh,bl
  mov     cl,5
  shl     bx,cl
  add     dh,bl
  add     ax,1
  adc     dx,0
  mov     Rand1,ax
  mov     Rand2,dx
  mov     bx,sp                
  mov     cx,dx                
  mul     word ptr ss:[bx+4]    
  mov     ax,cx
  mov     cx,dx
  mul     word ptr ss:[bx+4]
  add     ax,cx
  adc     dx,0
  mov     ax,dx


Эта реализация целиком содрана из модуля CRT языка Паскаль. smile.gif

Автор: Shadow 4.06.2004 15:38

ню тогда теперь если у тебя сохранены точки и их координаты
то можно случайно выбирать индекс точки в массиве и соответствеено ее закрашивать smile.gif а вместо индекса можно поробовать использовать память тобишь адрес rolleyes.gif :p2:
естественно нужно куча проверок не превысилось ли адресс самого массива
не появилось ли такоеже число т.е. на повтор

Автор: Андрей 4.06.2004 20:43

Ну вот, что то такое соорудил ;)
Большое всем спасибо за дельные советы :D
Публикую пример, может кому пригодится:

.model tiny
.code  
org 100h
start:
mov ax, 0013h
int 10h
mov si, 0
mov bx, offset kord

ciklas:
mov cx,[bx+si]
mov dx,[bx+si+2]
mov al, 00000111b
mov ah, 0Ch
int 10h
add si,4
cmp si, 604
jne ciklas

mov ah, 08h
int 21h
cmp al, 32
jne quit

mov si, 16000 ;ну приблезительно при таком значении полностью закрашивается почти всегда
ats:
push bx
push cx
push dx
; генератор случ. чисел с проверкой диапазона
rn1:                         ;координата столбца
xor ax,ax
out 43h,al
in al,40h
cmp al,64 ; число не менее
jl rn1
cmp al,78 ; число не более
jg rn1
mov byte ptr[rnd1],al

rn2:                         ;координата строки
xor ax,ax
out 43h,al
in al,40h
cmp al,102
jl rn2
cmp al,120
jg rn2
mov byte ptr[rnd2],al

pop dx
pop cx
pop bx

mov cx,rnd1
mov dx,rnd2
mov al, 00000000b
mov ah, 0Ch
int 10h
int 1Ah
dec si
jnz ats

mov ah, 01h
int 21h

quit: mov ax, 0003h
int 10h
ret

kord dw 50,50,51,50,52,50,53,50,  59,50,60,50,61,50,62,50
dw 50,51,51,51,52,51,53,51,  59,51,60,51,61,51,62,51
dw 50,52,51,52,52,52,53,52,  59,52,60,52,61,52,62,52
dw 50,53,51,53,52,53,53,53,  59,53,60,53,61,53,62,53
dw  50,54,51,54,52,54,53,54,  59,54,60,54,61,54,62,54
dw 50,55,51,55,52,55,53,55,  59,55,60,55,61,55,62,55
dw 50,56,51,56,52,56,53,56,  59,56,60,56,61,56,62,56
dw 50,57,51,57,52,57,53,57,  59,57,60,57,61,57,62,57
dw 50,58,51,58,52,58,53,58,  59,58,60,58,61,58,62,58
dw 50,59,51,59,52,59,53,59,  59,59,60,59,61,59,62,59
dw 50,60,51,60,52,60,53,60,  59,60,60,60,61,60,62,60
dw 50,61,51,61,52,61,53,61,  59,61,60,61,61,61,62,61
dw 50,62,51,62,52,62,53,62,  59,62,60,62,61,62,62,62
dw 50,63,51,63,52,63,53,63,  59,63,60,63,61,63,62,63
dw 50,64,51,64,52,64,53,64,  59,64,60,64,61,64,62,64
dw       51,65,52,65,53,65,  59,65,60,65,61,65
dw      52,66,53,66,54,66,55,66,56,66,57,66,58,66,59,66,60,66
dw      52,67,53,67,54,67,55,67,56,67,57,67,58,67,59,67,60,67
dw     53,68,54,68,55,68,56,68,57,68,58,68,59,68
rnd1 dw ?
rnd2 dw ?
end start

Автор: GLuk 8.06.2004 10:53

У меня чой-то не работает...??

Автор: Shadow 8.06.2004 19:24

да к стати букву U вижу, а тушевание нет

Автор: GLuk 8.06.2004 19:46

наврал поди... ;)