Помощь - Поиск - Пользователи - Календарь
Полная версия: Тушевание используя случайные чисела
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
Андрей
Привет спецам...
Еще одна лабораторка на носу 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
Привет!

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

1) O O
O O
O O
OOO

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


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

Немножко сумбурно... ;)
virt
Андрей
может тебе надо чтоб она постепенно расплывалась?
тогда для случайных точек около буквы бери сумму её цвета и цветов 8 окружающих её точек и дели сумму на 9.-- это новый цвет для точки.
И так пока не надоестsmile.gif
Shadow
я так понял нкжно что бы буква строилась по пикселам
причем положение пиксела в букве выбиралось случайно
--------
если это так построй матрицу и выбирай случайное в ней положение
Андрей
Извините, плохо объяснил, что мне надо...
В том куске программы я вывожу на экран символ "U" по-пиксельно беря координаты из матрицы. Символ будет - белым по черному.
Надо сделать так, чтобы этот символ исчез (затушевался черным по черному), но не по порядку (слева-направо сверху-вниз), а в случайном порядке.
Я в Assemblerе новичок, потому большая просьба, если не трудно, дайте пожалуйста пример программы.
GLuk
В смысле прогу что-ли за тебя написать?? 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
ню тогда теперь если у тебя сохранены точки и их координаты
то можно случайно выбирать индекс точки в массиве и соответствеено ее закрашивать smile.gif а вместо индекса можно поробовать использовать память тобишь адрес rolleyes.gif :p2:
естественно нужно куча проверок не превысилось ли адресс самого массива
не появилось ли такоеже число т.е. на повтор
Андрей
Ну вот, что то такое соорудил ;)
Большое всем спасибо за дельные советы :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
У меня чой-то не работает...??
Shadow
да к стати букву U вижу, а тушевание нет
GLuk
наврал поди... ;)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.