游戏程序设计教程第4章 游戏的运行机制(2)
- 格式:ppt
- 大小:269.50 KB
- 文档页数:17


本书是游戏编程畅销书作者André LaMothe的扛鼎之作,从游戏编程和软件引擎的角度深入探讨了3D图形学的各个重要主题。
全书共分5部分,包括16章的内容。
第1~3章简要地介绍了Windows和DirectX编程,创建了一个Windows应用程序模板,让读者能够将精力放在游戏逻辑和图形实现中,而不用考虑Windows和DirectX方面的琐事;第4~5章简要地介绍了一些数学知识并实现了一个数学库,供以后编写演示程序时使用;第6章概述了3D图形学,让读者对本书将介绍的内容有大致的了解;第7~11章分别介绍了光照、明暗处理、仿射纹理映射、3D裁剪和深度缓存等内容;第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。
本书适合于有一定编程经验并想从事游戏编程工作或对3D图形学感兴趣的人员阅读。
作者:拉莫泽译者目录:第一部分3D游戏编程简介第1章3D游戏编程入门21.1简介21.22D/3D游戏的元素31.2.1初始化31.2.2进入游戏循环31.2.3读取玩家输入41.2.4执行AI和游戏逻辑41.2.5渲染下一帧41.2.6同步显示41.2.7循环41.2.8关闭51.3通用游戏编程指南71.4使用工具91.4.13D关卡编辑器121.4.2使用编译器131.5一个3D游戏范例:Raiders 3D151.5.1事件循环331.5.2核心3D游戏逻辑341.5.33D投影351.5.4星空361.5.5激光炮和碰撞检测371.5.6爆炸371.5.7玩Raiders3D371.6总结37第2章Windows和DirectX简明教程382.1Win32编程模型382.2Windows程序的最小需求392.3一个基本的Windows应用程序432.3.1Windows类432.3.2注册Windows类472.3.3创建窗口472.3.4事件处理程序482.3.5主事件循环522.3.6构建实时事件循环552.4DirectX和COM简明教程562.4.1HEL和HAL572.4.2DirectX基本类582.5COM简介592.5.1什么是COM对象602.5.2创建和使用DirectX COM接口612.5.3查询接口622.6总结64第3章使用虚拟计算机进行3D游戏编程653.1虚拟计算机接口简介653.2建立虚拟计算机接口663.2.1帧缓存和视频系统663.2.2使用颜色703.2.3缓存交换713.2.4完整的虚拟图形系统733.2.5I/O、声音和音乐733.3T3DLIB游戏控制台743.3.1T3DLIB系统概述743.3.2基本游戏控制台743.4T3DLIB1库793.4.1DirectX图形引擎体系结构793.4.2基本常量793.4.3工作宏813.4.4数据类型和结构813.4.5函数原型843.4.6全局变量883.4.7DirectDraw接口893.4.82D多边形函数923.4.9数学函数和错误函数973.4.10位图函数993.4.118位调色板函数1023.4.12实用函数1043.4.13BOB(Blitter对象)引擎1063.5T3DLIB2 DirectX输入系统1123.6T3DLIB3声音和音乐库1163.6.1头文件1173.6.2类型1173.6.3全局变量1173.6.4DirectSound API封装函数1183.6.5DirectMusic API封装函数1213.7建立最终的T3D游戏控制台1243.7.1映射真实图形到虚拟接口的非真实图形124 3.7.2最终的T3DLIB游戏控制台1263.8范例T3LIB应用程序1343.8.1窗口应用程序1343.8.2全屏应用程序1353.8.3声音和音乐1363.8.4处理输入1363.9总结139第二部分3D数学和变换第4章三角学、向量、矩阵和四元数1424.1数学表示法1424.22D坐标系1434.2.12D笛卡尔坐标1434.2.22D极坐标1444.33D坐标系1474.3.13D笛卡尔坐标1474.3.23D柱面坐标1494.3.33D球面坐标1504.4三角学1514.4.1直角三角形1514.4.2反三角函数1534.4.3三角恒等式1534.5向量1544.5.1向量长度1554.5.2归一化1554.5.3向量和标量的乘法1554.5.4向量加法1564.5.5向量减法1574.5.6点积1574.5.7叉积1594.5.8零向量1604.5.9位置和位移向量1604.5.10用线性组合表示的向量161 4.6矩阵和线性代数1614.6.1单位矩阵1624.6.2矩阵加法1634.6.3矩阵的转置1634.6.4矩阵乘法1644.6.5矩阵运算满足的定律165 4.7逆矩阵和方程组求解1654.7.1克来姆法则1674.7.2使用矩阵进行变换1684.7.3齐次坐标1694.7.4应用矩阵变换1704.8基本几何实体1764.8.1点1764.8.2直线1764.8.3平面1794.9使用参数化方程1824.9.12D参数化直线1824.9.23D参数化直线1844.10四元数简介1894.10.1复数理论1894.10.2超复数1934.10.3四元数的应用1974.11总结200第5章建立数学引擎2015.1数学引擎概述2015.1.1数学引擎的文件结构2015.1.2命名规则2025.1.3错误处理2035.1.4关于C++的最后说明2035.2数据结构和类型2035.2.1向量和点2035.2.2参数化直线2045.2.33D平面2065.2.4矩阵2065.2.5四元数2095.2.6角坐标系支持2105.2.72D极坐标2105.2.83D柱面坐标2115.2.93D球面坐标2115.2.10定点数2125.3数学常量2135.4宏和内联函数2145.4.1通用宏2185.4.2点和向量宏2185.4.3矩阵宏2195.4.4四元数2205.4.5定点数宏2215.5函数原型2215.6全局变量2245.7数学引擎API清单2255.7.1三角函数2255.7.2坐标系支持函数2265.7.3向量支持函数2285.7.4矩阵支持函数2355.7.52D和3D参数化直线支持函数245 5.7.63D平面支持函数2485.7.7四元数支持函数2525.7.8定点数支持函数2595.7.9方程求解支持函数2635.8浮点单元运算初步2655.8.1FPU体系结构2665.8.2FPU堆栈2665.8.3FPU指令集2685.8.4经典指令格式2705.8.5内存指令格式2715.8.6寄存器指令格式2715.8.7寄存器弹出指令格式2715.8.8FPU范例2715.8.9FLD范例2725.8.10FST范例2725.8.11FADD范例2735.8.12FSUB范例2755.8.13FMUL范例2765.8.14FDIV范例2785.9数学引擎使用说明2795.10关于数学优化的说明2805.11总结280第6章3D图形学简介2826.13D引擎原理2826.23D游戏引擎的结构2826.2.13D引擎2836.2.2游戏引擎2836.2.3输入系统和网络2846.2.4动画系统2846.2.5碰撞检测和导航系统2876.2.6物理引擎2886.2.7人工智能系统2896.2.83D模型和图像数据库2896.33D坐标系2916.3.1模型(局部)坐标2916.3.2世界坐标2936.3.3相机坐标2966.3.4有关相机坐标的说明3026.3.5隐藏物体(面)消除和裁剪3036.3.6透视坐标3086.3.7流水线终点:屏幕坐标3156.4基本的3D数据结构3216.4.1表示3D多边形数据时需要考虑的问题322 6.4.2定义多边形3236.4.3定义物体3276.4.4表示世界3306.53D工具3316.6从外部加载数据3326.6.1PLG文件3336.6.2NFF文件3356.6.33D Studio文件3386.6.4Caligari COB文件3436.6.5Microsoft DirectX .X文件3456.6.63D文件格式小结3456.7基本刚性变换和动画3456.7.13D平移3456.7.23D旋转3466.7.33D变形3476.8再看观察流水线3486.93D引擎类型3496.9.1太空引擎3496.9.2地形引擎3506.9.3FPS室内引擎3516.9.4光线投射和体素引擎3526.9.5混合引擎3536.10将各种功能集成到引擎中3536.11总结353第7章渲染3D线框世界3547.1线框引擎的总体体系结构3547.1.1数据结构和3D流水线3557.1.2主多边形列表3577.1.3新的软件模块3597.2编写3D文件加载器3597.3构建3D流水线3677.3.1通用变换函数3677.3.2局部坐标到世界坐标变换3727.3.3欧拉相机模型3757.3.4UVN相机模型3777.3.5世界坐标到相机坐标变换3877.3.6物体剔除3907.3.7背面消除3937.3.8相机坐标到透视坐标变换3957.3.9透视坐标到屏幕(视口)坐标变换3997.3.10合并透视变换和屏幕变换4037.4渲染3D世界4057.53D演示程序4087.5.1单个3D三角形4087.5.23D线框立方体4117.5.3消除了背面的3D线框立方体4137.5.43D坦克演示程序4147.5.5相机移动的3D坦克演示程序4167.5.6战区漫步演示程序4187.6总结421第三部分基本3D渲染第8章基本光照和实体造型4248.1计算机图形学的基本光照模型4248.1.1颜色模型和材质4268.1.2光源类型4328.2三角形的光照计算和光栅化4378.2.1为光照做准备4418.2.2定义材质4428.2.3定义光源4458.3真实世界中的着色4498.3.116位着色4498.3.28位着色4508.3.3一个健壮的用于8位模式的RGB模型4508.3.4一个简化的用于8位模式的强度模型4538.3.5固定着色4578.3.6恒定着色4598.3.7Gouraud着色概述4728.3.8Phong着色概述4748.4深度排序和画家算法4758.5使用新的模型格式4798.5.1分析器类4798.5.2辅助函数4828.5.33D Studio MAX ASCII格式.ASC4848.5.4TrueSpace ASCII.COB格式4868.5.5Quake II二进制.MD2格式概述4948.63D建模工具简介4958.7总结497第9章插值着色技术和仿射纹理映射4989.1新T3D引擎的特性4989.2更新T3D数据结构和设计4999.2.1新的#defines4999.2.2新增的数学结构5019.2.3实用宏5029.2.4添加表示3D网格数据的特性5039.2.5更新物体结构和渲染列表结构5089.2.6函数清单和原型5119.3重新编写物体加载函数5179.3.1更新.PLG/PLX加载函数5179.3.2更新3D Studio .ASC加载函数5279.3.3更新Caligari .COB加载函数5289.4回顾多边形的光栅化5329.4.1三角形的光栅化5329.4.2填充规则5359.4.3裁剪5379.4.4新的三角形渲染函数5389.4.5优化5429.5实现Gouraud着色处理5439.5.1没有光照时的Gouraud着色5449.5.2对使用Gouraud Shader的多边形执行光照计算553 9.6基本采样理论5609.6.1一维空间中的采样5609.6.2双线性插值5619.6.3u和v的插值5639.6.4实现仿射纹理映射5649.7更新光照/光栅化引擎以支持纹理5669.8对8位和16位模式下优化策略的最后思考571 9.8.1查找表5719.8.2网格的顶点结合性5729.8.3存储计算结果5729.8.4SIMD5739.9最后的演示程序5739.10总结576第10章3D裁剪57710.1裁剪简介57710.1.1物体空间裁剪57710.1.2图像空间裁剪58010.2裁剪算法58110.2.1有关裁剪的基本知识58110.2.2Cohen-Sutherland裁剪算法58510.2.3Cyrus-Beck/梁友栋-Barsky裁剪算法586 10.2.4Weiler-Atherton裁剪算法58810.2.5深入学习裁剪算法59010.3实现视景体裁剪59110.3.1几何流水线和数据结构59210.3.2在引擎中加入裁剪功能59310.4地形小议61110.4.1地形生成函数61210.4.2生成地形数据61910.4.3沙地汽车演示程序61910.5总结623第11章深度缓存和可见性62411.1深度缓存和可见性简介62411.2z缓存基础62611.2.1z缓存存在的问题62711.2.2z缓存范例62711.2.3平面方程法63011.2.4z坐标插值63111.2.5z缓存中的问题和1/z缓存63211.2.6一个通过插值计算z和1/z的例子63311.3创建z缓存系统63511.4可能的z缓存优化64911.4.1使用更少的内存64911.4.2降低清空z缓存的频率65011.4.3混合z缓存65111.5z缓存存在的问题65111.6软件和z缓存演示程序65211.6.1演示程序I:z缓存可视化65211.6.2演示程序II:Wave Raider65311.7总结658第四部分高级3D渲染第12章高级纹理映射技术66012.1纹理映射——第二波66012.2新的光栅化函数66712.2.1最终决定使用定点数66712.2.2不使用z缓存的新光栅化函数668 12.2.3支持z缓存的新光栅化函数67012.3使用Gouruad着色的纹理映射671 12.4透明度和alpha混合67712.4.1使用查找表来进行alpha混合678 12.4.2在物体级支持alpha混合功能688 12.4.3在地形生成函数中加入alpha支持69412.5透视修正纹理映射和1/z缓存69612.5.1透视纹理映射的数学基础69612.5.2在光栅化函数中加入1/z缓存功能702 12.5.3实现完美透视修正纹理映射70712.5.4实现线性分段透视修正纹理映射710 12.5.5透视修正纹理映射的二次近似714 12.5.6使用混合方法优化纹理映射71812.6双线性纹理滤波71912.7Mipmapping和三线性纹理滤波724 12.7.1傅立叶分析和走样简介72512.7.2创建Mip纹理链72712.7.3选择mip纹理73412.7.4三线性滤波73912.8多次渲染和纹理映射74012.9使用单个函数来完成渲染工作74112.9.1新的渲染场境74112.9.2设置渲染场境74312.9.3调用对渲染场境进行渲染的函数74512.10总结753第13章空间划分和可见性算法75413.1新的游戏引擎模块75413.2空间划分和可见面判定简介75413.3二元空间划分75713.3.1平行于坐标轴的二元空间划分75813.3.2任意平面空间划分75913.3.3使用多边形所在的平面来划分空间760 13.3.4显示/访问BSP树中的每个节点76213.3.5BSP树数据结构和支持函数76313.3.6创建BSP树76513.3.7分割策略76713.3.8遍历和显示BSP树77513.3.9将BSP树集成到图形流水线中78413.3.10BSP关卡编辑器78513.3.11BSP的局限性79313.3.12使用BSP树的零重绘策略79413.3.13将BSP树用于剔除79513.3.14将BSP树用于碰撞检测80213.3.15集成BSP树和标准渲染80213.4潜E.5微软公司的Direct X 多媒体展示?80813.4.2潜在可见集的其他编码方法809 13.4.3流行的PVS计算方法81013.5入口81113.6包围体层次结构和八叉树81313.6.1使用BHV树81513.6.2运行性能81613.6.3选择策略81713.6.4实现BHV81813.6.5八叉树82513.7遮掩剔除82513.7.1遮掩体82613.7.2选择遮掩物82613.7.3混合型遮掩物选择方法82713.8总结827第14章阴影和光照映射82814.1新的游戏引擎模块82814.2概述82814.3简化的阴影物理学82914.4使用透视图像和广告牌来模拟阴影83214.4.1编写支持透明功能的光栅化函数83314.4.2新的库模块83514.4.3简单阴影83714.4.4缩放阴影83914.4.5跟踪光源84114.4.6有关模拟阴影的最后思考84414.5平面网格阴影映射84514.5.1计算投影变换84514.5.2优化平面阴影84814.6光照映射和面缓存技术简介84814.6.1面缓存技术85014.6.2生成光照图85014.6.3实现光照映射函数85114.6.4暗映射(dark mapping)85314.6.5光照图特效85414.6.6优化光照映射代码85414.7整理思路85414.8总结854第五部分高级动画、物理建模和优化第15章3D角色动画、运动和碰撞检测85815.1新的游戏引擎模块85815.23D动画简介85815.3Quake II .MD2文件格式85915.3.1.MD2文件头86115.3.2加载Quake II .MD2文件86815.3.3使用.MD2文件实现动画87415.3.4.MD2演示程序88215.4不基于角色的简单动画88315.4.1旋转运动和平移运动88315.4.2复杂的参数化曲线移动88515.4.3使用脚本来实现运动88515.53D碰撞检测88715.5.1包围球和包围圆柱88715.5.2使用数据结构来提高碰撞检测的速度88815.5.3地形跟踪技术88915.6总结890第16章优化技术89116.1优化技术简介89116.2使用Microsoft Visual C++和Intel VTune剖析代码892 16.2.1使用Visual C++进行剖析89216.2.2分析剖析数据89316.2.3使用VTune进行优化89416.3使用Intel C++编译器89916.3.1下载Intel的优化编译器90016.3.2使用Intel编译器90016.3.3使用编译器选项90116.3.4手工为源文件选择编译器90116.3.5优化策略90216.4SIMD编程初步90216.4.1SIMD基本体系结构90316.4.2使用SIMD90316.4.3一个SIMD 3D向量类91216.5通用优化技巧91816.5.1技巧1:消除_ftol()91816.5.2技巧2:设置FPU控制字91816.5.3技巧3:快速将浮点变量设置为零91916.5.4技巧4:快速计算平方根91916.5.5技巧5:分段线性反正切92016.5.6技巧6:指针递增运算92016.5.7技巧7:尽可能将if语句放在循环外面92116.5.8技巧8:支化(branching)流水线92116.5.9技巧9:数据对齐92116.5.10技巧10:将所有简短函数都声明为内联的92216.5.11参考文献92216.6总结922第六部分附录附录A光盘内容简介CD: 924附录B安装DirectX和使用Visual C/C++CD: 925B.1安装DirectXCD: 925B.2使用Visual C/C++编译器CD: 925B.3编译提示CD: 926附录C三角学和向量参考CD: 927C.1三角学CD: 927C.2向量CD: 929C.2.1向量长度CD: 930C.2.2归一化CD: 930C.2.3标量乘法CD: 930C.2.4向量加法CD: 931C.2.5向量减法CD: 931C.2.6点积CD: 932C.2.7叉积CD: 933C.2.8零向量CD: 934C.2.9位置向量CD: 934C.2.10向量的线性组合CD: 934附录DC++入门CD: 935D.1C++是什么CD: 935D.2必须掌握的C++知识CD: 937D.3新的类型、关键字和约定CD: 937D.3.1注释符CD: 937D.3.2常量CD: 937D.3.3引用型变量CD: 938D.3.4即时创建变量CD: 938D.4内存管理CD: 939D.5流式输入/输出CD: 939D.6类CD: 941D.6.1新结构CD: 941D.6.2一个简单的类CD: 942D.6.3公有和私有CD: 942D.6.4类的成员函数(方法)CD: 943D.6.5构造函数和析构函数CD: 944D.6.6编写构造函数CD: 945D.6.7编写析构函数CD: 946D.7域运算符CD: 947D.8函数和运算符重载CD: 948D.9基本模板CD: 950D.10异常处理简介CD: 951D.11总结CD: 954附录E游戏编程资源CD: 955E.1游戏编程和新闻网站CD: 955E.2下载站点CD: 955E.32D/3D引擎CD: 956E.4游戏编程书籍CD: 956E.5微软公司的Direct X 多媒体展示CD: 956 E.6新闻组CD: 957E.7跟上行业的步伐CD: 957E.8游戏开发杂志CD: 957E.9Quake资料CD: 957E.10免费模型和纹理CD: 957E.11游戏网站开发者CD: 957附录FASCII码表CD: 959。
摘要VisualBasic 6.0 是一款可视化的,面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发windows 环境下的种类应用程序。
它简单易学,效率高,且功能强大,可以与Windows专业开发工具相媲美。
在VisualBasic环境下,利用事出有因件驱动的编程机制,新颖易用的可视化工具,使用Windows内部的广泛应用程序接口(API)函数,运用动态链接库(DLL),对象的链接与嵌入(OLE),开放式数据连接(ODBC)等技术,可以高效,可以快速地开发Windows环境不功能强大,图形界面丰富的程序。
为了适应信息化时代的需求,各高校对大多数专业都开设了一定的计算机语言课程,有的讲授VisualBasic语言。
VisualBasic以其语法简单,可视化设计,功能强大,为许多学校计算机语言课程的首选语言。
目前国内各出版了大量的VisualBasic语言教程,它们都具有同样的特点:介绍语言的语法等基本知识,再辅助一些简单的示例。
学生通过学习,可能能够考一个不错的成绩,但所掌握的仍然是一些支离破碎的知识,不能将所有的知识融会贯通,遇到具体的程序设计,还是无从下手。
这次我要做的是计算器,通过这样程序设计,我们可以学到好多关于VB语言的使方法,熟悉VisualBasic 6.0的运行环境,快速掌握VB语言!小小的计算器是我们学VB初级语言的最好课程。
目录一功能描述 (3)1.功能 (3)2. 实验目的 (3)二概要设计 (4)1.界面设计 (4)2.程序运行 (5)三设计结果 (6)四程序源代码 (7)五设计总结 (40)六参考文献 (41)一功能描述1.功能可以简单进行简单的坦克大战游戏,从而实现坦克战争的模拟。
2.实验目的这次我要做的是坦克大战小游戏,通过这样程序设计,我们可以学到好多关于VB语言的使方法,熟悉VisualBasic 6.0的运行环境,快速掌握VB语言!二概要设计1.界面设计2.程序运行:三、设计结果生成可执行程序运行结果四、程序源代码:Dim CChange As BooleanDim OldX As LongDim OldY As LongDim WwW As LongDim WwW2 As LongDim HP1 As LongDim HP2 As LongPrivate Declare Function sndPlaySound Lib "winmm" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As LongPrivate Const SND_ASYNC = &H1Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerDim L(99999) As erfDim L2(99999) As erfDim W(9999) As erf2Dim w2(9999) As erf2Dim P(9999) As erf2 Dim P2(9999) As erf2 Private Type PosX As IntegerY As Integer End TypePrivate Type erfY As IntegerColor As LongEnd TypePrivate Type erf2 Grow As Integer Damage As Integer X As IntegerY As IntegerOldX As Integer OldY As IntegerXF As IntegerYF As Integer Color As Longtype As Longtag As Longactive As BooleanSize As LongLife As IntegerGrav As IntegerEnd TypeDim Movement As IntegerDim Turn As BooleanPrivate Sub Command1_Click()Turn = TrueEnd SubPrivate Sub Form_Load()Dim Temp As Integer'Picks which layoutTemp = MsgBox("Grass - Dirt - Mars", vbYesNoCancel, "?") If Temp = 7 ThenMe.BackColor = RGB(40, 40, 40)End IfIf Temp = 2 ThenMe.BackColor = RGB(100, 0, 0)End If'Sets defaultsMovement = 50HP1 = 100HP2 = 100Me.Height = Screen.HeightMe.Width = Screen.WidthTurn = TrueMe.ClsMe.Picture = NothingMe.RefreshMe.AutoRedraw = True'Sets wheel positionsFor i = 0 To 3W(i).XF = 0W(i).YF = 0W(i).X = i * 10 + 100W(i).Y = 2W(i).Color = RGB(125, 125, 125)w2(i).XF = 0w2(i).YF = 0w2(i).X = i * 10 + Me.ScaleWidth - 200w2(i).Y = 2w2(i).Color = RGB(125, 125, 125)NextL(0).Y = Me.ScaleHeight / 4 * 3Randomize'Me.Caption = Temp (DEBUG)'Sets up groundFor i = 1 To Me.WidthIf Temp = 6 ThenL(i).Y = L(i - 1).Y + Int(Rnd * 4) - Int(Rnd * 4)L(i).Color = RGB(0, 160 + Int(Rnd * 25), 0)ElseIf Temp = 7 ThenL(i).Y = L(i - 1).Y + Int(Rnd * 6) - Int(Rnd * 6)L(i).Color = RGB(30 + Int(Rnd * 25) - Int(Rnd * 25), 30 + Int(Rnd * 25) - Int(Rnd * 25), 0) ElseIf Temp = 2 ThenL(i).Y = L(i - 1).Y + Int(Rnd * 8) - Int(Rnd * 8)L(i).Color = RGB(160 + Int(Rnd * 25), 0, 0)End IfEnd IfEnd IfNextFor i = 0 To 10If Temp = 6 Thenff = Int(Rnd * Screen.Width)Boom Int(ff), 0, 10, 15, 0, 0, 1End IfIf Temp = 7 Thenff = Int(Rnd * Screen.Width)Boom Int(ff), 0, 20, 20, 0, 0, 1End IfIf Temp = 2 Thenff = Int(Rnd * Screen.Width)Boom Int(ff), 0, 30, 30, 0, 0, 1ff = Int(Rnd * Screen.Width)Boom Int(ff), 0, 30, 30, 0, 0, 1End IfNextFor i = 2 To Me.Width - 8 Step 1L(i).Y = (L(i - 1).Y + L(i).Y + L(i + 1).Y + L(i - 2).Y + L(i + 2).Y) / 5NextMe.AutoRedraw = TrueFor i = 2 To Me.WidthMe.DrawWidth = 3Me.Line (i - 2, L(i).Y)-(i - 2, Me.ScaleHeight), L(i).ColorNextMe.RefreshMe.AutoRedraw = FalseTimer1.Enabled = TrueEnd SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)Movement = 50Turn = Not TurnIf Turn = True ThenShape1.Visible = TrueElseShape2.Visible = TrueEnd IfLine1.Visible = TruelblStrength.Visible = TrueOldX = W(0).X 'xOldY = W(0).Y 'yIf Turn = True ThenLine1.X1 = W(0).X + 20Line1.Y1 = W(0).Y - 30ElseLine1.X1 = w2(0).X + 20Line1.Y1 = w2(0).Y - 30End IfLine1.X2 = XLine1.Y2 = YIf Turn = True ThenShape1.Left = Line1.X2 - Shape1.Width / 2 Shape1.Top = Line1.Y2 - Shape1.Height / 2 ElseShape2.Left = Line1.X2 - Shape1.Width / 2 Shape2.Top = Line1.Y2 - Shape1.Height / 2 End IfDim Pos1 As PosDim Pos2 As PosPos1.X = Line1.X2Pos2.X = Line1.X1Pos1.Y = Line1.Y2Pos2.Y = Line1.Y1lblStrength.Move Shape1.Left, Shape1.Top - lblStrength.HeightlblStrength.Caption = "Strength: " & ((Abs(Line1.X1 - Line1.X2) + Abs(Line1.Y1 - Line1.Y2)) / 2 & "| Angle " & GetAngle(Pos1, Pos2))End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)If Button <> 0 ThenLine1.X2 = XLine1.Y2 = YIf 1 = 1 Then '((Abs(Line1.X1 - Line1.X2) + Abs(Line1.Y1 - Line1.Y2)) / 2) < 150 ThenIf Turn = True ThenLine1.X1 = W(0).X + 20Line1.Y1 = W(0).Y - 30ElseLine1.X1 = w2(0).X + 20Line1.Y1 = w2(0).Y - 30End IfLine1.X2 = XLine1.Y2 = Y'Shape1.Left = Line1.X2 - Shape1.Width / 2'Shape1.Top = Line1.Y2 - Shape1.Height / 2If Turn = True ThenShape1.Left = Line1.X2 - Shape1.Width / 2Shape1.Top = Line1.Y2 - Shape1.Height / 2ElseShape2.Left = Line1.X2 - Shape1.Width / 2Shape2.Top = Line1.Y2 - Shape1.Height / 2End IfIf Turn = True ThenlblStrength.Move Shape1.Left, Shape1.Top - lblStrength.HeightElselblStrength.Move Shape2.Left, Shape2.Top - lblStrength.HeightEnd IfDim Pos1 As PosDim Pos2 As PosPos1.X = Line1.X2Pos2.X = Line1.X1Pos1.Y = Line1.Y2Pos2.Y = Line1.Y1lblStrength.Caption = "Strength: " & ((Abs(Line1.X1 - Line1.X2) + Abs(Line1.Y1 - Line1.Y2)) / 2 & "| Angle " & GetAngle(Pos1, Pos2))End IfEnd IfEnd SubPrivate Sub NewMissle(X As Integer, Y As Integer, Color As Long, Typee As Integer, XF As Integer, YF As Integer)'Creates a new missleFor i = 0 To 99If P(i).active = False ThenP(i).X = XP(i).Y = YP(i).XF = XFP(i).YF = YFP(i).type = TypeeP(i).Color = ColorP(i).active = TrueIf Typee = 1 ThenP(i).Damage = 10End IfIf Typee = 2 ThenP(i).Damage = 30End IfIf Typee = 3 ThenP(i).Damage = 10End IfIf Typee = 4 ThenP(i).Damage = 10End IfIf Typee = 5 ThenP(i).Damage = 5End IfIf Typee = 6 ThenP(i).Damage = 20End IfExit SubEnd IfNextEnd SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Call sndPlaySound(ByVal App.Path & "/boom.wav", SND_ASYNC)Dim TypeR As IntegerTypeR = 1If Turn = True Then'Zorders which ammo player thing ;) z = 0Label2(0).ZOrder 0Label3(0).ZOrder 0Label4(0).ZOrder 0Label5(0).ZOrder 0Label6(0).ZOrder 0Elsez = 1Label2(1).ZOrder 0Label3(1).ZOrder 0Label4(1).ZOrder 0Label5(1).ZOrder 0Label6(1).ZOrder 0End IfLine1.Visible = False lblStrength.Visible = FalseIf Option2.Value = True ThenIf Label2(z).Caption > 0 Then TypeR = 2Label2(z).Caption = Label2(z).Caption - 1 ElseOption1.Value = TrueEnd IfEnd IfIf Option3.Value = True ThenIf Label3(z).Caption > 0 ThenTypeR = 3Label3(z).Caption = Label3(z).Caption - 1 ElseOption1.Value = TrueEnd IfEnd IfIf Option4.Value = True ThenIf Label4(z).Caption > 0 ThenTypeR = 4Label4(z).Caption = Label4(z).Caption - 1 ElseOption1.Value = TrueEnd IfEnd IfIf Option5.Value = True ThenIf Label5(z).Caption > 0 ThenTypeR = 5Label5(z).Caption = Label5(z).Caption - 1ElseOption1.Value = TrueEnd IfEnd IfIf Option6.Value = True ThenIf Label6(z).Caption > 0 ThenTypeR = 6Label6(z).Caption = Label6(z).Caption - 1ElseOption1.Value = TrueEnd IfEnd If'Turn = FalseWwW = 6If Turn = True ThenNewMissle W(0).X + 20, W(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10, (Line1.Y2 - Line1.Y1) / 10If TypeR = 4 ThenNewMissle W(0).X + 20, W(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) -Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle W(0).X + 20, W(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle W(0).X + 20, W(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle W(0).X + 20, W(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)End IfElseNewMissle w2(0).X + 20, w2(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10, (Line1.Y2 - Line1.Y1) / 10If TypeR = 4 ThenNewMissle w2(0).X + 20, w2(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle w2(0).X + 20, w2(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle w2(0).X + 20, w2(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle w2(0).X + 20, w2(0).Y - 10, vbRed, TypeR, (Line1.X2 - Line1.X1) / 10 + Int(Rnd * 10) - Int(Rnd * 10), (Line1.Y2 - Line1.Y1) / 10 + Int(Rnd * 10) - Int(Rnd * 10)End IfEnd IfEnd SubPrivate Sub Boom(X As Integer, Y As Integer, Size As Integer, dig As Integer, Dam As Integer, Optional Invert As Integer, Optional NoDraw As Integer)If X < 1 Then Exit SubCall sndPlaySound(ByVal App.Path & "/boom2.wav", SND_ASYNC)On Error Resume NextIf X + Size / 2 > w2(0).X And X - Size / 2 < w2(3).X ThenHP2 = HP2 - DamCall sndPlaySound(ByVal App.Path & "/hit.wav", SND_ASYNC)End IfIf X + Size / 2 > W(0).X And X - Size / 2 < W(3).X ThenHP1 = HP1 - DamCall sndPlaySound(ByVal App.Path & "/hit.wav", SND_ASYNC)End IfMe.DrawWidth = 1For i = 0 To Screen.WidthL2(i).Y = L(i).YNextFor i = 0 To SizeIf Invert = 1 ThenL(X + i).Y = L(X + i).Y - digElseL(X + i).Y = L(X + i).Y + dig - iEnd IfNextFor i = 1 To SizeIf Invert = 1 ThenL(X - i).Y = L(X - i).Y - digElseL(X - i).Y = L(X - i).Y + dig - iEnd IfNextMe.AutoRedraw = False'Me.Cls'Me.Picture = NothingMe.RefreshMe.AutoRedraw = TrueIf NoDraw <> 1 ThenFor i = 2 To Me.Width Step 1If L2(i).Y <> L(i).Y ThenL2(i).Y = (L2(i - 1).Y + L2(i).Y + L2(i + 1).Y + L2(i - 2).Y + L2(i + 2).Y) / 5Me.Line (i - 2, 0)-(i - 2, Me.ScaleHeight), Me.BackColorMe.Line (i - 2, L(i).Y)-(i - 2, Me.ScaleHeight), L(i).ColorEnd IfNextEnd IfMe.AutoRedraw = FalseEnd SubPrivate Sub NewPart(Sizee As Integer, X As Integer, Y As Integer, OX As Integer, OY As Integer, Grow As Integer, Color As Long, XF As Long, YF As Long, Life As Integer, Grav As Integer)For i = 0 To 900If P2(i).active = False ThenP2(i).active = TrueP2(i).Size = SizeeP2(i).X = XP2(i).Y = YP2(i).XF = XFP2(i).YF = YFP2(i).OldX = OXP2(i).OldY = OYP2(i).Grow = GrowP2(i).Color = ColorP2(i).Life = LifeP2(i).Grav = GravExit ForEnd IfNextEnd SubPrivate Sub Timer1_Timer()If HP1 < 0 ThenMsgBox "Player 2 Wins!"HP1 = 0EndEnd IfIf HP2 < 0 ThenMsgBox "Player 1 Wins!"HP2 = 0EndEnd IfL(2).Y = 999If hp11.Caption <> "Health: " & HP1 Then hp11.Caption = "Health: " & HP1End IfIf hp22.Caption <> "Health: " & HP2 Then hp22.Caption = "Health: " & HP2End IfIf CChange = True ThenMe.RefreshEnd IfCChange = FalseIf HP1 > 0 ThenIf GetAsyncKeyState(vbKeyRight) Then Movement = Movement - 1CChange = TrueIf Movement > 0 ThenIf Turn = False ThenFor i = 0 To 3If L(W(3).X - 2).Y - 10 < L(W(3).X + 2).Y Then W(i).XF = W(i).XF + 2End IfIf W(i).Y + W(i).YF > L(W(i).X - 2).Y ThenW(i).Y = L(W(i).X - 2).Y - 1End IfNextElseFor i = 0 To 3If L(w2(3).X - 2).Y - 10 < L(w2(3).X + 2).Y Then w2(i).XF = w2(i).XF + 2End IfIf w2(i).Y + w2(i).YF > L(w2(i).X - 2).Y Thenw2(i).Y = L(w2(i).X - 2).Y - 1End IfNextEnd IfEnd IfEnd IfIf GetAsyncKeyState(vbKeyLeft) Then Movement = Movement - 1CChange = TrueIf Movement > 0 ThenIf Turn = False ThenFor i = 0 To 3On Error Resume NextIf L(W(0).X - 2).Y - 8 < L(W(0).X - 4).Y Then W(i).XF = W(i).XF - 2ElseW(i).XF = W(i).XF + 1End IfIf W(i).Y + W(i).YF > L(W(i).X - 2).Y ThenW(i).Y = L(W(i).X - 2).Y - 1End IfNextElseFor i = 0 To 3On Error Resume NextIf L(w2(0).X - 2).Y - 8 < L(w2(0).X - 4).Y Then w2(i).XF = w2(i).XF - 2Elsew2(i).XF = w2(i).XF + 1End IfIf w2(i).Y + w2(i).YF > L(w2(i).X - 2).Y Then w2(i).Y = L(w2(i).X - 2).Y - 1End IfNextEnd IfEnd IfEnd IfEnd IfFor i = 0 To 3W(i).X = W(i).X + W(i).XF / 2W(i).XF = W(i).XF * 0.5If i = 1 ThenIf W(i).Y - 20 > W(0).Y ThenW(i).Y = W(0).Y + 20W(i).YF = 0 'W(i).Yf / 2W(i).Y = (W(i).Y + W(i + 1).Y) / 2End IfEnd IfIf i = 2 ThenIf W(i).Y - 20 > W(3).Y ThenW(i).Y = W(3).Y + 20W(i).YF = 0 'W(i).Yf / 2End IfEnd IfOn Error Resume NextIf W(i).Y + W(i).YF < L(W(i).X - 2).Y Then W(i).YF = W(i).YF + 1W(i).Y = W(i).Y + W(i).YFCChange = TrueElseIf W(i).YF > 3 ThenW(i).Y = L(W(i).X - 2).Y - 1W(i).YF = -W(i).YF * 0.5CChange = TrueEnd IfEnd IfMe.DrawWidth = 8Me.Line (W(i).X, W(i).Y)-(W(i).X, W(i).Y), W(i).Color 'w2(i).X = w2(i).X + w2(i).XF / 2w2(i).XF = w2(i).XF * 0.5If w2(i).Y + w2(i).YF < L(w2(i).X - 2).Y Thenw2(i).YF = w2(i).YF + 1w2(i).Y = w2(i).Y + w2(i).YFElseIf w2(i).YF > 3 Thenw2(i).Y = L(w2(i).X - 2).Y - 1w2(i).YF = -w2(i).YF * 0.5End IfEnd IfMe.DrawWidth = 8Me.Line (w2(i).X, w2(i).Y)-(w2(i).X, w2(i).Y), w2(i).Color'NextMe.DrawWidth = 1For i = 0 To 2For z = 0 To 2If HP1 > 0 ThenMe.Line (W(i).X, W(i).Y)-(W(i + 1).X, W(i + 1).Y), vbBlack End IfMe.Line (w2(i).X, w2(i).Y)-(w2(i + 1).X, w2(i + 1).Y), vbBlack NextNextIf HP1 > 0 ThenMe.Line (W(0).X, W(0).Y)-(W(0).X, W(0).Y - 15), vbBlack Me.Line (W(3).X, W(3).Y)-(W(3).X, W(3).Y - 15), vbBlack Me.Line (W(0).X, W(0).Y - 5)-(W(3).X, W(3).Y - 5), vbBlack End IfMe.Line (w2(0).X, w2(0).Y)-(w2(0).X, w2(0).Y - 15), vbBlackMe.Line (w2(3).X, w2(3).Y)-(w2(3).X, w2(3).Y - 15), vbBlackMe.Line (w2(0).X, w2(0).Y - 5)-(w2(3).X, w2(3).Y - 5), vbBlackFor F = 0 To 15 Step 2If HP1 > 0 ThenMe.Line (W(0).X, W(0).Y - F)-(W(3).X, W(3).Y - F), RGB(122, 122, 122) End IfMe.Line (w2(0).X, w2(0).Y - F)-(w2(3).X, w2(3).Y - F), RGB(122, 122, 122) NextF = 15If HP1 > 0 ThenMe.Line (W(0).X, W(0).Y - F)-(W(3).X, W(3).Y - F), vbBlackEnd IfMe.Line (w2(0).X, w2(0).Y - F)-(w2(3).X, w2(3).Y - F), vbBlack'ddddddddddddddFor i = 0 To 300If P2(i).active = True ThenCChange = TrueMe.DrawWidth = P2(i).SizeIf Check1.Value = 1 ThenMe.Line (P2(i).X, P2(i).Y)-(P2(i).OldX, P2(i).OldY), P2(i).Color End IfP2(i).OldX = P2(i).XP2(i).OldY = P2(i).YP2(i).Life = P2(i).Life - 1P2(i).Size = P2(i).Size + P2(i).GrowP2(i).X = P2(i).X + P2(i).XFP2(i).YF = P2(i).YF + P2(i).GravP2(i).Y = P2(i).Y + P2(i).YFIf P2(i).Life <= 0 ThenP2(i).active = FalseEnd IfEnd IfNextFor i = 0 To 3If Abs(W(i).YF) > 3 Or Abs(W(i).XF) > 3 ThenCChange = TrueEnd IfIf Abs(w2(i).YF) > 3 Or Abs(w2(i).XF) > 3 ThenCChange = TrueEnd IfNextFor i = 0 To 90If P(i).active = True Thenttt = 100 + Int(Rnd * 40)NewPart 5, P(i).X + Int(Rnd * 10) - Int(Rnd * 10), P(i).Y + Int(Rnd * 10) - Int(Rnd * 10), P(i).X, P(i).Y, 7, RGB(ttt, ttt, ttt), 0, 0, 8, 0CChange = TrueMe.DrawWidth = 3P(i).YF = P(i).YF + 1P(i).OldX = P(i).XP(i).OldY = P(i).YP(i).X = P(i).X + P(i).XFP(i).Y = P(i).Y + P(i).YFOn Error Resume NextIf P(i).Y + P(i).YF > L(P(i).X - 2).Y ThenP(i).active = FalseIf P(i).type <> 5 ThenIf P(i).X > 0 ThenNewPart 40, P(i).X, P(i).Y + 20, P(i).X, P(i).Y + 20, 5, RGB(200 + Int(Rnd * 10), 0, 0), 0, 0, 30, 0 NewPart 20, P(i).X, P(i).Y + 20, P(i).X, P(i).Y + 20, 5, RGB(190 + Int(Rnd * 50), 30 + Int(Rnd * 50), 0), 0, 0, 30, 0NewPart 5, P(i).X, P(i).Y + 20, P(i).X, P(i).Y + 20, 4, RGB(200 + Int(Rnd * 55), 200 + Int(Rnd * 55), 0), 0,0, 30, 0End IfEnd IfIf P(i).X > 0 ThenNewPart 8 + Int(Rnd * 3) - Int(Rnd * 3), P(i).X, P(i).Y, P(i).X, P(i).Y, 0, L(P(i).X - 2).Color, Int(Rnd * 10) - Int(Rnd * 10), -10 + -Int(Rnd * 10), 30 + Int(Rnd * 6) - Int(Rnd * 6), 1NewPart 8 + Int(Rnd * 3) - Int(Rnd * 3), P(i).X, P(i).Y, P(i).X, P(i).Y, 0, L(P(i).X - 2).Color, Int(Rnd * 10) - Int(Rnd * 10), -10 + -Int(Rnd * 10), 30 + Int(Rnd * 6) - Int(Rnd * 6), 1NewPart 8 + Int(Rnd * 3) - Int(Rnd * 3), P(i).X, P(i).Y, P(i).X, P(i).Y, 0, L(P(i).X - 2).Color, Int(Rnd * 10) - Int(Rnd * 10), -10 + -Int(Rnd * 10), 30 + Int(Rnd * 6) - Int(Rnd * 6), 1NewPart 8 + Int(Rnd * 3) - Int(Rnd * 3), P(i).X, P(i).Y, P(i).X, P(i).Y, 0, L(P(i).X - 2).Color, Int(Rnd * 10) - Int(Rnd * 10), -10 + -Int(Rnd * 10), 30 + Int(Rnd * 6) - Int(Rnd * 6), 1NewPart 8 + Int(Rnd * 3) - Int(Rnd * 3), P(i).X, P(i).Y, P(i).X, P(i).Y, 0, L(P(i).X - 2).Color, Int(Rnd * 10) - Int(Rnd * 10), -10 + -Int(Rnd * 10), 30 + Int(Rnd * 6) - Int(Rnd * 6), 1End IfIf P(i).type = 1 ThenBoom P(i).X - 2, P(i).Y, 30, 35, P(i).DamageEnd IfIf P(i).type = 2 ThenBoom P(i).X - 2, P(i).Y, 40, 60, P(i).DamageEnd IfIf P(i).type = 3 ThenBoom P(i).X - 2, P(i).Y, 10, 20, P(i).DamageIf P(i).tag < 3 ThenP(i).active = TrueP(i).YF = -P(i).YF * 1P(i).XF = 0P(i).tag = P(i).tag + 1ElseP(i).tag = 0End IfEnd IfIf P(i).type = 4 ThenBoom P(i).X - 2, P(i).Y, 20, 20, P(i).DamageEnd IfIf P(i).type = 5 ThenBoom P(i).X - 2, P(i).Y, 10, 60, P(i).Damage, 1End IfIf P(i).type = 0 ThenBoom P(i).X - 2, P(i).Y, 30, 350, P(i).DamageEnd IfIf P(i).type = 6 ThenBoom P(i).X - 2, P(i).Y, 30, 30, P(i).DamageNewMissle P(i).X, P(i).Y - 10, vbRed, 1, Int(Rnd * 20) - Int(Rnd * 20), -5 + Int(Rnd * 10) - Int(Rnd * 10)NewMissle P(i).X, P(i).Y - 10, vbRed, 1, Int(Rnd * 20) - Int(Rnd * 20), -5 + Int(Rnd * 10) - Int(Rnd * 10) NewMissle P(i).X, P(i).Y - 10, vbRed, 1, Int(Rnd * 20) - Int(Rnd * 20), -10 + Int(Rnd * 10) - Int(Rnd * 10)End IfEnd IfMe.DrawWidth = 3Me.Line (P(i).X, P(i).Y)-(P(i).OldX, P(i).OldY), P(i).ColorEnd IfNextEnd SubPrivate Function GetAngle(Pos As Pos, CenterPos As Pos) As IntegerDim intA As Integer, intB%, intC%Dim PI As DoublePI = Atn(1) * 4intB = Abs(CenterPos.X - Pos.X)intC = Abs(CenterPos.Y - Pos.Y)If intB <> 0 ThenGetAngle = Atn(intC / intB) * 180 / PIEnd IfIf Pos.X < CenterPos.X ThenIf Pos.Y = CenterPos.Y Then GetAngle = 180 If Pos.Y < CenterPos.Y ThenGetAngle = 180 - GetAngleEnd IfIf Pos.Y > CenterPos.Y ThenGetAngle = 180 + GetAngleEnd IfEnd IfIf Pos.X > CenterPos.X ThenIf Pos.Y > CenterPos.Y ThenGetAngle = 360 - GetAngleEnd IfEnd IfIf Pos.X = CenterPos.X ThenIf Pos.Y < CenterPos.Y ThenGetAngle = 90End IfIf Pos.Y > CenterPos.Y ThenGetAngle = 270End IfEnd IfGetAngle = Abs(GetAngle Mod 360)End FunctionPrivate Sub Timer2_Timer()'//Clouds, not fully working so removed'NewPart 20, -40, 100, -40, -40, 0, vbWhite, 6, 0, 200, 0'NewPart 23, -50, 90, -40, -40, 0, vbWhite, 6, 0, 200, 0End Sub五、设计总结经过这学期VB的学习,使我对VB有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,虽然学校开的VB是选修课,但它的实用性和通用性很强大,不比学过的C语言差,因为是面向对象,所以很直观,学习中也可以发现很多乐趣,也激起了学习VB的兴趣;因为是初学,对VB的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对VB中经常出现的错误也不了解,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,为了适应信息化时代的需求,各高校对大多数专业都开设了一定的计算机语言课程,有的讲授VisualBasic语言。