班级: 旅121
**** ***
学号: ******
实验题目:五子棋软件设计
实验要求:
1.基本要求:
(1)输入两个对手名字,然后进入游戏界面。
(2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。(棋盘15*15)
(3)可以悔棋。
(4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。
(5)能够将棋局的结果保存,保存该棋局结束的状态、对手名字、 棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。
(6)棋局能够恢复,即重新打开,打开后出现棋局结束的状态、对手名字(此功能要求用数据库和文件两种技术实现)。
2.其它要求:
(1)界面友好、漂亮。
(2)程序尽可能无bug。
(3)程序健壮性强,基本上达到无论用户如何操作,软件都不出错,都有相应的处理方法。
实验目的:
1.通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的同学需尽早向教师提出自己的想法及设计方案。
2.通过开发一个较大的系统,增强软件开发能力。
3.通过调试系统,增强逻辑思维能力。
设计日期:2013年12月4日
完成日期:2013年12月26日
实验体会:
通过对五子棋软件设计的编程结束,我所体会到的不仅是关于这个软件给我带来的感受,还有对于这个课的感触。其实在一开始看到课表安排上游vb的时候就觉得,我们一个文科专业为什么要学编程?随着课程的开展老师确实是从零基础一点一点细心的教起,有些例子程序若是班里人明白的少老师就会多讲几遍直到大家都听明白了为止,并且上课的时候并不是老师自己讲自己的,而是时不时的就会关心全班是否真的都在认真听课,并且能够真正的关心到“边缘同学”,但是尽管是在这样的情况下,我偶尔也会开开小差,课后实验也会稍稍参考一下同学的代码,就是这样有问题没有及时的弄明白导致最后在编五子棋代码时,出现了许多问题。
其实在当初老师让在自拟题目和五子棋当中选择一个作为结课作业的时候,我最开始想选择的是自拟题目,因为我觉得这样可以得到高一点的分数,但是再说了两个题目都被老师说不太合适之后我便选回了五子棋,现在想想当初真的是自己想太多了,光想到成绩,没有想到自己是不是有那么高的实力,以为就算自己上课听得不是特别的认真,但是上网找找别人的代码自己再根据书本和老师的课件便能理解了然后编出自己的代码。但事实并非如此,在老师给了大部分五子棋代码并且讲解过后,还是出了好多问题的我来说,还好当初没选自拟题目。
下面我说一说对于五子棋软件设计的感受。既然决定了制作五子棋,于是就每节理论课都跟着老师的思路走,认真听,为了可以抄清楚老师的代码和防止自己在开小差坐在第一排。老师首先讲的是关于Form1和Form2的制作,同时讲那两个窗体的过程中告诉了我们一个如果使用的这个定义变量过多的话便在模块里面定义。还讲了棋盘的画法,以及赢棋判断的其中一种。当时在抄代码,听思路的时候没觉得什么难度,但是当第二天自己真正上机的时候问题就一个一个的来了。Form1的制作并没有什么特别大的难度,主要问题都出在了Form2上。首先是数组定义的类型不认识,所以为什么这么定义就不了解,于是再去查课件,查书找清楚每一个代表什么意思,然后再看这些变量在代码中的那些位置,就慢慢地能明白为什么这么定义了。当然寻找变量一行一行读代码的过程中也会发现自己不明白的专业名词,又不知具体在书上的那些地方,就上网找。终于总算还算顺利的读下来了。但还没有轻松多久另一个难题就又来了,关于赢棋判断的另外三个方向。一开始竖着的判断时很简单,因为我以为只要像横着的一样把x坐标和y坐标调换一下就可以了,但是当做到斜着的方向判断时x坐标y坐标同时改变时便不知道如何改变了。先是照着老师的循环变量更改,因为只要定义两个变量就可以了,但是当运行之后却告诉我循环已经用过了,然后我自己读代码又不看不出有什么错误,我便去问老师,老师说循环语句写错了,不是嵌套的给写成嵌套格式了。改过之后,我问老师是不是调换一下坐标就能把斜的也做出来,老师说不是这样的,你要先了解我为什么这么写循环,然后要是循环不理解的话写列举法也行。我当时就想列举法要写好多点,代码肯定看起来不如循环的看上去简便。于是我开始拿了一张纸在上面分别写了好几组横着、竖着、斜着怎样是赢棋的坐标,然后找到其中的规律再结合这老师前面给的循环,发现自己明白了点。一种斜着的是x坐标y坐标的变换方式是同加同减的,另一种是一个加一个减的。既然规律找到了,那么下一难关就是循环变量的范围,在这中我试过把两个都用一个范围,后来发现不行,于是我便先试其中一种斜着的我试过0 to 4然后写坐标的的加减变换,然后发现不行,于是我把加减变换调换了一下发现还是不行,老师提示我超标线。所以我就换了个范围终于在试到4 to 0 step -1是成功了,所以我就想这个范围是不是在同加同减的那种形式下也可以呢?但是试过后发现又是超标,然后我就想到两个的起点坐标不一样是不是范围应该取值对称一下,于是0 to -4 step -1成功了。终于就这样我在制作五子棋的过程中的第一大难题攻克了。
接下来随着老师讲的逐渐深入,自己也及时理解还不算太过困难。但是在棋局库哪里却出了问题,代码没有问题,但是数据库就是打不开,后来询问老师,老师也找了半天没有找出问题所在,便让我再重新建立个数据库或者换个电脑,但是试过之后还是不行,于是我便去找老师,终于在老师的细心寻找下,终于找到了问题所在,没有把数据库改成该有的格式。
在这两个我认为在编程中遇到的两大问题的过后,尽管还是遇见了很多小问题,但还是解决了,老师要求我们自己做到的功能,再仔细研读老师的代码后也完成了。但是在这一切还比较顺利的过程中也出了个小插曲,就是在最后一节上机课前,我给优盘杀了个小病毒,结果就最后一次码代码的时候发现,以前编的部分代码缺失,不过还好不是全都没了还是能很快补了回来的。幸亏老师在之前提醒过这种情况的发生,我先把代码做了备份,要不就真的又是一个大工程了。
最后我想说的是尽管这真的是一个编程的课程,但是它教给我们的不仅仅是代码,不仅仅是如何制作软件。就像老师说的那样它交给我们的是解决问题如何思考的方式,如何抓住问题的根本,遇到问题应该勇于找解决办法。就像在编程的过程中遇到不会的问题不能理解的名词,就要及时的查书,上网查,和及时的问老师,当然其中不乏有一些因为上课你没有特别的认真听而问出的一些特别基础的问题,但是老师都一一的细心解答了。我觉得老师交给我们的这些不仅仅能用在这节课上,还可以用在其余的课程以及今后的道路上,所以在这里很感谢老师。以上就是我所有关于五子棋以及关于这个课的体会、感受。
全部界面:
游戏最开始玩家姓名输入
游戏开始与赢棋判断
保存棋局库
打开棋局库
保存棋局文件
打开棋局文件
悔棋
全部代码:
Modulel(全局变量)
Public wanjia1 As String
Public wanjia2 As String
Public blackwhite As Boolean
Public wuziqi As Boolean
Public a(-11 To 11, -11 To 11) As Integer
Dim i As Integer
Dim j As Integer
Dim countblack As Integer
Dim countwhite As Integer
Public Sub paint()
countblack = 0
countwhite = 0
Form2.Picture1.Cls
For i = -7 To 7
Form2.Picture1.Line (-7, i)-(7, i), QBColor(0)
Form2.Picture1.Line (i, -7)-(i, 7), QBColor(0)
Next
Form2.Picture1.FillStyle = 0
For i = -7 To 7
For j = -7 To 7
If a(i, j) = 1 Then
Form2.Picture1.FillColor = QBColor(0)
Form2.Picture1.Circle (i, j), 0.3, QBColor(0)
countblack = countblack + 1
End If
If a(i, j) = 2 Then
Form2.Picture1.FillColor = QBColor(15)
Form2.Picture1.Circle (i, j), 0.3, QBColor(15)
countwhite = countwhite + 1
End If
Next
Next
If countblack = countwhite Then
blackwhite = True
Else
blackwhite = False
End If
If blackwhite = True Then
Form2.Label1.Caption = "该黑方" + wanjia1 + "走"
Else
Form2.Label1.Caption = "该白方" + wanjia2 + "走"
End If
End Sub
Form1:
Private Sub Command1_Click()
If Trim(Text1.Text) = "" Or Trim(Text2.Text) = "" Then
MsgBox "请输入姓名"
Exit Sub
End If
wanjia1 = Text1.Text
wanjia2 = Text2.Text
Form2.Show
Unload Me
End Sub
Form2:
Dim m As Single
Dim n As Single
Dim x0 As Single
Dim y0 As Single
Dim shubiao As Integer
Private Sub Command1_Click()
Label1.Caption = "该黑方" + wanjia1 + "走"
blackwhite = True
wuziqi = True
Picture1.Cls
For i = -7 To 7
Picture1.Line (-7, i)-(7, i), QBColor(0)
Picture1.Line (i, -7)-(i, 7), QBColor(0)
Next
For i = -11 To 11
For j = -11 To 11
a(i, j) = 0
Next
Next
End Sub
Private Sub Command2_Click()
Form3.Show
End Sub
Private Sub Command3_Click()
Form4.Show
End Sub
Private Sub Command4_Click()
CommonDialog1.Filter = "*.wzq|*.wzq"
CommonDialog1.Action = 2
Open CommonDialog1.FileName For Output As #1
Print #1, wuziqi
For i = -7 To 7
For j = -7 To 7
If a(i, j) <> 0 Then
Print #1, i
Print #1, j
Print #1, a(i, j)
Print #1, wanjia1
Print #1, wanjia2
End If
Next
Next
Close #1
End Sub
Private Sub Command5_Click()
For i = -7 To 7
For j = -7 To 7
a(i, j) = 0
Next
Next
CommonDialog1.Filter = "*.wzq|*.wzq"
CommonDialog1.Action = 1
Open CommonDialog1.FileName For Input As #1
Line Input #1, strwuziqi
wuziqi = CBool(strwuziqi)
Do While Not EOF(1)
Line Input #1, stri
Line Input #1, strj
Line Input #1, stra
Line Input #1, strw1
Line Input #1, strw2
a(Val(stri), Val(strj)) = Val(stra)
Loop
Close #1
Call paint
End Sub
Private Sub Command6_Click()
If wuziqi = True Then
a(m, n) = 0
Call paint
End If
End Sub
Private Sub Form_Load()
Form2.Picture1.Scale (-8, 8)-(8, -8)
shubiao = 0
End Sub
Private Sub Picture1_mousedown(button As Integer, shift As Integer, x As Single, y As Single)
shubiao = 1
x0 = x
y0 = y
If CInt(x) >= -7 And CInt(x) <= 7 And CInt(y) >= -7 And CInt(y) <= 7 And wuziqi = True Then
m = CInt(x)
n = CInt(y)
Picture1.FillStyle = 0
If blackwhite = True And a(CInt(x), CInt(y)) = 0 Then
Picture1.FillColor = QBColor(0)
Picture1.Circle (CInt(x), CInt(y)), 0.3, QBColor(0)
a(CInt(x), CInt(y)) = 1
Label1.Caption = "该白方" + wanjia2 + "走"
blackwhite = Not blackwhite
End If
If blackwhite = False And a(CInt(x), CInt(y)) = 0 Then
Picture1.FillColor = QBColor(15)
Picture1.Circle (CInt(x), CInt(y)), 0.3, QBColor(15)
a(CInt(x), CInt(y)) = 2
Label1.Caption = "该黑方" + wanjia1 + "走"
blackwhite = Not blackwhite
End If
For i = CInt(x) - 4 To CInt(x)
If a(i, CInt(y)) = 1 And a(i + 1, CInt(y)) = 1 And a(i + 2, CInt(y)) = 1 And a(i + 3, CInt(y)) = 1 And a(i + 4, CInt(y)) = 1 Then
MsgBox "黑方胜利"
wuziqi = False
Exit Sub
End If
If a(i, CInt(y)) = 2 And a(i + 1, CInt(y)) = 2 And a(i + 2, CInt(y)) = 2 And a(i + 3, CInt(y)) = 2 And a(i + 4, CInt(y)) = 2 Then
MsgBox "白方胜利"
wuziqi = False
Exit Sub
End If
Next
For j = CInt(y) - 4 To CInt(y)
If a(CInt(x), j) = 1 And a(CInt(x), j + 1) = 1 And a(CInt(x), j + 2) = 1 And a(CInt(x), j + 3) = 1 And a(CInt(x), j + 4) = 1 Then
MsgBox "黑方胜利"
wuziqi = False
Exit Sub
End If
If a(CInt(x), j) = 2 And a(CInt(x), j + 1) = 2 And a(CInt(x), j + 2) = 2 And a(CInt(x), j + 3) = 2 And a(CInt(x), j + 4) = 2 Then
MsgBox "白方胜利"
wuziqi = False
Exit Sub
End If
Next
For i = 4 To 0 Step -1
If a(CInt(x) - i, CInt(y) + i) = 1 And a(CInt(x) - i + 1, CInt(y) + i - 1) = 1 And a(CInt(x) - i + 2, CInt(y) + i - 2) = 1 And a(CInt(x) - i + 3, CInt(y) + i - 3) = 1 And a(CInt(x) - i + 4, CInt(y) + i - 4) = 1 Then
MsgBox "黑方胜利"
wuziqi = False
Exit Sub
End If
If a(CInt(x) - i, CInt(y) + i) = 2 And a(CInt(x) - i + 1, CInt(y) + i - 1) = 2 And a(CInt(x) - i + 2, CInt(y) + i - 2) = 2 And a(CInt(x) - i + 3, CInt(y) + i - 3) = 2 And a(CInt(x) - i + 4, CInt(y) + i - 4) = 2 Then
MsgBox "白方胜利"
wuziqi = False
Exit Sub
End If
Next
For j = 0 To -4 Step -1
If a(CInt(x) - j - 4, CInt(y) - j - 4) = 1 And a(CInt(x) - j - 3, CInt(y) - j - 3) = 1 And a(CInt(x) - j - 2, CInt(y) - j - 2) = 1 And a(CInt(x) - j - 1, CInt(y) - j - 1) = 1 And a(CInt(x) - j, CInt(y) - j) = 1 Then
MsgBox "黑方胜利"
wuziqi = False
Exit Sub
End If
If a(CInt(x) - j - 4, CInt(y) - j - 4) = 2 And a(CInt(x) - j - 3, CInt(y) - j - 3) = 2 And a(CInt(x) - j - 2, CInt(y) - j - 2) = 2 And a(CInt(x) - j - 1, CInt(y) - j - 1) = 2 And a(CInt(x) - j, CInt(y) - j) = 2 Then
MsgBox "白方胜利"
wuziqi = False
Exit Sub
End If
Next
End If
End Sub
Form3
Dim rcount As Integer
Dim i As Integer
Dim j As Integer
Private Sub Command1_Click()
With Data1
.DatabaseName = App.Path + "\\wzq.mdb"
.RecordSource = "保存棋局表"
.Refresh
If Trim(Text1.Text) = "" Then
MsgBox "棋局名不能为空"
Exit Sub
End If
If .Recordset.RecordCount > 0 Then
.Recordset.MoveLast
For i = 1 To rcount
If .Recordset.Fields("棋局名") = Text1.Text Then
.Recordset.Delete
End If
If Not .Recordset.EOF Then
.Recordset.MoveNext
End If
Next
End If
For i = -7 To 7
For j = -7 To 7
If a(i, j) <> 0 Then
.Recordset.AddNew
.Recordset.Fields("棋局名") = Text1.Text
.Recordset.Fields("x坐标") = i
.Recordset.Fields("y坐标") = j
.Recordset.Fields("该点状态值") = a(i, j)
.Recordset.Fields("下棋状态") = wuziqi
.Recordset.Fields("玩家1") = wanjia1
.Recordset.Fields("玩家2") = wanjia2
.Recordset.Update
End If
Next
Next
Unload Me
End With
End Sub
Form4
Private Sub Command1_Click()
For i = -7 To 7
For j = -7 To 7
a(i, j) = 0
Next
Next
With Data1
.DatabaseName = App.Path + "\\wzq.mdb"
.RecordSource = "保存棋局表"
.Refresh
If .Recordset.RecordCount > 0 Then
.Recordset.MoveLast
rcount = .Recordset.RecordCount
.Recordset.MoveFirst
For i = 1 To rcount
If .Recordset.Fields("棋局名") = Combo1.Text Then
a(.Recordset.Fields("x坐标"), .Recordset.Fields("y坐标")) = .Recordset.Fields("该点状态值")
End If
If Not .Recordset.EOF Then
.Recordset.MoveNext
End If
Next
.Recordset.MoveFirst
For i = 1 To rcount
If .Recordset.Fields("棋局名") = Combo1.Text Then
wuziqi = .Recordset.Fields("下棋状态")
Exit For
End If
If Not .Recordset.EOF Then
.Recordset.MoveNext
End If
Next
End If
End With
Call paint
Unload Me
End Sub
Private Sub Form_Load()
Combo1.Text = "请选择打开棋局名称"
strfile = ""
With Data1
.DatabaseName = App.Path + "\\wzq.mdb"
.RecordSource = "保存棋局表"
.Refresh
If .Recordset.RecordCount > 0 Then
.Recordset.MoveLast
rcount = .Recordset.RecordCount
.Recordset.MoveFirst
For i = 1 To rcount
If .Recordset.Fields("棋局名") <> strfile Then
strfile = .Recordset.Fields("棋局名")
Combo1.AddItem strfile
End If
If Not .Recordset.EOF Then
.Recordset.MoveNext
End If
Next
End If
End With
End Sub下载本文