还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
五子棋游戏实验报告课程名称计算机程序设计(VB)学号____________________姓名班级提交时间Private SubPicturel_MouseDownButton As Integer,Shift AsInteger,X AsSingle,Y AsSinglem=ClntXn=ClntYIf ClntX=-7And ClntX=7And ClntY=7And ClntY=-7And wuziqi=True ThenPicturel.FillStyle=0If blackwhite=True And am,n=0ThenPicturel.FillColor=QBColorOPicturel.Circle m,n,
0.3,QBColorOam,n=1该白方++“走”Labell.Caption=wblackwhite=FalseEnd IfIfblackwhite=False And am,n=0ThenPicturel.FillColor=QBColor15Picturel.Circle m,n,
0.3,QBColor15am,n=2该黑方-+“走”LabeM.Caption=b+blackwhite=TrueFori=m-4TomIf ai,n=1And ai+1,n=1And ai+2,n=1And ai+3,n=1And ai+4,n=1Then黑方胜利!”MsgBox”wuziqi=FalseExit SubEnd IfIf ai,n=2And ai+1,n=2And ai+2,n=2And ai+3,n=2And ai+4,n=2Then白方胜利!MsgBox”wuziqi=FalseExit SubEndIfNextForj=n-4TonIf am,j=1And am,j+1=1And am,j+2=1And am,j+3=1And am,j+4=1Then黑方胜利!”MsgBox”wuziqi=FalseExit SubEndIfIf am,j=2And am,j+1=2And am,j+2=2And am,j+3=2And am,j+4=2Then白方胜利!MsgBox”wuziqi=FalseExit SubEndIfNextFor i=4ToO Step-1Ifam-i,n+i=1And am-i+l,n+i-1=1And am-i+2,n+i-2=1And am-i+3,n+i-3=1Andam-i+4,n+i-4=1Then黑方胜利!”MsgBox”wuziqi=FalseExit SubEndIfIfam-i,n+i=2And am-i+1,n+i-1=2And am-i+2,n+i-2=2And am-i+3,n+i-3=2Andam-i+4,n+i-4=2Then白方胜利!”MsgBox”wuziqi=FalseExit SubEndIfNextFori=4ToO Step-1Ifam+i,n+i=1Andam+i-1,n+i-1=1Andam+i-2,n+i-2=1Andam+i-3,n+i-3=1Andam+i-4,n+i-4=1Then黑方胜利!”MsgBox”wuziqi=FalseExit SubIfam+i,n+i=2Andam+i-1,n+i-1=2Andam+i-2,n+i-2=2Andam+i-3,n+i-3=2Andam+i-4,n+i-4=2Then白方胜利!MMsgBox”wuziqi=FalseExit SubEndIfNextEnd IfEnd Sub保存棋局Private Sub_ClickForm
3.ShowEnd Sub打开已保存棋局Private Sub_ClickForm
4.ShowEnd Sub悔棋Private Sub_ClickIf wuziqi=True Thenam,n=0Call paintEndIfEnd Sub保存棋局文件Private Sub_ClickCommonDialogl.Filter=H*.wzq/*.wzqnCommonDialogl.Action=2Open CommonDialogl.FileName ForOutput As#1Print#1,wuziqiFor i=-7To7For j=-7To7If ai,j0ThenPrint#1,iPrint#1,jPrint#1,ai,jPrint#1,bPrint#1,wEnd IfNextNextClose#1End Sub打开棋局文件Private Sub_ClickFor i=-7To7For j=-7To7ai,j=0NextCommonDialogl.Filter=H*.wzq/*.wzqnCommonDialogl.Action=1Open CommonDialogl.FileName ForInput As#1Line Input#1,strwzqwuziqi=CBoolstrwzqDo WhileNot EOF1Line Input#1,striLine Input#1,stijLine Input#1,straLine Input#1,strbLine Input#1,strwaValstri,Valstrj=ValstraLoopClose#1Call paintEndSubDim recountAs IntegerPrivate Sub Command1_ClickWith Datal、五子棋棋.DatabaseName=App.Path+才七保#库.mdb”Keitl输入存档棋局名称:五子棋棋库”.RecordSource=.RefreshIf TrimText1,Text=,H,Then确定棋局名不能为空”MsgBox.Exit SubEndIfIf.Recordset.RecordCou nt0Then・Recordset.MoveLastrecount=.RecordsetRecordCount.Recordset.MoveFirstFor i=1To recount“棋局名=If.Recordset.Fields Textl.TextThen.Recordset.DeleteEnd IfIf Not.Recordset.EOF Then.Recordset.MoveNextEnd IfNextEndIfFor i=-7To7For j=-7To7()If a i,j0Then.Recordset.AddNew・(棋局名),Recordset Fields(执黑棋者”)==Textl.Text.RecordsetFields b,Recordset.Fieldsf1执白棋者”)=w.Recordset.Fields(坐标)X=i(坐标)=.Recordset.FieldsY j.Recordset.Fields(”该点状态值)=()(a i,j.Recordset.Fields下棋状态)=wuziqi.Recordset.UpdateEnd IfNextNextUnloadMeEnd WithEnd SubDim recountAsInteger()Private SubForm_LoadCombol.Text=请选择所要扪开的根局:选择所要打开的棋局”不rarstrfile=M、五子棋棋库五子棋棋With Datal.DatabaseName=App.Path+.mdb”.Recordsource=库”.Refresh决定If.Recordset.RecordCount0Then・Recordset.MoveLast recount=.Recordset.RecordCount・Recordset.MoveFirstFor i=1To recount(“棋局名)(棋局名”)If.ResrdsetFieldsstrfile Thenstrfile=.Recordset.FieldsCombol.Additem strfileEndIfIf Not.Recordset.EOF Then.Recordset.MoveNextEnd IfEndWithEndSub()Private SubCommand1_ClickFor i=-7To7For j=-7To7()ai,j=0NextNextWith Datal,五子棋棋库.DatabaseName=App.Path+.mdb”五子棋棋库”.RecordSource=.RefreshIf.Recordset.RecordCou nt0Then,Recordset.MoveLastrecount=.Recordset.RecordCou nt.Recordset.MoveFirstFor i=1To recount(棋局名)If.Recordset.Fields=Combol.Text Then((坐标).坐标))(该点状态值”)a.Recordset.Fields XRe8rdset.Fields Y”=.Re8rdset.FieldsEnd IfIfNot.Recordset.EOF Then.Recordset.MoveNextEnd IfNext・Recordset.MoveFirstFor i=1To recount(棋局名)If.Recordset.Fields=Combol.Text Then(下棋状态”)wuziqi=.Recordset.Fields五子棋软件设计
一、实验目的通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的
1.同学需及早向教师提出自己的想法及设计方案通过开辟一个较大的系统,增强软件开辟能力
2.通过调试系统,增强逻辑思维能力
3.
二、实验内容基本要求
1.输入两个对手名字,然后进入游戏界面1用鼠标点击的方式在棋盘上摆放棋子,黑白交替棋盘215*15可以悔棋3五子连在一起的时候能判断胜利,并且显示出胜利者的名字4能够将棋局的结果保存,保存该棋局结束的状态、对手名字、棋局名字棋局名字5在保存时由用户在相应的界面下添入此功能要求用数据库和文件两种技术实现o棋局能够恢复,即重新打开,打开后浮现棋局结束的状态、对手名字此功能要求用数据库6和文件两种技术实现其它要求
2.界面友好、漂亮1程序尽可能无2bug程序茁壮性强,基本上达到无论用户如何操作,软件都不出错,都有相应的处理方法3设计步骤
3.首先做界面1界面包括几个窗体,窗体上有相应的控件因为需要画棋盘,所以必须有图形容器,这里用框picturebox第一个窗体是登陆界面,因为玩家姓名需要在程序中不断变换,因此需要将玩家名定义成两个变量,又因为这两个变量在几个窗体中都用到,所以在模块中定义为全局变量当五子棋主界面启动之后,首先系统要自动绘制棋盘思路用直线绘制棋盘一■直线是由点绘制的一每一个点都有坐标--改变坐标系为用户坐标系用户坐标系的定义要在窗体启动时实现坐标系的两个顶点坐标的确定?2考虑到五子棋确定棋盘坐标系顶点为卜15*15,8,8,8,-8棋子的绘制与存储棋子的绘制用实心圆模式,颜色为黑色及白色两种3棋子在内存中的存储方式因为表示各个棋子的数据类型都相同,所以考虑用数组存储,因为棋盘是二维的,因此棋子用二维数组存储表示用户坐标的棋子状态,表示此处无a ai,j ij0棋子,表示此处为黑子,表示此处为白子,下棋初始时,棋盘所有位置的初始12Exit ForEndIfIfNot.Recordset.EOF Then.Recordset.MoveNextEnd IfNextEndIfEnd WithCallpaintUnload MeEndSub状态都为0()下棋子的步骤鼠标点击棋盘交叉点附近的位置,系统应实现自动识别鼠标点击位置附近4的交叉点解决方法坐标系的变换已经将棋盘交叉点坐标整数化,因此系统所需要实现的功能即是将鼠标所点击的位置坐标化为整数即可,例如将()变成(・)在交叉点上交替下黑白棋
6.2,-
5.36,5子解决方法定义一个逻辑数据类型变量该变量的值为真时下黑子,为假时下白子,blackwhite,每下一个棋子,该变量的值都要取反()NOT判断赢棋每次下子时都必须进行赢棋判断,判断的依据是个子按照横线、竖线或者斜线连成5一行解决方法层循环2当有一方胜利时,棋局结束,此时在棋盘上继续点击,将再也不下棋解决方法设置一个逻辑变量其值为真时说明棋局没有结束,可以在棋盘上放棋子,该wuziqi,值为假时,说明该棋局结束,不能放棋子()五子棋保存棋局6思路保存棋局的功能即把内存中与棋局相关的数据(棋局名称、棋子位置、棋子颜色、棋局状态(即棋局是否结束))存入外存中,以便以后能够恢复棋局保存的实现用两种技术实现文件和数据库采用数据库技术实现棋局保存数据库设计数据表字段棋局名、坐标、坐标、该点状态值、下棋状态x y每条记录表示棋盘上一个存储的点的信息要实现用数据库保存数据,就必须使程序连接到数据库上,这里用的是控件,通过在程序data中对控件属性的设置来连接数据库、数据表data首先判断如果输入的棋局名和当前记录的棋局名相等,说明表中有输入棋局名对应的棋局信息,将其删除,判断过程是将用户输入的棋局名(字符串)从记录集(即表)的棋局字段顶端至下逐一比较在表的最后,也就是最后一条记录后加之新保存棋局的各条记录因为棋盘上空点居多,大部份点的信息为因此只需保存有棋子的点的信息0,用文件技术进行棋局保存,思路相同()五子棋恢复棋局7思路首先从数据库文件中找到要恢复棋局的数据(即曾经保存的数据),然后把这些数据赋值给内存中相应的数组或者变量中,按照这些数据重新绘制棋盘和棋子,即完成为了对棋局的恢复窗体启动事件应该完成的事情组合框中应该显示曾经保存的棋局名因为每次保存棋局时,都是将棋局所有棋子的记录添加在表的最后,因此表中关于棋局名的记录只能是类似于的形式,而不可能是aaabbbbccccc的形式,根据这个特点编程序取出表中不同的棋局名abbcacc具体算法用一个字符串变量初始值为空,从表的顶端向下挨次挪移记录指针,如果当前记录的棋局strfile名字段和不相等,说明进入另一个棋局的记录中,将该棋局记录的棋局名赋值给并strfile strfile,加入到组合框中,向来到表中最后一个记录因为要从数据库中取出相关数据到数组中,因此要将数组所有数据清零a a要建立一个控件,与数据库连接起来,而后识别棋局(即表中的棋局名字段与在列表框中data选择的棋局名比较,将数据库该棋局中所有信息都赋值给数组及相关变量a刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现,该子过程定义在模块中思路如下清屏一绘制棋盘一根据数组中的每一项的两个下标来决定绘制棋子的位置,根据每一项的值a是还是来决定在该位置绘制何颜色的棋子12决定该黑白方走的变量当时没有保存,可以采用在数据库中保存的方式来解决,本例blackwhite中解决方法是通过数黑白棋子个数来决定恢复棋局后该谁走的因此设置了一个变量做计数器,每走一步棋计数器的值加一用文件技术实现棋局恢复,思路相同悔棋8悔一步棋用几个变量来表示关于一步棋的几个信息,每次下子都将该子的信息赋值给那几个变量,悔一步棋即将那几个变量所表示的点的数组信息清零而后调用过程重画a paint以上是教师带着学生完成的软件功能遗留问题保存棋手姓名和棋局名并在恢复棋局的时候显示需要同学们自己完成思路在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似
三、设计日期十二月十二月
五、实验体味其实,一开始学习我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,vb当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情起初,我对待这门新课程和其他课程一样,保持着必须认真听讲的决心但是由于理论课太过枯燥,没学几次,我就败下阵来,开始有一节没一节的听,但是心里还是存有愧疚,就得自己不该这样懒惰,所以总是坐在前边几排坐位上,逼着自己一定要学些什么,这总归要比坐在后边效果要好一些在学了这半学期之后,我同样有了一些体味,虽然不会比创新程vb序的同学深刻,但是也让我相信了,起码在老师他自己的课堂上,他讲的要点都是对的、一定要认真听讲做笔记,这是提高效率最快的方法,就像老师说的1有了上机课,我才干真正懂得听课的重要性,其实有些课件虽然老师为了学生能够及时的进行自我复习传上去一些,但有些东西终归是老师上课讲的,而并没有写入课件的所以,当真正自己写的时候,一遍一遍的被程序提示出错,内心其实很着急,因为老师惟独一个,而且也不会围着你团团转,所以这时候,请教同学是惟一的方法,但是这惟一的方法也不是时时都能发挥作用,同学也有不会,还是需要老师其实我知道,大部份的问题都是上课老师已经讲过的,只是自己没听或者是一知半解,时常写丢一些重要程序,导致程序向来无法运行比如我时常把退出子过程弄丢,自己当时没觉得它很重要,虽然老师讲过如果没有这个,后exit sub边的程序会很麻烦当时,我也只是那末一听,没在乎,后来编程黑白子竖方向赢棋时没把它加之,之后麻烦就浮现了,我的黑白子向来都没法完成竖方向赢棋总是有一个方向没法判断,起初老师告诉我看看是否有算法上的错误,但是,我找了一节多课(我承认我这个人太固执,必须要知道为什么错了,才会做下一步),我觉得我的算法一定没问题,但是不明白为什么错,后来在读别人的程序时,才发现是我的没写,造成的,惟独退出我上一个的子过程,这exit sub个过程才干正常运行所以可见没听老师的话,是多么可怕,特别还是在我也没听他讲课的前提下……根本不懂代码意思,乱删改造成的后果所以,不管是在哪里,学知识是对任何事情在打基础做每一步都要问一句问什么,凡是都有原因、学会独立思量,多问自己为什么,求匡助是下策2在最初的的上机试验里,我总会问老师一些我自己可以解决的问题,自己不愿动脑想,希望以最快捷的方式,获得最佳的结果但是,往往会被老师教育一下,因为在其中,有一半是拼写错误,而自己没注意,另一半是写程序时不够完整(认真说起来是根本没怎么想,只是将课上抄录下来的不完整笔记,凭借自己的主观意愿,编写的程序,不问为什么)其实后来想一想,确实是自己的问题,既耽误自己时间,也耽误老师时间这些程序老师只是给一个思路,教你如何编写程序,但是完整的需要自己来做,这些都需要弄清思路,才会懂得我需要什么,从而编写出什么,这样犯错几率才会大大减少这也是锻炼自己思路逻辑性的时候,也是老师让我们学的地方只是当时没有听进去就像老师说的,惟独这样才干将程序融为自己的,真正有能力去编自己想要边的程序、任何新鲜的事物都需要一个熟悉的过程,凡是要趁热打铁,效率才会高3其实,这也是老师时常说的,可我们总是在做错事之后,才会想起来,原来某某某说的话是多么的对,但是总是忽略它事前的作用我确实每次上完课,笔记连翻都不翻,到真正上机的时候才会开始琢磨这个程序的意思,所以每一次的上机,我的速度都是比别人慢好多,而且特别是笔记也没有记得很全的时候(也没有及时的补),上机时间都不够我完成上次所讲的程序的所以会很懊悔,没有好好听讲,没有好好记笔记、补笔记,造成为了效率低下的局面所以,凡事都要趁热打铁,才会尽快吸收、任何事情都不是一气呵成,事先的计划会是你事半功倍,而实践是检验真理的惟一标准,程4序亦是如此这是我这两天在研究程序为什么这么写的原因时,才开始领悟到的这一点老师也有可能说过我在抛开老师所编写的五子棋的程序下,想通过自己的思量,把五子棋的思路捋顺,所以开始自己画结构图(真正开始有这种想法的是在我看到老师给我们展示的他的往届同学做贪吃蛇的心得中,才发觉重要性)一开始我花了一个很短的一段时间,画出一个我自认为很满意思路图,但是当我在重新用一些数去实验,当我再对照我写的图与老师编写的程序有何不同的时候,就会发现,有不少漏洞比如,我想到了有下棋,但没有想到下棋前要清屏,防止程序之前有任何痕迹,防止出错;还有我想到了下棋之后要判断赢棋,但是当我到赢棋的那一步思路,我才想到,要判断赢棋,就必须有五个相同颜色的子连一起,那末在这之前我就要加之关于数组的赋值,来代表每一种颜色的棋子,从而构造条件语句,完成应其目的等等其实这if些都不是我一开始做程序就想到的,惟独当按照计划实施的过程中,才干验证思路的正确性,才干知道自己的思路与逻辑缺陷在哪里,从而弥补不足这也是将自己的逻辑思维进一步完善的过程,也是老师想让我们得到的东西所以,通过这次的课程,我能体味到老师的良苦用心,也感谢老师向来不厌倦的一遍遍教我们,一遍遍告诉我们不愿意听的忠言我会将我从这里学到的态度,以及做事的思维方式,运用到其他事情上,哪怕是一点点,也会让我的效率比以往更有提高
六、全部界面和代码Form1Private SubCommand1_ClickIf TrimTextl.Text=Or TrimText
2.Text=,H,Then请输入玩家姓名!”MsgBox”EndIfIfTrimTextl.Text=TrimText
2.Text Then不能输入相同姓名!”MsgBox”Exit SubEndIfb=Text
1.Textw=Text
2.TextForm
2.ShowUnload MeEndSubiri1xppnw购盯酸JUT工»务ZUiJOj才不力、将近第•A冲府纬二二龄giarsr3er:Kb,Q口一已一一一二・IjHrjldrl・±9L11/区息余品DfM5sl4illt4i*£*4JGl-Emc*ECXMPWW3104S73GHTRMG15L8L-G*e--2=dijg□FELq»QSws»«cMd*1nzelur»»^c***IxugF:34I5,X::Dim mAs IntegerDimn As IntegerDim iAsIntegerDimj AsIntegerPrivate SubForm_Load卜Form
2.Picture
1.Scale-8,88,-8EndSub开始游戏PrivateSub_ClickPicturel.CisFor i=-7To7Picturel.Line-7,i-7,i,QBColorOPicturel.Line i,-7-i,7,QBColorONextFor i=-11To11Forj=-11To11ai,j=0NextNext该黑方-+“走”Labell.Caption=b+blackwhite=True wuziqi=True。