| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1067 人关注过本帖
标题:求助
只看楼主 加入收藏
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2232
专家分:3913
注 册:2007-4-27
结帖率:95.83%
收藏
已结贴  问题点数:20 回复次数:19 
求助
程序代码:
[local]1[/local]

N年前(记不清了),从网上,下载来一个叫“汉诺塔演示”的表单,当时看不懂,只是收藏着。现在想学它的动画,在逐句地解读、注释,想努力地盘清每一时刻的状况。因为弄不清变量的变化,和语句理解不了,来求助,请版主们不吝赐教。感谢先哦!

表单的自定义过程(HAN)代码如下:
PARAMETERS N,A,B,C     &&&&& 返回传递给最近执行程序的参数数目。第一次传来的是:n,123IF N=1
    thisform.MOV(n,A,C)       &&&&& MOV()为用户自定义过程——写在表单的属性中
      t(a)=t(a)-1   &&&&& ???
      t(c)=t(c)+1   &&&&& ???
      RETURN
  ELSE
      thisform.HAN(N-1,A,C,B)   &&&&&  ??? 为什么可以在自己自定义的过程中调用自己呢???
      thisform.MOV(n,A,C)       &&&&&  ???
      t(a)=t(a)-1   &&&&&
      t(c)=t(c)+1   &&&&&
       thisform.HAN(N-1,B,A,C)   &&&&&  ??? 这里又在自己的过程中调用自己定义的过程???与上一句不同的是变量位置。想着就晕了,
  ENDIF

表单的自定义过程(MOV)代码如下:
PARAMETERS n,a,c      &&&&& 返回传递给最近执行程序的参数数目
ph='p'+STR(n,1)       &&&&& 方块名P1-P9
la='line'+STR(a+1,1)      &&&&& 即 A 位上的竖线(第一次是line2)
lc='line'+STR(c+1,1)      &&&&& 即 C 位上的竖线(第一次是line4)

yy=thisform.&ph..top-100      &&&&& 确定上移单位数
FOR y=1 TO yy
  thisform.&ph..top=thisform.&ph..top-1      &&&&& 每次上移一个单位
  thisform.&ph..refresh      &&&&& 刷新
  FOR yc=1 TO 100000     &&&&& 控制方块的 向上 移动速度
  ENDFOR                &&&& 这个空的循环是拖延时间,看到方块移动轨迹的关键。这个思路好。
ENDFOR
xx=ABS(thisform.&ph..left-(thisform.&lc..left-n*10))       &&&&& ???,判断是方块左右移动的距离,但算不清某时刻的状况
FOR x=1 TO xx
  thisform.&ph..left=thisform.&ph..left+IIF(c>a,1,-1)      &&&&& 每次向左或向右移动一个单位(这是从运行中判断的)。判断不清某个时刻的变量a c的值,所以理解不了。而求助!
  thisform.&ph..refresh      &&&&& 刷新
  FOR yc=1 TO 100000      &&&&& 控制方块的 水平方向 移动速度
  ENDFOR
ENDFOR

yy=thisform.line1.top-((t(c)+1)*10)-100      &&&&& 确定下移单位数
FOR y=1 TO yy
  thisform.&ph..top=thisform.&ph..top+1      &&&&& 每次下移一个单位
  thisform.&ph..refresh      &&&&& 刷新
  FOR yc=1 TO 100000      &&&&& 控制方块的 向下 移动速度
  ENDFOR
ENDFOR
RETURN


 表单也上传了。
 请求版主们解释,以资理解。
 
  所有的注释是我加上去的。


   

汉诺塔演示.rar (4.53 KB)
搜索更多相关主题的帖子: 记不清了 动画 网上 想学 
2015-09-18 15:41
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:4 
先下载看看

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-09-18 16:25
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:4 
很好玩的啊。。
2015-09-18 16:34
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
代码精练,尚未看明白。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-09-18 16:48
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
表单的自定义过程(HAN)代码如下:
PARAMETERS N,A,B,C     &&&&& 返回传递给最近执行程序的参数数目。第一次传来的是:n,1,2,3。
  IF N=1
    thisform.MOV(n,A,C)       &&&&& MOV()为用户自定义过程——写在表单的属性中
      t(a)=t(a)-1   &&&&& ???
      t(c)=t(c)+1   &&&&& ???
      RETURN
  ELSE
      thisform.HAN(N-1,A,C,B)   &&&&&  ??? 为什么可以在自己自定义的过程中调用自己呢???这就是递归
      thisform.MOV(n,A,C)       &&&&&  ???
      t(a)=t(a)-1   &&&&&
      t(c)=t(c)+1   &&&&&
       thisform.HAN(N-1,B,A,C)   &&&&&  ??? 这里又在自己的过程中调用自己定义的过程???与上一句不同的是变量位置。想着就晕了,
  ENDIF

表单的自定义过程(MOV)代码如下:
PARAMETERS n,a,c      &&&&& 返回传递给最近执行程序的参数数目
ph='p'+STR(n,1)       &&&&& 方块名P1-P9
la='line'+STR(a+1,1)      &&&&& 即 A 位上的竖线(第一次是line2)
lc='line'+STR(c+1,1)      &&&&& 即 C 位上的竖线(第一次是line4)

yy=thisform.&ph..top-100      &&&&& 确定上移单位数
FOR y=1 TO yy
  thisform.&ph..top=thisform.&ph..top-1      &&&&& 每次上移一个单位
  thisform.&ph..refresh      &&&&& 刷新多余的代码
  FOR yc=1 TO 100000     &&&&& 控制方块的 向上 移动速度
  ENDFOR                &&&& 这个空的循环是拖延时间,看到方块移动轨迹的关键。这个思路好。
ENDFOR
xx=ABS(thisform.&ph..left-(thisform.&lc..left-n*10))       &&&&& ???,判断是方块左右移动的距离,但算不清某时刻的状况
FOR x=1 TO xx
  thisform.&ph..left=thisform.&ph..left+IIF(c>a,1,-1)      &&&&& 每次向左或向右移动一个单位(这是从运行中判断的)。判断不清某个时刻的变量a c的值,所以理解不了。而求助!
  thisform.&ph..refresh      &&&&& 刷新多余的代码
  FOR yc=1 TO 100000      &&&&& 控制方块的 水平方向 移动速度
  ENDFOR
ENDFOR

yy=thisform.line1.top-((t(c)+1)*10)-100      &&&&& 确定下移单位数
FOR y=1 TO yy
  thisform.&ph..top=thisform.&ph..top+1      &&&&& 每次下移一个单位
  thisform.&ph..refresh      &&&&& 刷新多余的代码
  FOR yc=1 TO 100000      &&&&& 控制方块的 向下 移动速度
  ENDFOR
ENDFOR
RETURN


活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-09-18 17:18
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
我将多余的代码注释掉之后,程序照常运行,但少了刷新过程,方块的移动速度就更快了。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-09-18 17:19
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2232
专家分:3913
注 册:2007-4-27
收藏
得分:0 
PARAMETERS N,A,B,C     &&&&& 返回传递给最近执行程序的参数数目。第一次传来的是:n,1,2,3。
  IF N=1
     thisform.MOV(n,A,C)       &&&&& MOV()为用户自定义过程——写在表单的属性中
      t(a)=t(a)-1   &&&&& ???
      t(c)=t(c)+1   &&&&& ???
      RETURN
   ELSE


当设定一个方块时(1是特例),看到方块移动轨迹,可以判断      t(a)=t(a)-1   的作用是 A柱位置上的方块数减少1,     t(c)=t(c)+1   的作用是在 C柱位置上的方块数加1,即移动一个方块。

[ 本帖最后由 wengjl 于 2015-9-18 17:27 编辑 ]

只求每天有一丁点儿的进步就可以了
2015-09-18 17:26
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2232
专家分:3913
注 册:2007-4-27
收藏
得分:0 
把100000变是100万,移动会更慢

只求每天有一丁点儿的进步就可以了
2015-09-18 17:29
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2232
专家分:3913
注 册:2007-4-27
收藏
得分:0 
因为我想把我的中考录取志愿投档做个动画出来,所以要开始研究这个表单。基础弱,啃咽不了啊


 进一步仔细观察运行,发现:方块数为1.3.5.7.9时,第一个方块是先移到 C 柱上的,方块数2.4.6.8时,第一个方块是先移到 B 柱上的
 代码中看不出有奇偶的判断啊?

[ 本帖最后由 wengjl 于 2015-9-18 17:45 编辑 ]

只求每天有一丁点儿的进步就可以了
2015-09-18 17:36
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用wengjl在2015-9-18 17:36:49的发言:

因为我想把我的中考录取志愿投档做个动画出来,所以要开始研究这个表单。基础弱,啃咽不了啊


 进一步仔细观察运行,发现:方块数为1.3.5.7.9时,第一个方块是先移到 C 柱上的,方块数2.4.6.8时,第一个方块是先移到 B 柱上的
 代码中看不出有奇偶的判断啊?

还有一个规律,就是相邻编号的方块尽量排在一起,且小方块永远保持在上部。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-09-19 08:28
快速回复:求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021522 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved