汉诺塔实现步骤

上传人:ji****72 文档编号:37983144 上传时间:2018-04-25 格式:DOC 页数:24 大小:337KB
返回 下载 相关 举报
汉诺塔实现步骤_第1页
第1页 / 共24页
汉诺塔实现步骤_第2页
第2页 / 共24页
汉诺塔实现步骤_第3页
第3页 / 共24页
汉诺塔实现步骤_第4页
第4页 / 共24页
汉诺塔实现步骤_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《汉诺塔实现步骤》由会员分享,可在线阅读,更多相关《汉诺塔实现步骤(24页珍藏版)》请在金锄头文库上搜索。

1、汉诺塔实现步骤汉诺塔实现步骤一、创建工作空间和应用(略)一、创建工作空间和应用(略)二、创建结构体对象(二、创建结构体对象(str_disk)其中 str_表示 structure, disk 就是圆盘.三、创建用户对象(三、创建用户对象(u_tower)其中 u_表示 UserObject,选 PB Object 中的 custom visual.(1)操作界面操作界面(2)设计控件设计控件(3)控件名称控件名称(4)部分控件不可见部分控件不可见(5)声明实例变量声明实例变量其中 roundrectangle irr_disk14定义栈空间(空栈) int ii_count 栈顶指针(栈内盘

2、子数)(6)编写编写 constructor 事件代码事件代码作用:在空栈中放置栈元素(盘子) /将 14 个圆角矩形控件对象加到数组中 /即初始化栈 /其结果数组元素 irr_disk1- irr_disk14 分别对应存放的是对象 rr_1-rr_14。 int li_index int li_array_limit int li_control_index int li_control_limit string rr_name drawobject ldo_templi_array_limit = upperbound (irr_disk)/ 返回数组维界返回数组维界 li_contro

3、l_limit = upperbound (control)/返回控件数组维界返回控件数组维界/将控件数组里的隐藏矩形,放置在定义的将控件数组里的隐藏矩形,放置在定义的 实例对象数组中。实例对象数组中。 For li_control_index = 1 to li_control_limit /对控件数组的每个元素对控件数组的每个元素 ldo_temp = controlli_control_indexrr_name= ldo_temp.classname()li_index=dec(right(rr_name,len(rr_name)-3) If li_index=1 and li_inde

4、x 14 Then Messagebox(“Peg Error“,“Error only 14 disk are allowed“)ii_count - Return End If/(图)计算盘子位置/(式)计算盘子位置 li_y = r_base.y - (irr_diskii_count.height+ 5)*ii_count) li_x = rr_pole.x + (rr_pole.width / 2) - (astr_disk.size / 2)/盘子宽度和颜色由实参提供 irr_diskii_count.width = astr_disk.size irr_diskii_count.

5、fillcolor = astr_disk.colorirr_diskii_count.visible = true irr_diskii_count.x = li_x/(图)产生向下的效果/(代码)产生向下的效果 irr_diskii_count.y = rr_pole.y + irr_diskii_count.height do while irr_diskii_count.y li_y Thenirr_diskii_count.y = li_y Else irr_diskii_count.y = irr_diskii_count.y/确保针上没有盘子时不做该操作 If ii_count

6、rr_pole.y + irr_diskii_count.height If irr_diskii_count.y /二、声明局部变量 str_disk lstr_disk /该结构有两个成员:size 和 color/三、仅一个盘子,直接移动,结束递归。 If ai_disk = 1 Then auo_startpeg.removedisk(lstr_disk) auo_endpeg.adddisk(lstr_disk) /请注意局部变量 lstr_disk 的作用 Else /四、大于一个盘子时,递归调用 wf_movedisk(ai_disk - 1, auo_startpeg, auo

7、_endpeg, auo_midpeg) wf_movedisk(1, auo_startpeg, u_tower, auo_endpeg) wf_movedisk(ai_disk - 1, auo_midpeg, auo_startpeg, auo_endpeg) End If(6)cb_start 的的 Clicked 代码代码/一、声明局部变量int li_disk/ li_disk 盘子数 int li_index/li_index 盘子序号 int li_size str_disk lstr_disk /结构变量。成员 size 和 color。 long ll_rc /二、取盘子数

8、目 /how many disks used in this example li_disk = Integer(em_disks.text)/从掩码控件(微调框)中读盘子数 If li_disk 14 Or li_Disk “ + mid(auo_endpeg.classname(),4) lb_step.SetTop(li_currow)/列表框函数:列表框函数: /滚动列表框使该列表项可见滚动列表框使该列表项可见./别忘了,去添加实例变量别忘了,去添加实例变量 ii_step,和局部变和局部变 量量 li_currowauo_startpeg.removedisk(lstr_disk)

9、auo_endpeg.adddisk(lstr_disk) /请注意局部变量 lstr_disk 的作用 Else /四、大于一个盘子时,递归调用 wf_movedisk(ai_disk - 1, auo_startpeg, auo_endpeg, auo_midpeg) wf_movedisk(1, auo_startpeg, u_tower, auo_endpeg) wf_movedisk(ai_disk - 1, auo_midpeg, auo_startpeg, auo_endpeg) End If六、增加单步移动控制窗口六、增加单步移动控制窗口(1)主界面加复选框主界面加复选框 ch

10、eckbox 控件控件(cbx_sstep)(2)单步窗口对象(单步窗口对象(W_towers_single_step)(3)窗口属性(窗口属性(WindowType)/ WindowType 窗口类型 WindowType=response!/响应窗口(4) 编写编写 cb_step 的的 clicked 代码(代码(Step 按钮)按钮)/功能:关闭“单步窗口” ,同时返回数值 1,给“汉诺窗口” ClosewithReturn(Parent,1)(5) 编写编写 cb_cancel 的的 clicked 代码(代码(Cancel 按钮)按钮)/功能:关闭“单步窗口” ,同时返回数值 0,

11、给“汉诺窗口” Closewithreturn(Parent,0)/ CloseWithReturn ( windowname, returnvalue ) / Closes a window and stores a return value in the Message object. You should use CloseWithReturn only for response windows.(6) 改写改写 wf_movedisk 代码代码原代码(灰): /一、形式参数(在界面设置,不是代码部分) public subroutine wf_movedisk (int ai_disk

12、, u_tower auo_startpeg, u_tower auo_midpeg, u_tower auo_endpeg);/二、声明局部变量 str_disk lstr_disk /该结构有两个成员:size 和 color/三、仅一个盘子,直接移动,结束递归。 If ai_disk = 1 ThenIf cbx_sstep.checked Then /选中选中“单步单步”复选框时,打开复选框时,打开“单步控制窗单步控制窗”/“单步控制窗单步控制窗”是一个响应窗口(即模式窗口)是一个响应窗口(即模式窗口) ,/必须等待用户响应之后程序才能继续运行。必须等待用户响应之后程序才能继续运行。

13、/在在“单步控制窗单步控制窗”按了按了“取消取消” ,则取消单步,则取消单步 open(w_towers_single_step)If message.doubleparm = 0 Then cbx_sstep.checked = false End If /其中其中 DoubleParm 是是 message 对象的属性,获对象的属性,获 取数值型返回值。取数值型返回值。 /返回值由返回值由“单步控制窗单步控制窗”返回,按返回,按“取消取消” ,返,返 回回 0;按;按“单步单步”返回返回 1。 /参见参见“单步控制窗单步控制窗”中中“返回返回”代码中的代码中的 Closewithretur

14、n(Parent,0)/将将 0 送送 message 对象中,再由对象中,再由 doubleparm 属属 性取出。性取出。/增加移动的步骤序列ii_step+/ /将步骤写入列表框 li_currow = lb_step.Additem(string(ii_step) + “. “ +&mid(auo_startpeg.classname(),4) + “ “ + mid(auo_endpeg.classname(),4) lb_step.SetTop(li_currow)/列表框函数: /滚动列表框使该列表项可见. /别忘了,去添加实例变量 ii_step,和局部变量 li_currow

15、auo_startpeg.removedisk(lstr_disk) auo_endpeg.adddisk(lstr_disk) /请注意局部变量 lstr_disk 的作用 Else /四、大于一个盘子时,递归调用 wf_movedisk(ai_disk - 1, auo_startpeg, auo_endpeg, auo_midpeg) wf_movedisk(1, auo_startpeg, u_tower, auo_endpeg) wf_movedisk(ai_disk - 1, auo_midpeg, auo_startpeg, auo_endpeg) End If(7) 让单步窗口紧靠在主窗口右侧让单步窗口紧靠在主窗口右侧W_towers_single_step 的 open 事件代码: this.x=w_towers_hanoi.x+w_towers_hanoi.width this.y=w_towers_hanoi.y七、加声音七、加声音(1)声明外部函数Function boolean sndPlaySoundA(string SoundName, ulong Flags) Library “WINMM.DLL“ (2)调用外部函数 sndPlaySoundA(blip.wav, 1)end

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号