五子棋游戏实验报告

时间:2024.4.20

五子棋游戏实验报告

课程名称     计算机程序设计(VB)

学    号                  

姓    名                  

班    级                  

提交时间                  






五子棋软件设计

一、实验目的

1.通过五子棋软件设计或者自拟题目设计,巩固本课程所学的各个章节重点知识,自拟题目的同学需尽早向教师提出自己的想法及设计方案。

2.通过开发一个较大的系统,增强软件开发能力。

3.通过调试系统,增强逻辑思维能力。

二、实验内容

1.基本要求:

(1)输入两个对手名字,然后进入游戏界面。

(2)用鼠标点击的方式在棋盘上摆放棋子,黑白交替。(棋盘15*15)

(3)可以悔棋。

(4)五子连在一起的时候能判断胜利,并且显示出胜利者的名字。

(5)能够将棋局的结果保存,保存该棋局结束的状态、对手名字、  棋局名字(棋局名字在保存时由用户在相应的界面下添入)(此功能要求用数据库和文件两种技术实现)。

(6)棋局能够恢复,即重新打开,打开后出现棋局结束的状态、对手名字(此功能要求用数据库和文件两种技术实现)。

2.其它要求:

(1)界面友好、漂亮。

(2)程序尽可能无bug。

(3)程序健壮性强,基本上达到无论用户如何操作,软件都不出错,都有相应的处理方法。

3.设计步骤

(1)首先做界面

界面包括几个窗体,窗体上有相应的控件。

因为需要画棋盘,所以必须有图形容器,这里用picturebox框

第一个窗体是登陆界面,因为玩家姓名需要在程序中不断变换,因此需要将玩家名定义成两个变量,又因为这两个变量在几个窗体中都用到,所以在模块中定义为全局变量

当五子棋主界面启动之后,首先系统要自动绘制棋盘。

思路:用直线绘制棋盘----直线是由点绘制的---每个点都有坐标----改变坐标系为用户坐标系

用户坐标系的定义要在窗体启动时实现。

(2)坐标系的两个顶点坐标的确定?

考虑到五子棋15*15,确定棋盘坐标系顶点为(-8, 8),(8, -8)

(3)棋子的绘制与存储棋子的绘制用实心圆模式,颜色为黑色及白色两种。

棋子在内存中的存储方式:因为表示各个棋子的数据类型都相同,所以考虑用数组存储,因为棋盘是二维的,因此棋子用二维数组a存储。a(i,j)表示用户坐标(i,j)的棋子状态,0表示此处无棋子,1表示此处为黑子,2表示此处为白子,下棋初始时,棋盘所有位置的初始状态都为0

(4)下棋子的步骤鼠标点击棋盘交叉点附近的位置,系统应实现自动识别鼠标点击位置附近的交叉点

解决方法:坐标系的变换已经将棋盘交叉点坐标整数化,因此系统所需要实现的功能即是将鼠标所点击的位置坐标化为整数即可,例如将(6.2, -5.3)变成(6, -5)。在交叉点上交替下黑白棋子。

解决方法:定义一个逻辑数据类型变量blackwhite,该变量的值为真时下黑子,为假时下白子,每下一个棋子,该变量的值都要取反(NOT)。

判断赢棋每次下子时都必须进行赢棋判断,判断的依据是5个子按照横线、竖线或斜线连成一行。

解决方法:2层循环。

当有一方胜利时,棋局结束,此时在棋盘上继续点击,将不再下棋。

解决方法:设置一个逻辑变量wuziqi,其值为真时说明棋局没有结束,可以在棋盘上放棋子,该值为假时,说明该棋局结束,不能放棋子。

(6)五子棋保存棋局

思路:保存棋局的功能即把内存中与棋局相关的数据(棋局名称、棋子位置、棋子颜色、棋局状态(即棋局是否结束))存入外存中,以便以后能够恢复棋局。保存的实现用两种技术实现:文件和数据库。

采用数据库技术实现棋局保存:

数据库设计:

数据表字段:棋局名、x坐标、y坐标、该点状态值、下棋状态。

每条记录表示棋盘上一个存储的点的信息。

要实现用数据库保存数据,就必须使程序连接到数据库上,这里用的是data控件,通过在程序中对data控件属性的设置来连接数据库、数据表。

首先判断如果输入的棋局名和当前记录的棋局名相等,说明表中有输入棋局名对应的棋局信息,将其删除,判断过程是将用户输入的棋局名(字符串)从记录集(即表)的棋局字段顶端至下逐一比较

在表的最后,也就是最后一条记录后加上新保存棋局的各条记录

因为棋盘上空点居多,大部分点的信息为0,因此只需保存有棋子的点的信息

用文件技术进行棋局保存,思路相同。

(7)五子棋恢复棋局

思路:首先从数据库文件中找到要恢复棋局的数据(即曾经保存的数据),然后把这些数据赋值给内存中相应的数组或者变量中,按照这些数据重新绘制棋盘和棋子,即完成了对棋局的恢复。

窗体启动事件应该完成的事情:

组合框中应该显示曾经保存的棋局名。因为每次保存棋局时,都是将棋局所有棋子的记录添加在表的最后,因此表中关于棋局名的记录只能是类似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根据这个特点编程序取出表中不同的棋局名。

具体算法:

用一个字符串变量strfile初始值为空,从表的顶端向下依次移动记录指针,如果当前记录的棋局名字段和strfile不相等,说明进入另一个棋局的记录中,将该棋局记录的棋局名赋值给strfile,并加入到组合框中,一直到表中最后一个记录

因为要从数据库中取出相关数据到a数组中,因此要将a数组所有数据清零。

要建立一个data控件,与数据库连接起来,而后识别棋局(即表中的棋局名字段与在列表框中选择的棋局名比较),将数据库该棋局中所有信息都赋值给a数组及相关变量。

刚才仅仅是数据的恢复,即将数据库中已经保存过的数据恢复到内存中,下一步应该根据内存中的数据重新绘制棋盘以及棋子。

重新绘制棋盘是独立的一块功能,因此考虑用全局子过程来实现,该子过程定义在模块中。思路如下:

清屏—绘制棋盘—根据a数组中的每一项的两个下标来决定绘制棋子的位置,根据每一项的值是1还是2来决定在该位置绘制何颜色的棋子。

决定该黑白方走的blackwhite变量当时没有保存,可以采用在数据库中保存的方式来解决,本例中解决方法是通过数黑白棋子个数来决定恢复棋局后该谁走的。

因此设置了一个变量做计数器,每走一步棋计数器的值加一。

用文件技术实现棋局恢复,思路相同。

(8)悔棋

悔一步棋:用几个变量来表示关于一步棋的几个信息,每次下子都将该子的信息赋值给那几个变量,悔一步棋即将那几个变量所表示的点的a数组信息清零。而后调用paint()过程重画。

以上是教师带着学生完成的软件功能。

遗留问题:保存棋手姓名和棋局名并在恢复棋局的时候显示。(需要同学们自己完成)

思路:在数据表中多建立两个字段,分别表示两个棋手姓名,同其它数据的保存类似。

三、设计日期

十二月

四、完成日期

十二月

五、实验体会

其实,一开始学习vb我就对它不抱有一定的热情,可能是因为要用到计算机以及编程问题,当时一想到有代码,就会无比的苦恼,但是为了让这门课顺利通过,我还是怀着一颗必须要学的心情。起初,我对待这门新课程和其他课程一样,保持着必须认真听讲的决心。但是由于理论课太过枯燥,没学几次,我就败下阵来,开始有一节没一节的听,但是心里还是存有愧疚,就得自己不该这样懒惰,所以总是坐在前边几排座位上,逼着自己一定要学些什么,这总归要比坐在后边效果要好一些。在学了这半学期vb之后,我同样有了一些体会,虽然不会比创新程序的同学深刻,但是也让我相信了,起码在老师他自己的课堂上,他讲的要点都是对的。

1、一定要认真听讲做笔记,这是提高效率最快的方法,就像老师说的。

有了上机课,我才能真正懂得听课的重要性,其实有些课件虽然老师为了学生能够及时的进行自我复习传上去一些,但有些东西终归是老师上课讲的,而并没有写入课件的。所以,当真正自己写的时候,一遍一遍的被程序提示出错,内心其实很着急,因为老师只有一个,而且也不会围着你团团转,所以这时候,请教同学是唯一的方法,但是这唯一的方法也不是时时都能发挥作用,同学也有不会,还是需要老师。其实我知道,大部分的问题都是上课老师已经讲过的,只是自己没听。或者是一知半解,经常写丢一些重要程序,导致程序一直无法运行。比如我经常把退出子过程exit sub弄丢,自己当时没觉得它很重要,虽然老师讲过如果没有这个,后边的程序会很麻烦。当时,我也只是那么一听,没在意,后来编程黑白子竖方向赢棋时没把它加上,之后麻烦就出现了,我的黑白子一直都没法完成竖方向赢棋总是有一个方向没法判断,起初老师告诉我看看是否有算法上的错误,但是,我找了一节多课(我承认我这个人太固执,必须要知道为什么错了,才会做下一步),我觉得我的算法一定没问题,但是不明白为什么错,后来在读别人的程序时,才发现是我的exit sub没写,造成的,只有退出我上一个的子过程,这个过程才能正常运行。所以可见没听老师的话,是多么可怕,尤其还是在我也没听他讲课的前提下……根本不懂代码意思,乱删改造成的后果。所以,不管是在哪里,学知识是对任何事情在打基础。做每一步都要问一句问什么,凡是都有原因。

2、学会独立思考,多问自己为什么,求帮助是下策

在最初的的上机试验里,我总会问老师一些我自己可以解决的问题,自己不愿动脑想,希望以最快捷的方式,获得最佳的结果。但是,往往会被老师教育一下,因为在其中,有一半是拼写错误,而自己没注意,另一半是写程序时不够完整(认真说起来是根本没怎么想,只是将课上抄录下来的不完整笔记,凭借自己的主观意愿,编写的程序,不问为什么)。其实后来想一想,确实是自己的问题,既耽误自己时间,也耽误老师时间。这些程序老师只是给一个思路,教你如何编写程序,但是完整的需要自己来做,这些都需要弄清思路,才会懂得我需要什么,从而编写出什么,这样犯错几率才会大大减少。这也是锻炼自己思路逻辑性的时候,也是老师让我们学的地方。只是当时没有听进去。就像老师说的,只有这样才能将程序融为自己的,真正有能力去编自己想要边的程序。

3、任何新鲜的事物都需要一个熟悉的过程,凡是要趁热打铁,效率才会高。

其实,这也是老师经常说的,可我们总是在做错事之后,才会想起来,原来某某某说的话是多么的对,但是总是忽略它事前的作用。我确实每次上完课,笔记连翻都不翻,到真正上机的时候才会开始琢磨这个程序的意思,所以每一次的上机,我的速度都是比别人慢好多,而且尤其是笔记也没有记得很全的时候(也没有及时的补),上机时间都不够我完成上次所讲的程序的。所以会很后悔,没有好好听讲,没有好好记笔记、补笔记,造成了效率低下的局面。所以,凡事都要趁热打铁,才会尽快吸收。

4、任何事情都不是一气呵成,事先的计划会是你事半功倍,而实践是检验真理的唯一标准,程序亦是如此。

  这是我这两天在研究程序为什么这么写的原因时,才开始领悟到的。这一点老师也有可能说过。我在抛开老师所编写的五子棋的程序下,想通过自己的思考,把五子棋的思路捋顺,所以开始自己画结构图(真正开始有这种想法的是在我看到老师给我们展示的他的往届同学做贪吃蛇的心得中,才发觉重要性)。一开始我花了一个很短的一段时间,画出一个我自认为很满意思路图,但是当我在重新用一些数去实验,当我再对比我写的图与老师编写的程序有何不同的时候,就会发现,有很多漏洞。比如,我想到了有下棋,但没有想到下棋前要清屏,防止程序之前有任何痕迹,防止出错;还有我想到了下棋之后要判断赢棋,但是当我到赢棋的那一步思路,我才想到,要判断赢棋,就必须有五个相同颜色的子连一起,那么在这之前我就要加上关于数组的赋值,来代表每一种颜色的棋子,从而构造if条件语句,完成应其目的等等。其实这些都不是我一开始做程序就想到的,只有当按照计划实施的过程中,才能验证思路的正确性,才能知道自己的思路与逻辑缺陷在哪里,从而弥补不足。这也是将自己的逻辑思维进一步完善的过程,也是老师想让我们得到的东西。

  所以,通过这次的课程,我能体会到老师的良苦用心,也感谢老师一直不厌倦的一遍遍教我们,一遍遍告诉我们不愿意听的忠言。我会将我从这里学到的态度,以及做事的思维方式,运用到其他事情上,哪怕是一点点,也会让我的效率比以往更有提高。

六、全部界面和代码

Form 1

Private Sub Command1_Click()

If Trim(Text1.Text) = "" Or Trim(Text2.Text) = "" Then

MsgBox "请输入玩家姓名!"

End If

If Trim(Text1.Text) = Trim(Text2.Text) Then

MsgBox "不能输入相同姓名!"

Exit Sub

End If

b = Text1.Text

w = Text2.Text

Form2.Show

Unload Me

End Sub







Form 2

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim j As Integer

Private Sub Form_Load()

Form2.Picture1.Scale (-8, 8)-(8, -8)

End Sub

Private Sub 开始游戏_Click()

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

Label1.Caption = "该黑方" + b + ""

blackwhite = True

wuziqi = True

End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

m = CInt(X)

n = CInt(Y)

If CInt(X) >= -7 And CInt(X) <= 7 And CInt(Y) <= 7 And CInt(Y) >= -7 And wuziqi = True Then

Picture1.FillStyle = 0

If blackwhite = True And a(m, n) = 0 Then

Picture1.FillColor = QBColor(0)

Picture1.Circle (m, n), 0.3, QBColor(0)

a(m, n) = 1

Label1.Caption = "该白方" + w + ""

blackwhite = False

End If

If blackwhite = False And a(m, n) = 0 Then

Picture1.FillColor = QBColor(15)

Picture1.Circle (m, n), 0.3, QBColor(15)

a(m, n) = 2

Label1.Caption = "该黑方" + b + ""

blackwhite = True

End If

For i = m - 4 To m

If a(i, n) = 1 And a(i + 1, n) = 1 And a(i + 2, n) = 1 And a(i + 3, n) = 1 And a(i + 4, n) = 1 Then

 MsgBox "黑方胜利!"

 wuziqi = False

 Exit Sub

 End If

If a(i, n) = 2 And a(i + 1, n) = 2 And a(i + 2, n) = 2 And a(i + 3, n) = 2 And a(i + 4, n) = 2 Then

 MsgBox "白方胜利!"

 wuziqi = False

 Exit Sub

 End If

 Next

For j = n - 4 To n

If a(m, j) = 1 And a(m, j + 1) = 1 And a(m, j + 2) = 1 And a(m, j + 3) = 1 And a(m, j + 4) = 1 Then

 MsgBox "黑方胜利!"

 wuziqi = False

 Exit Sub

 End If

If a(m, j) = 2 And a(m, j + 1) = 2 And a(m, j + 2) = 2 And a(m, j + 3) = 2 And a(m, j + 4) = 2 Then

 MsgBox "白方胜利!"

 wuziqi = False

 Exit Sub

 End If

 Next

For i = 4 To 0 Step -1

If a(m - i, n + i) = 1 And a(m - i + 1, n + i - 1) = 1 And a(m - i + 2, n + i - 2) = 1 And a(m - i + 3, n + i - 3) = 1 And a(m - i + 4, n + i - 4) = 1 Then

MsgBox "黑方胜利!"

wuziqi = False

Exit Sub

End If

If a(m - i, n + i) = 2 And a(m - i + 1, n + i - 1) = 2 And a(m - i + 2, n + i - 2) = 2 And a(m - i + 3, n + i - 3) = 2 And a(m - i + 4, n + i - 4) = 2 Then

MsgBox "白方胜利!"

wuziqi = False

Exit Sub

End If

Next

For i = 4 To 0 Step -1

If a(m + i, n + i) = 1 And a(m + i - 1, n + i - 1) = 1 And a(m + i - 2, n + i - 2) = 1 And a(m + i - 3, n + i - 3) = 1 And a(m + i - 4, n + i - 4) = 1 Then

MsgBox "黑方胜利!"

wuziqi = False

Exit Sub

End If

If a(m + i, n + i) = 2 And a(m + i - 1, n + i - 1) = 2 And a(m + i - 2, n + i - 2) = 2 And a(m + i - 3, n + i - 3) = 2 And a(m + i - 4, n + i - 4) = 2 Then

MsgBox "白方胜利!"

wuziqi = False

Exit Sub

End If

Next

End If

End Sub

Private Sub 保存棋局_Click()

Form3.Show

End Sub

Private Sub 打开已保存棋局_Click()

Form4.Show

End Sub

Private Sub 悔棋_Click()

If wuziqi = True Then

a(m, n) = 0

Call paint

End If

End Sub

Private Sub 保存棋局文件_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, b

Print #1, w

End If

Next

Next

Close #1

End Sub

Private Sub 打开棋局文件_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, strwzq

wuziqi = CBool(strwzq)

Do While Not EOF(1)

Line Input #1, stri

Line Input #1, strj

Line Input #1, stra

Line Input #1, strb

Line Input #1, strw

a(Val(stri), Val(strj)) = Val(stra)

Loop

Close #1

Call paint

End Sub

Form 3

Dim recount As Integer

Private Sub Command1_Click()

With Data1

.DatabaseName = App.Path + "\五子棋棋库.mdb"

.RecordSource = "五子棋棋库"

.Refresh

If Trim(Text1.Text) = "" Then

MsgBox "棋局名不能为空"

Exit Sub

End If

If .Recordset.RecordCount > 0 Then

.Recordset.MoveLast

recount = .Recordset.RecordCount

.Recordset.MoveFirst

For i = 1 To recount

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("执黑棋者") = b

.Recordset.Fields("执白棋者") = w

.Recordset.Fields("X坐标") = i

.Recordset.Fields("Y坐标") = j

.Recordset.Fields("该点状态值") = a(i, j)

.Recordset.Fields("下棋状态") = wuziqi

.Recordset.Update

End If

Next

Next

Unload Me

End With

End Sub

Form 4

Dim recount As Integer

Private Sub Form_Load()

Combo1.Text = "请选择所要打开的棋局"

strfile = ""

With Data1

.DatabaseName = App.Path + "\五子棋棋库.mdb"

.RecordSource = "五子棋棋库"

.Refresh

If .Recordset.RecordCount > 0 Then

.Recordset.MoveLast

recount = .Recordset.RecordCount

.Recordset.MoveFirst

For i = 1 To recount

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

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 + "\五子棋棋库.mdb"

.RecordSource = "五子棋棋库"

.Refresh

If .Recordset.RecordCount > 0 Then

.Recordset.MoveLast

recount = .Recordset.RecordCount

.Recordset.MoveFirst

For i = 1 To recount

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 recount

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

更多相关推荐:
五子棋Java实验报告

五子棋JAVA实验报告一实验目的和要求1能够用编程语言实现一个简单的五子棋程序2在实际系统中使用实现人工智能的相关算法3进一步加深对人工智能算法的理解二五子棋的基本常识与原理1五子棋的起源五子棋是一种两人对弈的...

五子棋实验报告(含代码)

福建工程学院实验报告专业计算机科学与技术班级计算机1001座号姓名日期20##/5/23福建工程学院计算机与信息科学系实验报告20##20##学年第一学期任课老师:##代码:#include#include#i…

java五子棋小游戏实验报告(附源代码)

手机五子棋游戏的设计与实现专业姓名班级学号指导教师基于J2ME的手机五子棋游戏摘要J2MEJava2MicroEdition是近年来随着各种不同设备尤其是移动通信设备的飞速发展而诞生的一项开发技术它因其writ...

MFC程序五子棋实验报告

MFC程序五子棋实验报告1实验目的通过学习MFC应用程序开发编译一个简单的五子棋人人对战游戏2实验过程1实验分工该实验是由小组人员共同合作完成算法设计有负责编码以及函数实现由负责调试运行和结果测试分别有和负责实...

五子棋JAVA语言课程设计报告

Java语言程序设计课程设计报告学院信息科学技术学院班级软件技术2班姓名王更新学号1108900505指导教师郭韶升课设时间20xx0317至20xx0326二O一四年三月二十六日目录一设计要求2二设计步骤22...

五子棋实验报告

武汉轻工大学题目五子棋游戏程序设计指导教师:姓名学号班级:1202专业:网络工程20##年10月26一、函数调用图:二、各函数的说明:1.main()主函数2.voiddrawqipan()画棋盘3.voidm…

五子棋实验报告

C语言课程设计之五子棋报告学院计算机科学学院班级计算机科学与技术2班姓名雷燕李莉王永学号4120xx1022702250219一课程设计的目的1正确熟悉及使用tourbc正确运行程序2正确的分析和应用所学的内容...

C语言图形五子棋课程设计报告

北京师范大学C语言课程设计报告课题名称:游戏五子棋指导教师:课题组员:院系:信息科学与技术时间:20##.3.15-20##.4.20摘要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上…

五子棋游戏__课程设计报告(含源代码可以运行)

目录第一章需求分析111总体分析112初始化113主循环控制模块114玩家下子115盘面分析填写棋型表216对方下子217胜负判断2第二章功能描述321功能模块图322功能说明3第三章系统设计431流程图432...

五子棋实验报告

河北大学工商学院计算机网络实验报告年级08级学号20xx482240姓名吕晓坤成绩专业软件工程实验地点c1228指导教师高相辉实验项目五子棋实验日期11514一实验目的掌握网络连接的主要过程和方法以及网络连接时...

五子棋Java实验报告 (1)

JAVA实验报告课程名称JAVA程序设计教程实验题目五子棋院系公共管理学院信息管理系班级信息管理与信息系统一班学号20xx19xx25姓名谢巧婷五子棋JAVA实验报告一实验目的和要求1能够用编程语言实现一个简单...

java课程设计报告五子棋

计算机网络技术专业专业代码590102动态网站基础程序设计课程设计班级网站1101班学号20xx274920xx317020xx039420xx483920xx264620xx264720xx361920xx2...

五子棋实验报告(45篇)