五子棋游戏实验报告_第1页
五子棋游戏实验报告_第2页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-来源网络,仅供个人学习参考五子棋游戏实验报告课程名称计算机程序设计(VB)学号姓名班级提交时间,,-I五子棋软件设计一、实验目的1.通过五子棋软件设计或者自拟题目设计, 巩固本课程所学的各 个章节重点知识,自拟题目的同学需尽早向教师提出自己的想法 及设计方案。2通过开发一个较大的系统,增强软件开发能力。3通过调试系统,增强逻辑思维能力。-来源网络,仅供个人学习参考二、实验内容1基本要求:(1)输入两个对手名字,然后进入游戏界面。(2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。 (棋盘15*15)(3)可以悔棋。(4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。(5)能够将棋局的结

2、果保存,保存该棋局结束的状态、对手名字、_I -I,J 11电X棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。(6)棋局能够恢复,即重新打开,打开后出现棋局结束的状态、对手名字(此功能要求用数据库和文件两种技术实现)。2其它要求:(1)界面友好、漂亮。I I严I(2)程序尽可能无bug。(3)程序健壮性强,基本上达到无论用户如何操作,软件都不出错,都有相应的处理方法。3设计步骤(1)首先做界面界面包括几个窗体,窗体上有相应的控件。因为需要画棋盘,所以必须有图形容器,这里用picturebox框-来源网络,仅供个人学习参考第一个窗体是登陆界面,因为

3、玩家姓名需要在程序中不断变换,因此需要将玩家名定义成两个变量,又因为这两个变量在几个窗 体中都用到,所以在模块中定义为全局变量当五子棋主界面启动之后,首先系统要自动绘制棋盘。思路: 用直线绘制棋盘-直线是由点绘制的-每个点都有坐标-改变坐标系为用户坐标系用户坐标系的定义要在窗体启动时实现。(2)坐标系的两个顶点坐标的确定?考虑到五子棋15*15,确定棋盘坐标系顶点为(-8,8),(8,-8)(3) 棋子的绘制与存储棋子的绘制用实心圆模式,颜色为黑色及2 I / J/ I白色两种。棋子在内存中的存储方式:因为表示各个棋子的数据类型都相同, 所以考虑用数组存储, 因为棋盘是二维的, 因此棋子用二维

4、数组a存储。a (i,j)表示用户坐标(i,j)的棋子状态,0表示此处无 棋子,1表示此处为黑子,2表示此处为白子,下棋初始时,棋盘 所有位置的初始状态都为0(4) 下棋子的步骤鼠标点击棋盘交叉点附近的位置,系统应实现自动识别鼠标点击位置附近的交叉点解决方法:坐标系的变换已经将棋盘交叉点坐标整数化,因此系 统所需要实现的功能即是将鼠标所点击的位置坐标化为整数即可, 例如将(6.2,-5.3)变成(6,-5)。在交叉点上交替下黑白棋子。 解决方法:定义一个逻辑数据类型变量blackwhite,该变量的值为真时下黑子,为假时下白子,每下一个棋子,该变量的值都要 取反(NOT。-来源网络,仅供个人学

5、习参考判断赢棋每次下子时都必须进行赢棋判断,判断的依据是5个子按照横线、竖线或斜线连成一行。解决方法:2层循环。当有一方胜利时,棋局结束,此时在棋盘上继续点击,将不再下 棋。解决方法:设置一个逻辑变量wuziqi,其值为真时说明棋局没有 结束,可以在棋盘上放棋子,该值为假时,说明该棋局结束,不 能放棋子。(6)五子棋保存棋局思路:保存棋局的功能即把内存中与棋局相关的数据 (棋局名称、 棋子位置、棋子颜色、棋局状态(即棋局是否结束)存入外存中, 以便以后能够恢复棋局。保存的实现用两种技术实现:文件和数 据库。采用数据库技术实现棋局保存:数据库设计:数据表字段:棋局名、x坐标、y坐标、该点状态值、

6、下棋状态。 每条记录表示棋盘上一个存储的点的信息。要实现用数据库保存数据,就必须使程序连接到数据库上,这里 用的是data控件, 通过在程序中对data控件属性的设置来连接 数据库、 数据表。首先判断如果输入的棋局名和当前记录的棋局名相等,说明表中 有输入棋局名对应的棋局信息,将其删除,判断过程是将用户输 入的棋局名(字符串)从记录集(即表)的棋局字段顶端至下逐-来源网络,仅供个人学习参考一比较在表的最后,也就是最后一条记录后加上新保存棋局的各条记录 因为棋盘上空点居多,大部分点的信息为0,因此只需保存有棋子的点的信息用文件技术进行棋局保存,思路相同。(7)五子棋恢复棋局思路: 首先从数据库文

7、件中找到要恢复棋局的数据 (即曾经保存 的数据) ,然后把这些数据赋值给内存中相应的数组或者变量中, 按照这些数据重新绘制棋盘和棋子,即完成了对棋局的恢复。窗体启动事件应该完成的事情:!| 1组合框中应该显示曾经保存的棋局名。因为每次保存棋局时,都 是将棋局所有棋子的记录添加在表的最后,因此表中关于棋局名 的记录只能是类似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根据这个特点编程序取出表中不同的棋局名。具体算法:用一个字符串变量strfile初始值为空,从表的顶端向下依次移动记录指针,如果当前记录的棋局名字段和strfile不相等,说明进入另一个棋局的记录中,将该棋局记

8、录的棋局名赋值给strfile,并加入到组合框中,一直到表中最后一个记录因为要从数据库中取出相关数据到a数组中,因此要将a数组所 有数据清零。要建立一个data控件,与数据库连接起来,而后识别棋局(即表 中的棋局名字段与在列表框中选择的棋局名比较),将数据库该棋-来源网络,仅供个人学习参考-来源网络,仅供个人学习参考局中所有信息都赋值给a数组及相关变量。刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到 内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子。 重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现, 该子过程定义在模块中。思路如下:清屏一绘制棋盘一根据a数组中的每一项

9、的两个下标来决定绘制 棋子的位置,根据每一项的值是1还是2来决定在该位置绘制何 颜色的棋子。决定该黑白方走的blackwhite变量当时没有保存,可以采用在数 据库中保存的方式来解决,本例中解决方法是通过数黑白棋子个 数来决定恢复棋局后该谁走的。因此设置了一个变量做计数器,每走一步棋计数器的值加一。用文件技术实现棋局恢复,思路相同。(8)悔棋悔一步棋:用几个变量来表示关于一步棋的几个信息,每次下子 都将该子的信息赋值给那几个变量,悔一步棋即将那几个变量所 表示的点的a数组信息清零。而后调用paint()过程重画。 以上是教师带着学生完成的软件功能。遗留问题:保存棋手姓名和棋局名并在恢复棋局的时

10、候显示。(需 要同学们自己完成)思路:在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似。三、设计日期十二月四、完成日期十二月五、实验体会其实,一开始学习vb我就对它不抱有一定的热情,可能是因为 要用到计算机以及编程问题,当时一想到有代码,就会无比的苦-_i-Jx恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心 情。起初,我对待这门新课程和其他课程一样,保持着必须认真 听讲的决心。但是由于理论课太过枯燥,没学几次,我就败下阵 来,开始有一节没一节的听,但是心里还是存有愧疚,就得自己 不该这样懒惰,所以总是坐在前边几排座位上,逼着自己一定要 学些什么,这总归要比坐在后边

11、效果要好一些。在学了这半学期vb之后,我同样有了一些体会,虽然不会比创新程序的同学深刻, 但是也让我相信了,起码在老师他自己的课堂上,他讲的要点都 是对的。1、一定要认真听讲做笔记,这是提高效率最快的方法,就像老师 说的。有了上机课,我才能真正懂得听课的重要性,其实有些课件虽 然老师为了学生能够及时的进行自我复习传上去一些,但有些东 西终归是老师上课讲的,而并没有写入课件的。所以,当真正自-来源网络,仅供个人学习参考-来源网络,仅供个人学习参考己写的时候,一遍一遍的被程序提示出错,内心其实很着急,因 为老师只有一个,而且也不会围着你团团转,所以这时候,请教 同学是唯一的方法,但是这唯一的方法也

12、不是时时都能发挥作用, 同学也有不会,还是需要老师。其实我知道,大部分的问题都是 上课老师已经讲过的,只是自己没听。或者是一知半解,经常写 丢一些重要程序,导致程序一直无法运行。比如我经常把退出子 过程exitsub弄丢,自己当时没觉得它很重要,虽然老师讲过如 果没有这个,后边的程序会很麻烦。当时,我也只是那么一听, 没在意,后来编程黑白子竖方向赢棋时没把它加上,之后麻烦就 出现了,我的黑白子一直都没法完成竖方向赢棋总是有一个方向 没法判断,起初老师告诉我看看是否有算法上的错误,但是,我 找了一节多课(我承认我这个人太固执,必须要知道为什么错了, 才会做下一步),我觉得我的算法一定没问题,但是

13、不明白为什么 错,后来在读别人的程序时,才发现是我的exitsub没写,造成的,只有退出我上一个的子过程,这个过程才能正常运行。所以 可见没听老师的话,是多么可怕,尤其还是在我也没听他讲课的 前提下根本不懂代码意思,乱删改造成的后果。所以,不管 是在哪里,学知识是对任何事情在打基础。做每一步都要问一句 问什么,凡是都有原因。2、学会独立思考,多问自己为什么,求帮助是下策在最初的的上机试验里,我总会问老师一些我自己可以解决的问题,自己不愿动脑想,希望以最快捷的方式,获得最佳的结果。但是,往往会被老师教育一下,因为在其中,有一半是拼写错误, 而自-来源网络,仅供个人学习参考己没注意,另一半是写程序

14、时不够完整(认真说起来是根本 没怎么想,只是将课上抄录下来的不完整笔记,凭借自己的主观 意愿,编写的程序,不问为什么)。其实后来想一想,确实是自己 的问题,既耽误自己时间,也耽误老师时间。这些程序老师只是 给一个思路,教你如何编写程序,但是完整的需要自己来做,这 些都需要弄清思路,才会懂得我需要什么,从而编写出什么,这 样犯错几率才会大大减少。这也是锻炼自己思路逻辑性的时候, 也是老师让我们学的地方。只是当时没有听进去。就像老师说的, 只有这样才能将程序融为自己的,真正有能力去编自己想要边的 程序。3、任何新鲜的事物都需要一个熟悉的过程,凡是要趁热打铁,效率才会高。其实,这也是老师经常说的,可

15、我们总是在做错事之后,才会 想起来,原来某某某说的话是多么的对,但是总是忽略它事前的 作用。我确实每次上完课,笔记连翻都不翻,到真正上机的时候y-.”!| I-才会开始琢磨这个程序的意思,所以每一次的上机,我的速度都 是比别人慢好多,而且尤其是笔记也没有记得很全的时候(也没 有及时的补),上机时间都不够我完成上次所讲的程序的。所以会 很后悔,没有好好听讲,没有好好记笔记、补笔记,造成了效率 低下的局面。所以,凡事都要趁热打铁,才会尽快吸收。4、任何事情都不是一气呵成,事先的计划会是你事半功倍,而实-来源网络,仅供个人学习参考践是检验真理的唯一标准,程序亦是如此。这是我这两天在研究程序为什么这么

16、写的原因时,才开始领悟到 的。这一点老师也有可能说过。我在抛开老师所编写的五子棋的 程序下,想通过自己的思考,把五子棋的思路捋顺,所以开始自 己画结构图(真正开始有这种想法的是在我看到老师给我们展示 的他的往届同学做贪吃蛇的心得中,才发觉重要性)。一开始我花 了一个很短的一段时间,画出一个我自认为很满意思路图,但是 当我在重新用一些数去实验,当我再对比我写的图与老师编写的* ”j jT程序有何不同的时候,就会发现,有很多漏洞。比如,我想到了 有下棋,但没有想到下棋前要清屏,防止程序之前有任何痕迹, 防止出错;还有我想到了下棋之后要判断赢棋,但是当我到赢棋 的那一步思路,我才想到,要判断赢棋,就

17、必须有五个相同颜色 的子连一起,那么在这之前我就要加上关于数组的赋值,来代表 每一种颜色的棋子,从而构造if条件语句,完成应其目的等等。 其实这些都不是我一开始做程序就想到的,只有当按照计划实施 的过程中,才能验证思路的正确性,才能知道自己的思路与逻辑 缺陷在哪里,从而弥补不足。这也是将自己的逻辑思维进一步完 善的过程,也是老师想让我们得到的东西。所以,通过这次的课程,我能体会到老师的良苦用心,也感谢老 师一直不厌倦的一遍遍教我们,一遍遍告诉我们不愿意听的忠言。 我会将我从这里学到的态度,以及做事的思维方式,运用到其他 事情上,哪怕是一点点,也会让我的效率比以往更有提高。六、全部界面和代码-来

18、源网络,仅供个人学习参考FormlPrivateSubComma nd1_Click()IfTrim( Text1.Text)=OrTri m(T ext2.Text)=The nMsgBo乂请输入玩家姓名!En dIfIIfTri m(T ext1.Text)=Trim (Text2.Text)The n2 I / J ;,* IMsgBox不能输入相同姓名!I IExitSubEn dIfb=Text1.TextI i八w=Text2.TextForm2.Showr%i iUn loadMeEndSubForm2DimmAsI ntegerDimn Asl ntegerDimiAsI nt

19、egerDimjAs In tegerPrivateSubForm_Load()I I八EndSubPrivateSub开始游戏_Click()Picture1.ClsFori=-7To7Picture1.Li ne(-7,i)-(7,i),QBColor(0)Picture1.Li ne(i,-7)-(i,7),QBColor(0)-来源网络,仅供个人学习参考-来源网络,仅供个人学习参考NextFori=-11To11Forj=-11To11a(i,j)=OINext_I-I,f11NextX/ I1fiI |、 7I / J / ILabell.Caption=该黑方+b+走l.=厂 JI

20、 ,z JX/ /blackwhite=Truewuziqi=True j.一IEndSub-:I .PrivateSubPicture1_MouseDow n( ButtonAsI nteger,ShiftAsl nteger,XAsSi ngle,YAsSi ngle)m=C In t(X)n=Cln t(Y)IfCIn t(X)=-7A ndCIn t(X)=7A ndCI nt(Y)=-7A ndwuziqi=TrueThe n-来源网络,仅供个人学习参考Picture1.FillStyle=0lfblackwhite=TrueA nda(m, n)=OThe nPicture1.Fi

21、llColor=QBColor(0)Picture1.Circle(m, n),0.3,QBColor(0)a(m, n)=1_I-I. J#Label1.Caption=该白方+w+走;Iblackwhite=Falsel 厂I I jX* JX/ /En dIfIfblackwhite=FalseA nda(m, n)=0The nPicture1.FillColor=QBColor(15)Picture1.Circle(m, n),0.3,QBColor(15)l Ia(m, n)=2Label1.Caption=该黑方+b+走blackwhite=True-来源网络,仅供个人学习参考E

22、n dIfFori=m-4Tomlfa(i, n) =1A nda(i+1, n)=1A nda(i+2, n)=1An da(i+3, n)=1An da(i+4,n) =1ThenMsgBox黑方胜利! Iwuziqi=FalseExitSubi - _i-JJ、X En dIfl.=Ifa(i, n)=2A nda(i+1, n)=2A nda(i+2, n)=2An da(i+3, n)=2An da(i+4,n)=2ThenMsgBox白方胜利!I I严wuziqi=FalseExitSuby-._ i IEn dIfNextForj=n-4Ton-来源网络,仅供个人学习参考Ifa(

23、m,j)=1A nda(m,j+1)=1A nda(m,j+2)=1A nda(m,j+3)=1A nda(m,j+4)=仃he nMsgBox黑方胜利!wuziqi=FalseExitSubEn dlf_I -i.I 11js电Xlfa(m,j)=2A nda(m,j+1)=2A nda(m,j+2)=2A nda(m,j+3)=2A nda(m,j+4)=2ThenMsgBox白方胜利!wuziqi=FalseExitSubI I严.i r .En dIfNextFori=4ToOStep-1Ifa(m-i, n+i)=1A nda(m-i+1, n+i-1)=1A nda(m-i+2,

24、n+i-2)=1A nda(m-i+3, n+i-3)=1A nda(m-i+4, n+i-4)=仃he n-来源网络,仅供个人学习参考MsgBox黑方胜利!wuziqi=FalseExitSubEn dlflfa(m-i, n+i)=2A nda(m-i+1, n+i-1)=2A nda(m-i+2, n+i-2)=2A nda(m-i+3, n+i-3)=2A nda(m-i+4, n+i-4)=2The n /MsgBox白方胜利!-_i-J xwuziqi=False、J. _ f/l. 1ExitSubEn dIfNextI I严.I:、-Fori=4To0Step-1Ifa(m+i

25、, n+i)=1A nda(m+i-1, n+i-1)=1A nda(m+i-2, n+i-2)=1A nda(m+i-3, n+i-3)=1A nda(m+i-4, n+i-4)=仃he nMsgBox*黑方胜利!wuziqi=False-来源网络,仅供个人学习参考ExitSubEndlflfa(m+i, n+i)=2A nda(m+i-1, n+i-1)=2A nda(m+i-2, n+i-2)=2A nda(m+i-3, n+i-3)=2A nda(m+i-4, n+i-4)=2The nMsgBox白方胜利!-1wuziqi=FalseExitSub-_i-J xEn dIfl. 1N

26、extEn dIfEndSubI I严.I:、.PrivateSub保存棋局_Click()Form3.ShowEndSubPrivateSub打开已保存棋局_Click()Form4.ShowEndSub-来源网络,仅供个人学习参考-来源网络,仅供个人学习参考PrivateSub悔棋_Click()lfwuziqi=TrueThe na(m, n)=0Callpa intiEn dIfj_i -i.*!* i JSEndSubX y II* |*flI I2|/ J /;/ IPrivateSub保存棋局文件_Click()l_= 1厂 JI V-Com mon Dialog1.Filter

27、二*wzq/*wzqCommon Dialog1.Acti on=2 j.一IOpe nCommo nDialog1.FileNameForOutputAs#1、| | t_ |Prin t#1,wuziqisyl IFori=-7To7Forj=-7To7Ifa(i,j)0The n-来源网络,仅供个人学习参考Prin t#1,i-来源网络,仅供个人学习参考PrivateSub打开棋局文件_Click()a(i,j)=0Print#1,jPrint#1,a(i,j)Print#1,bPrint#1,wEndlfNextNextClose#1EndSubFori=-7To7Forj=-7To7

28、NextNext-来源网络,仅供个人学习参考Com mon Dialogl.Filter二*wzq/*wzqCom mon Dialogl.Actio n=1Ope nCommo nDialogl.FileNameForl nputAs#1Li nel nput#1,strwzqiwuziqi=CBool(strwzq)_IjfyJ 11zDoWhileNotEOFX y jI* I* I I2|/ J / ILineln put#1,stril =jILineln put#1,strjLineln put#1,straf j.一ILineln put#1,strb亠I LiLineln pu

29、t#1,strwy l I.-a(Val(stri),Val(strj)=Val(stra)LoopClose#1-来源网络,仅供个人学习参考Callpa intIf.Recordset.Fields(棋局名)=Text1.TextThen-来源网络,仅供个人学习参考EndSubForm3Dimreco un tAs In tegerPrivateSubComma nd1_Click()WithDatal五子棋棋库.mdb_Ijl-l. NJ | I * RecordSource=五子棋棋库X y Ii* I* I I2|/ J / I.Refreshl =I I /IfTri m(T ext

30、1.Text)=The nMsgBo乂棋局名不能为空ExitSubI I八厂,-I EndIfIf.Recordset.RecordCo un t0The nr-.y| I-.Recordset.MoveLastreco un t=.Recordset.RecordCo unt.Recordset.MoveFirstFori=1Toreco unt Recordset.Delete.Recordset.Fields(下棋状态)=wuziqi-来源网络,仅供个人学习参考En dIfIfNot.Recordset.EOFThe n Recordset.MoveNextEn dIfNextJ _|

31、jTI,*J | IEn dIfX y II* |*fl . I IFori=-7To7l_ 1Forj=-7To7lfa(i,j)vOThe n.Recordset AddNew.Recordset.Fields(棋局名)=Text1.Text.Recordset.Fields(执黑棋者)=b.Recordset.Fields(执白棋者)=wRecordset.Fields(X坐标)=iRecordset.Fields(丫坐.Recordset.Fields(下棋状态)=wuziqi-来源网络,仅供个人学习参考标)=j.Recordset.Fields(该点状态值)=a(i,j) Recordset.UpdateEn dIfNextNextUn loadMeEn dWith*. _ |jTI,*| |EndSubX y II* |*I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论