1.实验目的和要求:
本次实验的要求是通过自学VB语言编写一个两人对弈的象棋游戏,程序编写思路清晰且能运行。实验旨在让学生真正体会到开发一个完整程序的过程。进一步培养学生主动发现问题、认识问题、分析问题及解决问题的能力,提高自学能力和上机动手能力。
2.实验内容:
1.编程前的准备:网上查找一些合适的棋盘和棋子,再找一些相关的图片已备实验所需。网上下载一个单机象棋小游戏,熟悉游戏的界面以及游戏的规则 ,初步形成编程的流程图。网上查找一些用VB编好的象棋游戏的源代码作为参照,了解编程的过程和一些编程技巧。
2.编程时的注意事项:插入图片时要规范,所有棋子的大小以及位置都要一致,上下左右都要对齐,这样在写程序代码时处理数据更方便。棋子的位置在编写程序中很重要,所以处理图片时记录所有棋子的位置以备编写程序所需,且棋子的位置最好数据简单无小数点,这样误差更小,程序运行更不容易出错。开始编的时候功能不需太繁琐,先编成一个可以运行可以判输赢的初步程序,再继续加功能是可行的好办法,这样在检查程序出错的问题所在时更方便。
3.编程后的补充:认真对照实验要求的功能,分析出程序还未达到的功能,添加功能,形成一个符合要求的象棋游戏,完善程序。
3.软件概要设计说明,功能模块及流程和工作原理:
象棋游戏主要是注重游戏规则,每个棋子有自己游戏规则,比如马走日字,相(象)走田字等,编程的重点也是约束各个棋子的下棋规则。本软件通过坐标形式来限制棋子的规则。坐标的确定方式是棋子离棋盘最上方和最左方的长度,即top和left来确定各个棋子的坐标,坐标形成一个二维数组,来规范各个棋子的行动范围。本软件设计的另一重点是判胜利方,有三个判定方法,一个就是黑方的将或红方的帅被吃,另一个是黑方除将外的子全被吃或红方除帅外的子全被吃,最后一个是利用时钟判定,哪方的累计思考时间超过规定的时间则判输。本软件一个可取之处是设计简单,容易理解,没有复杂的算法。通过直接的方式规定游戏规则,通过直接的方式判别优胜方,虽然处理数据的过程繁琐,但功能算齐全,程序运行时不容易出错。
功能模块:可以通过键盘或鼠标选中棋子,可以通过键盘或鼠标移动棋子。可以吃子,可以求和,可以弃权,可以重新游戏。
流程:按游戏中的开始,开始对局游戏,在对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜负或走成和棋为止。
工作原理:游戏的界面过程就类似与一张坐标纸,每个棋子就像坐标纸上相应的点,通过限制每个点的活动范围来构成每个棋子的游戏规则。游戏的执行过程类似于坐标的重新定位以及运算。
4.软件详细设计、关键技术与难点、测试数据
软件详细设计:1.将准备好的棋盘以image方式插入,将准备好的棋子以数组方式插入,数组从棋盘左上到棋盘右下方依次为0至89。初始化时要摆放旗子的位置以image方式插入相应棋子的图片,不需摆放棋子的位置也以image方式插入图片,插入的图片为空。这样这个棋盘上的各个位置棋子都可达。插入图片时,要注意各个图片在棋盘上的规范性,每张图片的height和width属性应该相同,且对应棋子的坐标要规范,top和left属性也要相对应。将棋盘上的位置处理完后,还要处理被吃棋子的位置,被吃棋子最多为双方都只剩下黑将和红帅。所以被吃棋子对多有30个,这30个图片定义为棋子的数组中,标号为90至119,这些图片也是以image方式插入图片,插入的图片为空。
2.插入时钟控制信号,黑方插入Timer1,红方插入Timer2。整个Form1的界面设计完成。
3.开始Form1的代码编写,开始棋子位置初始化,被吃棋子位置初始化,根据各个棋子的坐标来控制各个棋子的位置,时钟控制信号初始化。当点击游戏界面的菜单栏的开始时,也进行所有的初始化。
4.通过控制坐标规定各个棋子的游戏规则。将所有类型的棋子的坐标限制都列出来,通过语句来规范棋子的下棋规则。棋子的下棋规则规范后,再规定哪些子属于红方,哪些子属于黑方,当红方的子碰到黑方的子,或是黑方的子碰到红方的子则属于吃子,如果黑方碰到黑方或是红方碰到红方则不能走。
5.判定优胜方,在对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜负或走成和棋为止。判定优胜方有3种方法,一种就是黑方的将或红方的帅被吃,另一种是黑方除将外的子全被吃或红方除帅外的子全被吃,最后一种是利用时钟判定,哪方的累计思考时间超过规定的时间则判输。
6.象棋的基本功能完善后,对照试验的要求完善附加功能。
关键技术与难点:关键技术是通过二维数组完成整个程序的控制,棋子通过一维数组来控制每种棋子的下棋规则,通过时钟控制来作为另一种判优胜的条件。难点是设计擂台赛,自学VB的过程中,没有关注擂台赛的设计过程,所以设计擂台赛时不能想到一个可行的办法记录最高分。
测试数据:各个棋子由top和left构成的坐标,以及各个快捷键。
5.软件使用说明:
按run键或F2键开始游戏,由执红棋的一方先走。
选择棋子: 1.键盘操作:用方向键←、→、↓、↑移动光标,Enter键选中棋子。
2.鼠标操作:移动鼠标,按鼠标左键,选中棋子。
移动棋子: 1.键盘操作:用方向键←、→、↓、↑移动光标,Enter键选落子。空格键:放弃。
2.鼠标操作:鼠标左键按下时移动鼠标,放开鼠标左键击落子,右键放弃。
落子后,检测:如果不符合游戏走子规则,则重新操作。否则,棋子落定,并按游戏规则吃子。
6.实习的收获、心得、问题、困难和建议:
这次的实习上课时间很少,上课学到的东西也少,可是课外学习的时间比较多,可能就是因为这个原因,所以同学之间的差距比较大。自觉的人很早就已经把实验完成了,不自觉的人硬是等到最后一周开始拼命编程,我觉得两者都有利弊,而我就属于折中的。我并没有开始就兴趣盎然地开始编,我这个人实践能力不是很强,经常实验前都会把书好好啃一遍,啃完觉得差不多才会开始编程,因为这样我就吃过不少苦头。就拿这次实验来说,象棋的编程思想并不复杂,只是数据处理很繁琐,我把书看过一遍后并没有立马就想出利用坐标top和left的属性来编写程序,这个想法是经别人提醒才恍然大悟的,所以我比别人晚很久才开始思路清晰起来,后面就等到最后一周才开始编,所以程序编得有些仓促,很多功能还不够完善,书上学得东西也没有用到实践当中,多浪费了时间在课本上,只剩下少许的时间来实践,编出来的程序可想而知毛病很多,比别人的程序也没有多大差别和优势,所以有点感觉就是输在了起跑线上。不过通过这次实习能认识到这一点我觉得还是难能可贵的,所以这实习最大的收获就是认识到实践比理论更重要,实践并不一定需要太充足的理论,但是理论是建立在实践的基础上的。虽然这些话很多人会认为不太正确,但是对我还是挺适用的,很多东西都是因人而异的。
这次的认识实习目的很明确,实验的目的和要求也很明确,但我还是碰到了很多问题,刚拿到实验题目,就被象棋那两个字给吓到了,感觉平时下象棋的时候感觉都挺困难的,更别说是编程序了,象棋很多规则都感觉很难控制,以至于刚开始就走进了一个误区,妄想通过像高级程序设计语言那样通过太直观的方式编好程序,可是又想不出用什么样的语句来控制,所以纠结了很久才从误区中走出。还有碰到的一个问题是开始摆放棋子是没有太注意top和left的值,虽然每个棋子都放入相应的位置,且对齐地很规范,但是每个棋子的top和left的属性值都含有多个小数点,象棋处理数据的过程本来就很复杂,这样小数点一多,处理起来就更复杂,所以我不得不重新定位各个棋子,又重新将各个棋子的top和left属性记录下来,这个工程挺浩大的,浪费了我很多时间,也浪费了我很多精力,所以硬是休息了两天才开始继续完成程序的编写。所以干很多事情都要前后照应,在开始就要想好各个重要的因素,免得做无用功。
这次的实习用VB语言实施,我觉得还是挺不错的,因为VB简单,可以让我们在短短的3周熟悉并且学以致用,虽然VB的可用度不高,但是重要的不是掌握好这门语言,主要的是熟悉实验的整个流程,了解软件开发所要思考的问题。对于本次实验我觉得不足之处就是老师没有起到很好的指导作用,上课时间都安排在第一周,第一周往往很多人都还没做好准备,待到准备充足后,自然课程也已经结束,所以上课时间没有起到很大的作用。我建议将上课时间押后至第二周或第三周,上课时间不要太拥挤,不要一个礼拜就将所有的课程匆匆结束,这样没有效果反而让学生更懒散。其实我认为学习的另一个弊端是实验的难易程度不同,造成很多同学不认真也可以编出好程序,很多同学因为程序难很认真也编不出可以运行的程序,所以建议老师实习过程以更小的小组为单位实施,小组可以3到5个人,每组的编写游戏可以再大型点,每个小组组员自己分配任务,这样实习过程不枯燥,还可以体现团队的力量,实验中的收获也就会更多。
因篇幅问题不能全部显示,请点此查看更多更全内容