鱼C论坛

 找回密码
 立即注册
查看: 2568|回复: 2

[技术交流] DOSBox获取随机数的思路

[复制链接]
发表于 2019-4-14 16:00:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
16位汇编好像没有得到随机数的方法,然后我想到了个替代方法,用当前时间来模拟随机数。
但考虑到第二次调用时随机性不够大,所以再加了个假随机数表的方式来模拟,双重随机,使得每次调用都能获得较为合理的随机数。

效果:每调用一次就在屏幕显示一个$$,想看到效果最好是调用+延时的方式,这样可以在屏幕上不断地出现$$



代码↓↓↓
  1. rand      : jmp short sr
  2.             seat db 0,0,0,0,0              ;第一个是列的随机数表的指向位置,四为果子x,五为果子y
  3.             table1 db 5,2,7,1,8,0,5,9,4,3,6,7,8,1,9,2,6,0,3,4           ;x坐标的个位
  4.                         table2 db 0ah,14h,0,14h,1dh,0ah,1dh,0ah,0,14h,0,1dh         ;x坐标的十位,0,10,20,30
  5.                         table3 db 2,15,22,16,13,0,12,9,19,11,1,7,21,18,6,16,17,8,4,12,14,20,3,10,5,18   ;y坐标
  6.     sr    : push ax
  7.             push ds
  8.                         push bx
  9.                         push cx
  10.                         push es
  11.                         mov ax,cs
  12.                         mov ds,ax            ;这是写在代码段的
  13.                         mov al,0
  14.                         out 70h,al           
  15.                     in al,71h            ;获取时间秒,下面处理秒
  16.                         mov ah,al
  17.                         mov cl,4
  18.                         shr ah,cl
  19.                         and al,00001111b
  20.                        
  21.                         mov cl,seat[0]
  22.                         mov bl,cl
  23.                         add bl,al
  24.                         cmp bl,13h
  25.                         jna bz1
  26.                         sub bl,14h
  27.                 bz1:mov seat[0],bl
  28.                         mov bh,0
  29.                         mov bh,table1[bx]

  30.                     mov cl,seat[1]
  31.                     mov bl,cl
  32.                         add bl,ah
  33.                         cmp bl,0bh
  34.                         jna bz2
  35.                     sub bl,0ch                       
  36.                 bz2:mov seat[1],bl
  37.                     mov cl,bh
  38.                         mov bh,0
  39.                     mov bh,table2[bx]
  40.                         add bh,cl
  41.                        
  42.                     cmp bh,25h
  43.                         jna bz3
  44.                         sub bh,al
  45.                         sub bh,ah
  46.                         sub bh,al
  47.                 bz3:mov seat[3],bh
  48.                
  49.                     mov al,2
  50.                         out 70h,al
  51.                     in al,71h          ;获取时间分,下面处理分
  52.                         and al,00001111b
  53.                         mov cl,seat[2]
  54.                         mov bl,cl
  55.                         add bl,al
  56.                         cmp bl,16h         ;判断是否超过16h
  57.                         jna bz4
  58.                         sub bl,17h
  59.                 bz4:mov seat[2],bl
  60.                         mov bh,0
  61.                     mov bh,table3[bx]
  62.                         mov seat[4],bh
  63.                        
  64.                         mov ax,0b800h                ;下面是显示$
  65.                         mov es,ax
  66.                         mov al,seat[4]
  67.                         add al,1
  68.                         mov ah,0
  69.                         mov bl,160                   ;y坐标*160
  70.                         mul bl
  71.                         mov bl,seat[3]
  72.                         mov bh,0
  73.                         add bx,bx
  74.                         add bx,bx
  75.                         add ax,bx
  76.                         add ax,4
  77.                         mov bx,ax
  78.                         mov al,'
  79.                         mov ah,46h
  80.                         mov es:[bx],al
  81.                         mov es:[bx+1],ah
  82.                         mov es:[bx+2],al
  83.                         mov es:[bx+3],ah
  84.                         pop es
  85.                         pop cx
  86.                         pop bx
  87.                         pop ds
  88.                         pop ax
  89.                         ret
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-19 18:45:11 | 显示全部楼层
这个跟数学太相关了,调用API就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-21 09:45:19 | 显示全部楼层
bitravel 发表于 2019-9-19 18:45
这个跟数学太相关了,调用API就行了。

啊?DOS汇编有API么,这我不知道啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表