五子棋游戏实验报告课程名称计算机程序设计(VB)学号______________________姓名______________________班级______________________提交时间五子棋软件设计一、实验目的1•通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的同学需尽早向教师提岀自己的想法及设计方案。
2•通过开发一个较大的系统,增强软件开发能力。
3•通过调试系统,增强逻辑思维能力。
二、实验内容1.基本要求:(1)输入两个对手名字,然后进入游戏界面。
(2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。
(棋盘15*15 )(3)可以悔棋。
(4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。
(5)能够将棋局的结果保存,保存该棋局结束的状态、对手名字、棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。
因为棋盘上空点居多,大部分点的信息为0,因此只需保存有棋子的点的信息用文件技术进行棋局保存,思路相同。
(7)五子棋恢复棋局思路:首先从数据库文件中找到要恢复棋局的数据(即曾经保存的数据),然后把这些数据赋值给内存中相应的数组或者变量中,按照这些数据重新绘制棋盘和棋子,即完成了对棋局的恢复。
窗体启动事件应该完成的事情:组合框中应该显示曾经保存的棋局名。
因为每次保存棋局时,都是将棋局所有棋子的记录添加在表的最后,因此表中关于棋局名的记录只能是类似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根据这个特点编程序取出表中不同的棋局名。
具体算法:用一个字符串变量strfile初始值为空,从表的顶端向下依次移动记录指针,如果当前记录的棋局名字段和strfile不相等,说明进入另一个棋局的记录中,将该棋局记录的棋局名赋值给strfile,并加入到组合框中,一直到表中最后一个记录因为要从数据库中取岀相关数据到a数组中,因此要将a数组所有数据清零。
要建立一个data控件,与数据库连接起来,而后识别棋局(即表中的棋局名字段与在列表框中选择的棋局名比较),将数据库该棋局中所有信息都赋值给a数组及相关变量。
刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子。
重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现,该子过程定义在模块中。
思路如下:清屏一绘制棋盘一根据a数组中的每一项的两个下标来决定绘制棋子的位置,根据每一项的值是1还是2来决定在该位置绘制何颜色的棋子。
决定该黑白方走的blackwhite变量当时没有保存,可以采用在数据库中保存的方式来解决,本例中解决方法是通过数黑白棋子个数来决定恢复棋局后该谁走的。
因此设置了一个变量做计数器,每走一步棋计数器的值加一。
用文件技术实现棋局恢复,思路相同。
(8)悔棋悔一步棋:用几个变量来表示关于一步棋的几个信息,每次下子都将该子的信息赋值给那几个变量,悔一步棋即将那几个变量所表示的点的a数组信息清零。
而后调用paint ()过程重画。
以上是教师带着学生完成的软件功能。
遗留问题:保存棋手姓名和棋局名并在恢复棋局的时候显示。
(需要同学们自己完成)思路:在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似。
三、设计日期十二月四、完成日期十二月五、实验体会其实,一开始学习vb我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情。
起初,我对待这门新课程和其他课这是我这两天在研究程序为什么这么写的原因时,才开始领悟到的。
这一点老师也有可能说过。
我在抛开老师所编写的五子棋的程序下,想通过自己的思考,把五子棋的思路捋顺,所以开始自己画结构图(真正开始有这种想法的是在我看到老师给我们展示的他的往届同学做贪吃蛇的心得中,才发觉重要性)。
一开始我花了一个很短的一段时间,画岀一个我自认为很满意思路图,但是当我在重新用一些数去实验,当我再对比我写的图与老师编写的程序有何不同的时候,就会发现,有很多漏洞。
比如,我想到了有下棋,但没有想到下棋前要清屏,防止程序之前有任何痕迹,防止岀错;还有我想到了下棋之后要判断赢棋,但是当我到赢棋的那一步思路,我才想到,要判断赢棋,就必须有五个相同颜色的子连一起,那么在这之前我就要加上关于数组的赋值,来代表每一种颜色的棋子,从而构造if条件语句,完成应其目的等等。
其实这些都不是我一开始做程序就想到的,只有当按照计划实施的过程中,才能验证思路的正确性,才能知道自己的思路与逻辑缺陷在哪里,从而弥补不足。
这也是将自己的逻辑思维进一步完善的过程,也是老师想让我们得到的东西。
所以,通过这次的课程,我能体会到老师的良苦用心,也感谢老师一直不厌倦的一遍遍教我们,一遍遍告诉我们不愿意听的忠言。
我会将我从这里学到的态度,以及做事的思维方式,运用到其他事情上,哪怕是一点点,也会让我的效率比以往更有提高。
六、全部界面和代码Form 1Private Sub Comma nd1_Click()If Trim仃eext1.Text) = ""Or Trim(Text2.Text) = "" ThenMsgBox "请输入玩家姓名!"End IfIf Trim(Text1.Text) = Trim(Text2.Text) The nMsgBox "不能输入相同姓名!“Exit SubEnd Ifb = Text1.Textw = Text2.TextForm2.ShowUn load MeEnd SubForm 2Dim m As In tegerDim n As In tegerDim i As In tegerDim j As In tegerPrivate Sub Form_Load()End SubPrivate Sub 开始游戏_Click()Picture1.ClsFor i = -7 To 7Picturel.Line (-7, i)-(7, i), QBColor(O) Picturel.Line (i, -7)-(i, 7), QBColor(0) NextFor i = -11 To 11For j = -11 To 11a(i, j) = 0NextNextEnd lfExit Sub End If2 And a(m + i - 4, n + i - 4) = 2 Then MsgBox "白方胜利!“wuziqi = FalseExit SubEnd IfNextEnd IfEnd SubPrivate Sub 保存棋局_Click()Form3.ShowEnd Sub + i - 2) = 2 And a(m + i - 3, n + i - 3)=Private Sub 打开已保存棋局_Click() Form4.ShowEnd SubPrivate Sub 悔棋_Click()If wuziqi = True The na(m, n) = 0Call pai ntEnd IfEnd SubPrivate Sub 保存棋局文件_Click() Common Dialog1.Filter = "*wzq/*wzq"Com mon Dialogl.Actio n = 2Open CommonDialogl.FileName For Output As #1 Print #1, wuziqiFor i = -7 To 7For j = -7 To 7If a(i, j) <> 0 The nPrint #1, iPrint #1, jPrint #1, a(i, j)Print #1, bPrint #1, wEnd IfNextNextClose #1End SubPrivate Sub 打开棋局文件_Click()For i = -7 To 7For j = -7 To 7a(i, j) = 0NextCommon Dialogl.Filter = "*wzq/*wzq"Com mon Dialogl.Actio n = 1Ope n Commo nDialogl.FileName For In put As #1Line In put #1, strwzqwuziqi = CBool(strwzq)Do While Not EOF(1)Line In put #1, striLine In put #1, strjLine In put #1, straLine In put #1, strbLine In put #1, strwa(Val(stri), Val(strj)) = Val(stra)LoopClose #1Call pai ntEnd SubForm 3Dim recou nt As In tegerPrivate Sub Comma nd1_Click()With Data1五子棋棋库.mdb" .RecordSource ="五子棋棋库".RefreshIf Trim(Text1.Text) = "" The nMsgBox "棋局名不能为空“Exit SubEnd IfIf .Recordset.RecordCou nt > 0 The n.Recordset.MoveLastrecou nt = .Recordset.RecordCou nt.Recordset.MoveFirstFor i = 1 To recou ntIf .Recordset.Fields(” 棋局名")=Text1.Text Then .Recordset.DeleteEnd IfIf Not .Recordset.EOF The n.Recordset.MoveNextEnd IfNextEnd IfFor i = -7 To 7For j = -7 To 7If a(i, j) <> 0 The n.Recordset.AddNew.Recordset.Fields(” 棋局名")=Textl.Text.Recordset.Fields(“ 执黑棋者")=b .Recordset.Fields(” 执白棋者")=w .Recordset.Fields("X 坐标")=i .Recordset.Fields ("Y 坐标")=j .Recordset.Fields(” 该点状态值")=a(i, j) .Recordset.Fields(” 下棋状态")=wuziqi .Recordset.Update End IfNextUn load MeEnd WithEnd SubForm 4Dim recou nt As In tegerPrivate Sub Form_Load()Combo1.Text ="请选择所要打开的棋局”strfile =""With Data1五子棋棋库.mdb".RecordSource ="五子棋棋库".RefreshIf .Recordset.RecordCou nt > 0 The n.Recordset.MoveLastrecou nt = .Recordset.RecordCou nt.Recordset.MoveFirstFor i = 1 To recou ntIf .Recordset.Fields(" 棋局名")<> strfile Then strfile = .Recordset.Fields("棋局名") Combo1.AddItem strfile End IfIf Not .Recordset.EOF The n.Recordset.MoveNextEnd IfNextEnd IfEnd WithEnd SubEnd IfNextEnd IfEnd With Call pai nt Un load Me End Sub。