用VB设计汉诺塔动画游戏

合集下载

在VB应用软件中实现动画效果 (转)

在VB应用软件中实现动画效果 (转)

作者:meteoremail: xxzxly@日期:9/6/2001 11:45:08 AM 在开发VB应用程序中,加入了动画之后可使软件具有生动活泼的效果,而且,在编写组态软件中,动画功能更是必不可少,如容器中容量的变化、液体液面的变化等,实际也是一种动画效果。在中科院空间中心开发的“电场和电导率监测网中心站专家系统”中,有多处使用动画效果,现简明介绍如下。 一、使用Animation控件 在VB5.0中可以使用Animation控件实现动画,实例如下: Private Sub Animation1_Click () With CommonDialog1 Filter = "avi (*.avi)|*.avi" '过滤器指定在对话框的文件列表框中显示文件的类型 .ShowOpen 显示“打开”对话框 End With With Animation1 .Autoplay = True '一旦将 .avi 文件加载到 Animation 控件中,则 .avi 文件 将连续循环的自动播放。 .Open CommonDialog1.Filename '打开一个将要播放的 .avi 文件。如果 AutoPlay 属性为 True,则只要加载该文件便可。  End WithEnd Sub Animation 控件不能播放含有声音数据的 .avi 文件。此外,动画控件只能显示未压缩的或用行程编码 (RLE) 压缩的 .avi 文件。当用文件调用 Open 方法时,如果该文件含有声音数据,或不具备特定的压缩格式,则返回错误。 二、使用AniPushButton(AniButton)控件 受WINDOWS/NT超级终端动画效果的影响,笔者也希望在开发的应用软件中加入转动地球的效果。首先用PHOTOSHOP制作一些图画,地球的图像是用一个地球仪临摹取得的,每次将地球仪转动一个固定的角度,得到一幅不同角度地球的图像,重复多次,且将每一幅图存为一个.bmp文件,供AniPushButton调用。 AniPushButton控件包含了大量的属性、方法、事件供开发人员使用。首先在Picture和Frame属性中装入图像文件,Picture属性可以装入多幅图像文件,帧Frame属性是Picture属性装入图像文件的索引,Frame属性是1对应第一个图像文件,注意,Frame 只能从1开始,而图像数组可以从0开始,这两个属性可以在属性设计时设置,也可以在程序中设置,Picture属性可以装入.bmp、.ico、.wmf等文件,其他格式的图像文件可以用PHOTOSHOP或SEA等文件进行格式转换,在动画的图像文件装入时,不是装入一幅图像文件,而是要在Frame属性的控制下,装入多幅图像文件,Frame为1,Picture装入第一幅图像文件,Frame为2,Picture装入第二幅图像文件,依次类推,将可产生动画效果的各种图像依次装入Picture属性中。 PicDrawMode属性用于设置显示图像与装入图像之间的比例关系。0为控制按设计的大小装入图像,1为控制按图像的大小自动调

基于VB的动画技术

基于VB的动画技术
在利用 VB开发应用程 序的过程中 .动画 的制作是很 常用 的, 特别是用 V B编制一些 游戏软件 , 模拟复杂的生产过程 , A CI 教学 的演示等 。 动画就得尤 其重要 。在开 发 V B应用 程序 时 。 常 使 用 以下 方法 创作 动 画 。
1 使 用 控件 通 过 加 载 图 像 实 现 动 画 .
E d I n f
碰到下边 界
动 画是一种运动的模拟 .其 实现方法 是在屏幕 上快速地 显 示一组组相美 的图像 . 时可 以采用 帧动画原理, 编程 即通过一 系 列静态图辅之 以连续快速变化产生 动画效 果 . 也可 以通过 1oe  ̄ v I 方法改变图形 对象的 T p及 Lf 属性 移动 图形 来实 现 .动 画的 o e t 速度使用时钟 来控制 。用这种方法实 现动画的基础 是图像 的显 示和使 图像快速 、 时地 移动或变化 。利用 V 定 B中的 I gLs、 mae i t Pe rB x等控件 ,通过加入序列 图像 .用定时器 控件 的 Tm r iue o t ie 事件进行控制 . 以显示此序列 图中不 同的图像来达到动画效果 。 1 用 M0e . v 方法实现动画 利用人眼的视觉暂 停现象.连续 移动 控件 和改 变控件 的大 小 可 实 现 动 画 。一 幅 图 像 的位 置 不 断 变 化 而形 成 的动 画称 为单 帧动画 。 如滚动字幕 , 云彩被风吹动等 , 这种 动画通 常是在 Tm r ie 事件过程 中调 用控件 的 M州e 法控制 图像 的位 置移动来实 现 方 的。V B中许多控件都能 够被移动或 改变大小 。通 过改变控 件 T p Lf属性值可 以实现控件位置 的变化 .控件大小变化是通 o .et

利用VB数组的方法实现汉诺塔游戏的设计

利用VB数组的方法实现汉诺塔游戏的设计

图1 游戏操作截图1 引言

在很多关于程序设计的书中介绍到递归的章节时都要讲到“汉诺塔”的例子,大意是在一块板上有三根针第一根针上从小到大套有64个圆盘,每次只能移动一个圆盘,而且只能将小的盘片放在大的盘片之上,通过第二根针过渡,将所有圆盘移至第三根针即为成功。在各书中是用递归的算法来解决“汉诺塔”的实现步骤的。如何利用Visual Basic来设计可供学生进行真正操作、玩的游戏呢?我通过探索和设计,用数组的方法实现了互动汉诺塔游戏的制作。

2 具体的设计思路

因为盘片的数量增加会导致玩成功的时间急剧增加,按照全部步骤正确,以每秒移动一个盘片计算,要玩完64个盘片至少

要264-1次,合5849亿年之久。

所以,要首先让用户选择要玩的圆盘总数n,根据n,设计出一个二维数组a(3,n),第一维为针(柱子)数,第二维为盘数。数组元素的值为布尔型,且对应于盘的位置。如a(2,5)为true则表示在第二个针上,第5个盘在其上存在。如a (3,1)为false则表示在第三个针上,第1个盘子不存在。

程序开始时,根据用户输入的准备移动的圆盘总数n,用控件数组自动生成n个圆盘,并且随机产生其颜色。开始后画在第一个柱子上。

子程序d_Click(Index As Integer),是准备拿取圆盘,判断如果该针上有圆盘,就

进行移盘操作。

子程序L _M o u s e M o v e (I n d e x A s Integer,Button As Integer,Shift As Integer,X As Single,Y As Single)则是当选好盘子后,到放置盘片的过程中,让盘子跟随鼠标光标一起移动。

汉诺塔问题的非递归算法设计及可视化实现

汉诺塔问题的非递归算法设计及可视化实现

汉诺塔问题的非递归算法设计及可视化实现

彭伟

【摘要】This essay introduces the classic recursive algorithm of the famous Hanoi,and then carries out further analysis and study on the algorithm based on the binary recursive tree to get a non-recursive solution without using the stack technology.Finally,designing procedures of development environment are visualized in NET,using recursive and non-recursive algorithm respectively to solve Hanoi of specified scale,with the moving effects of disc being dynamically simulated.%讨论了汉诺塔问题的经典递归算法,并基于二叉递归树对算法进行研究,得出了一种不使用堆栈技术的非递归解法,最后在.NET可视化开发环境下设计程序,分别用递归与非递归算法求解指定规模的汉诺塔问题,动态模拟了求解过程中盘片的移动效果。

【期刊名称】《武汉船舶职业技术学院学报》

【年(卷),期】2011(010)006

【总页数】6页(P55-59,72)

汉诺塔游戏设计过程

汉诺塔游戏设计过程

兰州交通大学

数理与软件工程学院

课程设计报告

2011 ~2012学年第二学期

2012年6月

一、实验目的:

通过此次C++实训,一方面加深了对C++语言的了解,而不只是单单的在课本中学到的那些理论。通过学生动手亲自编写,平时乏味的课程,变的生动有趣。平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。另一方面,通过学生小组完成任务,提高团队意识,增加凝聚力,让同学们意识到团结就是力量,每个人都是重要的一份子。

二、题目:汉诺塔游戏程序

<1> 问题描述:在平面上有三个位置A、B、C,在A位置上有n

个大小不等的圆盘、小盘压在大盘上形成圆盘堆。要求将A位置的N个圆盘通过B位置移动到C位置上,并按同样的顺序叠放。

移动圆盘时必须遵循以下规则:

1.每一次只能移动一个圆盘

2.圆盘可以放在A、B、C任何一个塔座上

3.任何时刻都不能将大圆盘压在小圆盘上

<2> 基本要求:

圆盘的个数从键盘输入(如3-64等);用动画的形式在屏幕上显示盘的移动。

三、问题分析和任务定义

1、已知有三个塔(1、

2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。

2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆

放至顶部)。

3、每次移动一个碟子。

4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。

5、可以借助塔3。

先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:

1、将上面的N个盘子移到b杆上;

2、将a杆上剩下的盘子移到c杆上;

3、将b杆上的全部盘子移到c杆上。

将这个过程继续下去,就是要先完成移动n个盘子、n-1个盘子、n-2个盘子....1个盘的工作。

汉诺塔游戏-----用C++编的

汉诺塔游戏-----用C++编的

#ifndef HANIO_H_

#define HANIO_H

class Stack

{

private:

enum{ MAX=50 };

int m_node[MAX];

int m_top;

int m_size;

int m_index;

public:

Stack();

~Stack() { };

bool Isfull() { return m_top==MAX-1 ;}; //堆栈满则返回TRUE bool Isempty() { return m_top==-1;}; //堆栈空则返回TRUE int Top() { return m_top; };

int TopValue() { return m_node[m_top];};

int GetDataFromIndex(int i) { return m_node[i]; };

int GetIndex() { return m_index; } ;

void SetIndex(int index) { m_index = index; };

int Size() { return m_top+1; };

bool Push(int data);

bool Pop(int * pData);

int MoveToNext();

void OutPrint();

};

class Hanio

{

Stack m_stack[3];

int m_num; //盘数

int m_steps; //移动次数

int m_times; //完成所用时间

void print(char ch,int n);

java课程设计方案Hannoi汉诺塔游戏

java课程设计方案Hannoi汉诺塔游戏

HUBEINORMALUNIVERSITY

Java程序设计

Hannoi塔游戏

论文题目Hannoi塔游戏

学生

指导教师

所在院系

专业名称

完成时间

摘要

《JAVA语言实用教程》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教案环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA语言实用教程》课程后,进行的一次全面的综合训练,JAVA语言实用教程的设计目的是加深对理论教案内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。

目录

一、课程设计任务及要求3

1、课程设计任务3

2、设计要求3

二、需求分析4

1、系统需求分析4

2、系统概述5

3、系统运行环境6

三、设计思路6

概要设计7

四、详细设计7

package Hannoi。7

HannoiWindow类7

AutoMoveDisc类15

Disc类21

HandleMouse类22

Tower类27

TowerPoint 类31

五、运行调试与分析讨论33

六、设计体会与小结36

1.设计体会36

2.小结36

参考文献37

致谢37

一、课程设计任务及要求

1、课程设计任务

设计GUI界面的Hannoi塔游戏,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程。

2、设计要求

(1)有三个表示塔的对象,分别命名为A、B和C。A塔上有

若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A 塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A 塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。

汉诺塔图形演示源代码

汉诺塔图形演示源代码

汉诺塔图形演示源代码

#include

#include

#include

#include

#include

#include

void dizuo();

void hanoi_draw();

void move(int n,int one,int three);

void hanoi(int n,int one,int two,int three); int N; //定义盘数

int m; //定义变量移动速度

RECT r = {240,0,460,240};

TCHAR step[5];

int stepn=0;

int pan[3];

void main()

{

printf("请输入盘子个数:");

scanf("%d",&N); //从键盘输入盘子数

printf("请输入移动速度:(≥500,≤2000)"); scanf("%d",&m); //从键盘输入移动速度initgraph(640,480); //初始化图形

// 设置背景色为蓝色

setbkcolor(BLUE);

// 用背景色清空屏幕

cleardevice();

//制作标头

settextstyle(30,0,_T("宋体"));//设置标头字体

drawtext(_T("汉诺塔动画演示"), &r,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

//显示步骤数

settextstyle(16,0,_T("宋体"));

outtextxy(300,140,"step:");

pan[0]=N; //第一个座初始有N个盘

dizuo(); //画出底座

用VB编写Hanoi塔问题动态演示程序

用VB编写Hanoi塔问题动态演示程序

【 btat R cri sak yt hooyi agrh ei ig H n i rb m i teoesibefr s grc rv A s c 】 eus ei e e nl n loi m ds nn, a o pol s h n ut l o i us et r v c g t g e a un e i o
在递推阶段 ,把较复杂 问题 ( :规模 为 n 的求解推理至较 如 ) 原问题 简单一些 的问题 ( 如规模 为 n 1 的求解 ;在 回归阶 -) 段 ,把递推结 束时所得到的解 ,逐级 返 回,依 次得到稍 复杂
问题 的解 ,最 终 得 到原 问 题 的解 [ 2 1 。
H ni ao 塔问题是一 个典 型的适合于利用递归技 术得到简洁 算法的例子 。Hao 塔问题源 自约 】 ni 9世纪末在 欧洲 出现 的一
● ● … … ● ● ● ● ● ● … … ● ● ● ● … … … ● ● ● … … … ● ●
用V B编写 H ni 问题动态演示程序 ao 塔
徐 晓琴 ,徐 勇
( 安徽财经大学信息工程学院 ,蚌埠 2 34 ) 3 0 1 摘 要 : 递 归技术是算法设计过程 中的一个重要技术 ,H ni 问题是一个典型的适合 用递 归技术求解的 问题。将 ao 塔
种 游 戏 ,游 戏 中首 先 在 一 块 铜 板 上 放 置 三 根 柱 子 ,在 第 一 根

刍议程序设计教学对学生的积极影响

刍议程序设计教学对学生的积极影响

刍议程序设计教学对学生的积极影响

促使我写这篇文章的是一名参加信息学奥赛辅导的学生对我讲的一句话,他说:“老师,以往我做数学题最会出现的失误就是对于多种情况的解考虑不全面;但自从学习程序设计尤其是用多了CASE分支语句后,发现自己能自然而然地考虑可能的各种情况了,这可真是意外的收获。”学生已经体会到学习程序设计导致了数学能力的提高,很是令人欣慰。通过开展程序设计教学能使学生获益的远不止上面讲的这个,这种教学方式更是能激发学生主动学习和积极进取。

结构化程序设计就是按照人的思维方式将计算任务拆解成顺序、选择和循环三种基本结构的容易理解的有机组合,从而进行程序设计。至今程序设计的观念不管发生过什么变化,但顺序、选择和循环这三种基本的结构是不变的。因此,在程序设计教学中一般都会有以下几点强调:

(1)程序的质量好坏首先取决于它的结构,其次才是它的运行速度、界面等其它特性。就好比一座大厦的质量是否过硬取决于它的钢筋混凝土结构是否牢固一样,其次才看外表的装潢。(2)逐步求精和模块化是程序设计的基本方法。首先要对设计的系统有一个全面的详细理解,再而开始逐层分解模块,分解为一条条的详细指令。模块化也就是指把一个大的程序按照一定的原则划分为若干个相对独立但又相关的小程序。(3)不管这个程序中包含多少个模块,顺序、选择和循环的三种基本结构仍然是清晰的结构。

结构化程序设计的过程其实也就是对学生的思维进行训练的过程。在许多常规学科的日常教学中我们并不难发现这样一个现象,不少学生的思维很不清晰,容易混淆、弄错。恰恰这些都是缺乏思维训练的结果。而程序设计的训练不单单只是可以让学生养成良好的程序设计习惯,而且还可以很有效地培养学生思维的条理性和逻辑性。

汉诺塔的动态演示程序

汉诺塔的动态演示程序

‘ 调用移 动子程 序
CalHNT( 一 1 l N ,A ,C,B)
YD A, ‘ C 调用 移动子 程序
Ca n HNT( 一 1 N ,B,A ,C) E d I n f
En d SUb
2 Ha o 塔 问题 的 算 法 分 析 ni
汉诺 ( n i塔 问题 : 印度 , 说有 一 个梵 Ha o) 在 传 塔 , 内有 三根 柱 子 A、 、 A 柱 上 有 6 塔 B C, 4个 盘 子 , 子大小不 等 , 的在 下 , 的在上 , 盘 大 小 有一 个 和 尚想把这 6 盘 子从 A 柱 移 到 C柱 , 每 次 只 4个 但 能允许移 动一个 盘子 , 并且 在 移 动过 程 中 , 求 3 要 个 柱上 的盘子始 终保持 大 盘在下 , 小盘 在上 . 我们 将三根 柱子分 别 标号 为 A、 、 目的 是 B C, 要将 n个盘子从 A柱 子移 动到 C柱 子. 问 题 的 该 算 法如下 : 第一 步 将 A 柱 子上 n 1 盘 子借 助 C柱 一 个 子 移动到 B柱 子上 ; 第二 步 将 A 柱 子上 剩余 的第 n个 盘 子移 动 到 C柱子上 ; 第三 步 将 B柱 子上 的 n 1个 盘 子 借 助 A 一 柱 子移动 到 C柱子 上. 对 于第一步 和 第 三步 , 们 又 可 以利 用类 似 我 的方 法继续 将其求 解过 程设 计 为一 个规 模 为 n 一

洛扎诺夫教学法引入VB教学的几点尝试

洛扎诺夫教学法引入VB教学的几点尝试

洛扎诺夫教学法引入VB教学的几点尝试

1引言

南宋朱熹在《孟子集注》中说:“事必有法,然后可成;师舍是则无以教,弟子舍是则无以学。”可见教学方法在整个教学体系中具有举足轻重的地位。随着教育学和心理学的发展,以及二十世纪以来西方的各种教学理论和教学方法相继传入,传统的教学理念和方法受到极大的冲击。其中“洛扎诺夫教学法”便是由保加利亚心理分析教育专家奥尔基·洛扎诺夫(G. Lozanov)首创的有别于传统教学的新方法,在教学实践中产生了深远的影响。

2洛扎诺夫教学法原理及其技术特点

洛扎诺夫教学法,又称“暗示教学法”(Suggestopedy Teaching),是指“创造高度的机动,建立激发个人潜力的心理倾向,从学生是一个完整的个体角度出发,在学习的交流过程中,力求把各种无意识暗示因素组织起来(Lozanov,1978)”,通过将有意识和无意识高度统一,激发学生的兴趣和自信心,从而产生强烈的内在学习动机,充分调动学生学习积极性,挖掘学生的潜力。洛扎诺夫认为:传统教学低估了学生巨大潜在能力,认为学习者只能吸收教师、教材和教育管理部门所规定的知识范围,只强调刻苦而不注意方法的引导,忽视无意识心理活动和情感在学习中的作用,因而限制了学生潜力的挖掘。

洛扎诺夫教学法的理论源于无意识心理活动,为了开发学生潜力使之达到充分自我发展的目的,有六种暗示技术可以来促进这种活动。

2.1权威性(authority)

使人信从的力量和威望,既指经过时间考验过的观念和教材,也指获得学生尊敬而产生信任感的对象,良好的师生关系具有启智作用,正所谓“亲其师,信其道”。

中职VB课程中递归算法教学探索和思考

中职VB课程中递归算法教学探索和思考

me o sv r o a t u er c rie ag rtm i c l t n esa d a d g a pT ee o ei i n c s ay t p a l t h t d i ey i mp  ̄ n , t h e u s lo i b t v h i df u t o u d r tn n r s . h r f r , s e e s r s e k wel o s i t o d o f h e u s eag rtm. c rie ag r m oi r v esau f e c ig i e VB a dr c ri eta h n o o s meo er c ri lo i t v h r u sv l o i e h t t mp o et tt so a hn t n u sv e c ig i s me h t nh e n o t ep o lmsgv n ter e c i ge p o ain a dr f cin f h r b e ,ie i t a hn x lr t n l t . h o ee o Ke wo d : c ri n E a l; g ik n ; s a t h n i g y r sRe u so ; x mp eI ma e n i gAb t c i kn h t r t
计 算机 光盘 软件 与应 用
2 1 年 第 9期 01

VB制作动画的方法

VB制作动画的方法

VB制作动画的方法

衡阳县职业中专廖金星

VB提供了制作动画的机理和功能,非专业人员也可以用VB轻而易举地制作动画,下面笔者就谈谈使用VB6.0企业版制作动画的方法。

制作动画的原理就是在窗体上显示一幅图形,紧接着清除它,再显示第二幅图形,如此交替下去,只要两相邻图片显示的时间间隔足够短(每秒钟24以上幅图形),利用人眼的视觉效应,就可以产生动画效果。依据动画制作过程中控件属性的变化情况,可将VB中动画制作方法分为以下几种。

一、一、移动控件:在程序设计中,按一定规律更改控件的位置坐标left 、top属性或对控件调用Move方法,可使控件发生相对于窗体的运动,从而呈现出动画效果,如:运行下面的语句就可以看到label1控件中的文字在窗体内呈滚动字幕效果。

Label1.caption=”Welcome you!”

For I=1 to 10000

Label1.left=(label1.left+10) ModscaleWidth

`使控件位置发生变化

Next I

二、切换图形:在程序设计中,通过更改控件的Picture 属性,使程序在一定的时间间隔内连续显示一定数量的只有细微差别的图片,亦可产生动态效果,如在程序中使用两个有差别的飞行过程中的蝴蝶位图:(如下图所示,它们在C:\Program Files\Microsoft Visual Studio\msdn98\98vs\2052\sample\vb98\vcr目录下,现已将它们复制到c:\下)

图1 飞行中的蝴蝶的两个位图

通过计时器控件的控制,交替地将两个位图显示在一个图片框中,就可以实现蝴蝶飞行的动

vb动画设计原理及其实现

vb动画设计原理及其实现

vb动画设计原理及其实现

VisualBasic(简称VB)已经成为最受欢迎的多媒体开发和应用程序设计语言。对它来说,动画设计是展示多媒体效果的一种有效方法。VB具有丰富的动画特性,可以帮助程序员实现多种动画效果。本文旨在探讨VB动画设计的原理及其实现方法。

什么是动画?即可以看到的图像的一种连续变化,通过连续变化的图像生成来实现视觉动画效果。使用VB程序可以简单地表现出一系列动画效果,其中包括静态图像,绘图,字体,图片,声音,视频等等。

为了实现VB中的动画效果,需要开发人员首先了解动画设计原理,这包括结构图、时间表和音乐等。结构图是确定动画的基础,它显示了每个元素在动画中的位置和运动方向,以及动画的开始和结束时间点。时间表描述了每个元素的运动路径,以及它们在每一帧中的位置,大小和旋转状态。音乐可以丰富动画的表现内容,使其更具视觉冲击力。

设计出动画结构图、时间表和音乐后,程序员可以使用VB中的多媒体控件开始编写代码,以便实现动画效果。在VB中,Timer控件是一个很重要的动画控件,它可以控制元素在每一帧之间的切换,从而实现动画效果。有了Timer控件,程序员就可以编写代码来实现动画效果,例如可以用来操作图片、文本和图表。

另外,VB中也提供了一组标准的绘图控件,可以实现各种复杂的动画效果。例如,可以使用VB的画笔控件来绘制精美的动画效果,

一些2D绘图函数可以用来实现更加唯美的线条动画,而OpenGL函数可以实现真实的3D动画效果。

此外,VB还有多种动画控件可以方便地实现动画效果,例如动画系统COM控件,以及Vista动画控件。这些控件可以使用者更容易地实现复杂的动画效果,以及流畅的视觉效果。

基于c#编写汉诺塔游戏

基于c#编写汉诺塔游戏

所需图片:

设计游戏窗体(form1.cs)

创建新Windows应用程序项目,在新窗体上添加1个图片框picturebox1(显示ABC三个柱子背景)、1个文本框textbox1(用来设置盘子的数量)、1个标签label(text设置为盘子数)

添加两个按钮(button)text属性为“开始游戏”和自动演化

实现代码

//代码测试都可以使用不懂联系邮箱:*****************

using System;

using System.Collections.Generic;

using ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections;

namespace 汉诺塔递归

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private int i; //移动的次数

public PictureBox[] Plate = new PictureBox[11];

const int PlateHeight = 17; //盘片厚度

private bool isDragging = false;

private int x1, y1;

private ArrayList A = new ArrayList();

private ArrayList B = new ArrayList();

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识

与技术第5卷第30期(2009年10月)用VB 设计汉诺塔动画游戏

刘德强

(无锡职业技术学院,江苏无锡214024)

摘要:汉诺塔问题是程序设计教学中关于递归调用的经典案例。该文介绍了用VB 设计汉诺塔动画游戏程序的基本过程,其中重点介绍了用VB 的自定义数据类型和图形处理技术设计游戏步点状态记录和动画效果的方法。

关键词:VB ;汉诺塔;动画

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)30-8460-03

The Designing of Hanoi Towers Animation Game by VB

LIU De-qiang

(Wuxi Institute of Technology,Wuxi 214024,China)

Abstract:The Hanoi Towers is a typical case of recursive calls in programming teaching.This paper introduces the basic process of design -ing Hanoi Towers animation game by VB,focuses on recording game state between two steps and designing animation by self-defined data type and graph skill in VB.

Key Words:VB;Hanoi;animation

汉诺塔问题源自印度的一个古老传说,传至现代演变成了汉诺塔游戏:有A 、B 、C 三个垂直杆和若干个大小各不相同的圆片。开始时圆片全部套在A 杆上,且从下至上圆片大小依次递减。要求借助B 杆,将圆片全部移到C 杆上,每次只能移动一片,并且整个过程中三个杆上的圆片都必须保持大的在下小的在上。游戏的难度由开始时放置在A 杆上圆片的个数进行控制。

1游戏步点状态记录设计

笔者设计的汉诺塔游戏程序主要包括演示和游戏两方面的功能。演示功能实现的是根据汉诺塔问题算法预先计算出的圆片移动顺序由计算机自行对圆片进行移动;而游戏功能是指计算机通过人机交互界面根据游戏者的实时操作顺序进行圆片的移动。图1是程序运行时界面。无论是演示还是游戏,计算机执行的基本动作元素是相同的,即圆片从一个杆上移动到另一个杆上,这一过程体现在程序设计中就是在新的位置对圆片图形进行重画,它与每个杆的步点状态密切相关。

步点状态是指每完成一步操作以后,开始下一步操作之前,一个杆上

的圆片数量及各圆片的位置和大小等多个特征综合构成的状态,是多个

数据的集合。将开始时圆片数记为n ,从初始状态圆片都在A 杆上,到终

止状态n 个圆片移到C 杆上,其间每次移动圆片,各杆的步点状态都会

发生变化。游戏进程中“记”住各杆的当前步点状态,是实现不断移动圆片

的关键。以要移动A 杆上的一个圆片到B 杆为例:要判断圆片根据规则

是否可以移动及圆片移动后放置在B 杆的什么位置(y 坐标),就必须知

道当前B 杆上最上端圆片的大小和B 杆上当前圆片数量,即B 杆的当前

步点状态。综合以上分析,游戏步点状态记录是程序设计中的要点。

鉴于描述步点状态需要多个数据,且数据间相互关联并构成整体,笔

者在设计中采用了自定义数据类型的方法,数据类型名称为circles ,所含

内容和定义格式如下:

Type circles

counts As integer

r()As integer

x As integer

y()As integer

End Type

circles 类型中,数据成员counts 用于记录杆上实际圆片数,r 用于记录各圆片的半径,x 记录各圆片圆心的x 坐标,y 记录各圆片圆心的y 坐标。因为每次游戏设置的初始圆片数是不确定的且游戏进程中各杆都可能出现多个圆片,所以数据成员r 和y 定义为动态数组。

数据类型circles 定义以后,先使用该类型定义三个实例a 、b 、c ,分别代表A 、B 、C 三个杆的步点状态。语句如下:

Dim a As circles ,b As circles ,c As circles

当初始圆片数量确定后(记为n),可使用下列语句对A 杆的步点状态a 进行初始化。

投稿日期:2009-08-22

作者简介:刘德强(1965-),江苏靖江人,无锡职业技术学院讲师。

图1运行界面ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.30,October 2009,pp.8460-8462E-mail:xsjl@ Tel:+86-551-569096356909648460

第5卷第30期(2009年10月)

Computer Knowledge and Technology电脑知识与技术

ReDim a.y(n):ReDim a.r(n):a.counts=n

a.x=-330:a.y(1)=-260

For i=1To n

a.r(i)=160-8*i

a.y(i)=-270+i*45

Picture1.Circle(a.x,a.y(i)),a.r(i),vbBlack,,,0.14

Next i

语句中,通过对实例a的各成员进行赋值,确定了A杆上圆片的数量、各圆片的大小和位置,并在相应位置画出了代表各圆片的椭圆图形。程序设计中B杆和C杆的步点状态可参照相同方法进行初始化。

游戏进程中,当圆片从一个杆上移动到另一个杆上,两杆的步点状态会发生变化,新的步点状态可通过下列语句进行记录,以圆片从A杆移到B杆为例:

a.counts=a.counts-1

b.counts=b.counts+1

b.r(b.counts)=a.r(a.counts+1)

Picture1.Circle(b.x,b.y(b counts)),b.r(b.counts),vbBlack,,,0.14

语句中,成员counts记录两个杆上圆片数量的变化,成员r记录新画椭圆的半径。圆片在三个杆间的移动共分六种情况:分别是A→B、A→C、B→C、B→A、C→A和C→B,其余五种情况新的步点状态记录可采用相同方法。

综上所述,尽管各杆的步点状态需要多个数据进行描述,且在游戏进程中不断变化,采用自定义数据类型的方法可方便地对各杆的当前步点状态进行记录。

2游戏动画效果设计

根据前述,汉诺塔游戏的基本动作元素是圆片从一个杆上移到另一个杆上,如果将移动过程设计成动画,将提高游戏的趣味性和观赏性。

和电影原理相似,动画是利用人眼的视觉暂留效应使静止图像或图形产生连续运动和变化效果的一种技术[1],如当相关连的序列画面以30帧/秒左右的速度播放时,人眼所观察到的变化就是连续的。实现动画效果有两个基本要素:一是序列画面相互关连或相同;二是播放速度合适。

在VB程序设计中,实现动画效果可通过在图片或图像控件中以一定的速度装载和卸载关连图像或图形文件序列实现;也可通过以一定的速度对装载了关连图像或图形文件的控件序列的Visible属性进行设置来实现[1];还可以利用VB的画圆(circle)、画线(Line)等方法在关连位置以一定的速度,以背景色和另一种不同颜色不断交替绘制图形的方法来实现。汉诺塔游戏要表现的动画效果是圆片从一个杆移到另一个杆上的连续移动过程,即同一图形相对屏幕的位移,是一种简单的位移动画[1],笔者在设计过程中,采用的是使用circle方法在关连位置交替绘制椭圆的方法(参见图1)。以从A杆上向上取出圆片为例,为表现圆片向上连续移动的动画效果,程序代码为:

For k=20To220-a.y(a.counts)Step20

Picture1.Circle(a.x,a.y(a.counts)+k),a.r(a.counts),vbBlack,,,0.14

delay(delay_m)

Picture1.Circle(a.x,a.y(a.counts)+k),a.r(a.counts),&H8000000F,,,0.14

Next k

程序执行过程中,每次循环计算机将在同一位置先后画同样大小但颜色不同的椭圆两次,先黑色(vbBlack),再背景色(&H8000000F),两次之间有一定的时间间隔,产生的视觉效果是黑色圆片在该位置先出现后消失,又随循环次数增加,所画椭圆位置会随变量k变化而不断上移,产生的综合视觉效果是黑色圆片连续向上移动。设计过程中,为使圆片的移动看上去更加平滑,所达到的动画效果更加逼真,可对循环语句的步长和延时过程delay中的参数delay_m进行调整。

汉诺塔游戏中圆片的移动方向可概括为向上、平移和向下共三种,其余两种可采用相同原理进行动画效果设计。

3演示功能设计

演示功能主要是给游戏者提供操作步骤参考,设计演示功能先要设计汉诺塔问题算法、并依据其计算出移动圆片的顺序。

对汉诺塔问题进行分析,将A杆上n个圆片全部移到C杆上,可以分解成以下三个相对容易的新问题:

1)先将n-1个圆片,借助C杆,由A杆移到B杆上;

2)再将A杆上留下的1个圆片移到C杆上;

3)接着将B杆上n-1个圆片,借助A杆,移到C杆上。

三个新问题中1个圆片的移动是单步骤就能直接完成的已知操作,而n-1个圆片的移动又可以采用相同方法进一步分解成n-2个圆片和1个圆片的移动。依此类推,经过层层分解,每次分解出的新问题中要移动的圆片数不断减少,最终都将分解成1个圆片的移动。上述分解过程是典型的递归过程。

用递归方法解决问题,在VB程序设计中是通过设计和调用递归Sub过程来实现的。根据上述分析,汉诺塔问题的递归算法可设计为:

Private Sub moves(n as integer,pole_a as string,pole_b as string,pole_c as string)

If n=1Then

move_str1=move_str1&pole_a&pole_c

Else

Call moves(n-1,pole_a,pole_c,pole_b)

Call moves(1,pole_a,pole_b,pole_c)

Call moves(n-1,pole_b,pole_a,pole_c)

本栏目责任编辑:谢媛媛

8461

软件设计开发

相关文档
最新文档