《可视化编程》课程设计报告
20##年6月15日
课程设计任务书
学生姓名:黎咏瑶 专业班级:软件2111班
指导教师: 黄启荃李小艳 工作单位:华夏学院计算机教研室
设计题目:连连看游戏的设计与开发
初始条件:
1、完成可视化编程的学习
2、带Visual Basic 的机器
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
主要任务:(在规定的时间内完成下列任务)
1、判断鼠标点击的两张图片是否相同;
2、判断2张图片是否可以相连;
3、判断时间;
4、判断剩余图片,是否胜利。
5、判断是否是死局,并死局要进行调整
6、适当给出“提示”信息
设计报告撰写格式要求:(课程设计报告按统一通用格式书写)具体内容如下:
① 设计任务与要求 ② 总体方案与说明
③ 程序主要模块的流程图 ④ 源程序清单与注释
⑤ 问题分析与解决方案(包括调试记录、调试报告,即在调试过程中遇到的主要问题、解决方法及改进设想); ⑥ 小结与体会
附录:① 源程序(必须有简单注释) ② 使用说明 ③ 参考资料
时间安排:6月23日---28日
指 导 教 师 签 字: 20##年6月23日
系 主 任 签 字: 年 月 日
1.设计任务与要求
1、判断鼠标点击的两张图片是否相同;
1、判断2张图片是否可以相连;
3、判断时间;
4、判断剩余图片,是否胜利。
5、判断是否是死局,并死局要进行调整
6、适当给出“提示”信息
2.总体方案
2.1连连看游戏的功能架构
如图1功能架构
2.2类结构设计
游戏由六个类组成,如图所示2
(1)主界面对话框类:主要负责主界面及菜单的显示,棋子消除、消除提示及换盘操作,同时还要负责时间控制等。
(2) 棋子类:主要负责棋子的选中,配对及查找。
(3)连接线类:主要负责棋子中连接线的绘画。
(4)英雄榜对话框类:主要负责游戏等级记录的更新。
(5)背景音乐播放类:主要负责游戏中背景音乐的播放。
(6)帮助对话框类:主要负责帮助提示的显示及其它辅助信息
如图2类结构设计
2.3出错处理设计
当游戏中出现错误,采用弹出对话框的方式来提示用户出现错误,并可采用中止当前游戏并重新开始新游戏的方法来处理游戏中的错误。
3. 详细设计
3.1 时间限制模块的算法设计
时间限制模块的算法主要分为如下几步:
(1) 在游戏开始时,设置当前限制时间(nOverTime)为60秒。
(2) 设定一个时间定时器TIMER1,时间间隔为1000ms 。
(3) 当每一次时间间隔到时,就把当前限制时间减少一秒。
(4) 如果游戏中有一对棋子消除时,就把限制时间增加三秒。
(5) 如果限制时间变成零秒,说明游戏结束,弹出结束提示对话框。如果当前游戏等级超过记录等级,还要弹出英雄榜对话框对话。
3.2 消除相同棋子模块的算法设计
消除相同棋子模块的算法主要分为如下几步:
(1) 当鼠标单击棋子时,保存到棋子坐标及类型到第一次选中变量中。
(2) 得到鼠标第二次选中的棋子坐标及类型。
(1) 比较两次棋子类型,如果相同,转步骤(4)。如果不相同,转步骤(5)。
(2) 画一条连接线,并消除这对棋子,退出等待下一次鼠标选择。
(3) 把鼠标第二次选中的棋子坐标及类型赋值给第一次选中变量。
3.3 游戏升级模块的算法设计
游戏升级模块的算法主要分为如下几步:
(1) 保存当前游戏等级和限制时间初始值。
(2) 当游戏中的棋子全部被消除完毕时,就把当前游戏等级增加一级。
(3) 把限制时间的初始值减少5秒。
(4) 调用重新开始游戏接口函数。
3.4 消除提示模块的算法设计
消除提示模块的算法主要分为如下几步:
(1)判断提示次数变量的值,如果等于0,结束。
(2)查找当前棋盘中相同的棋子。
(3)在相同棋盘中,查找可以消除的棋子。
(4)给出提示连线,提示次数变量减少1。
3.5 棋子换盘模块的算法设计
棋子换盘模块的算法主要分为如下几步:
(1)保存当前棋盘数组中的数据到临时数组中。
(2)循环的从临时数组中,随机取出数据保存到棋盘数组中。
3.6 英雄榜模块的算法设计
英雄榜模块的算法主要分为如下几步:
(1)读取配置文件,得到并显示当前最高等级及大名。
(2)在用户结束游戏时,比较当前用户等级和最高等级。如果高于配置文件中的最高等级,就弹出英雄榜对话框,要求输入大名,并连同用户的等级保存到配置文件中。
3.7 帮助类模块的算法设计
把相应的对话框资源显示出来即可。
3.8程序流程图
如图3程序流程图
4源程序清单与注释
4.1程序
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszsoundname As String, ByVal uflags As Long) As Long
Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_NODEFAULT = &H2
Dim focus As Integer
Dim ftype As String
Dim cc As Integer
Dim nd As Integer
Private Sub Form_Load()
'初始化
nd = 5
Call rom '调用排列方法
End Sub
Private Sub Picture1_Click(Index As Integer) '点击图片的事件
If ftype = Picture1(Index).Tag And focus <> Index Then '判断图片是否类型一致
Line1.Visible = True '显示线
Line1.X1 = Picture1(Index).Left + 300
Line1.X2 = Picture1(focus).Left + 300
Line1.Y1 = Picture1(Index).Top + 300
Line1.Y2 = Picture1(focus).Top + 300 '设置线的位置
Label2.Width = Label2.Width + 50
Picture1(Index).Visible = False '点击图片设置为不可见
Picture1(focus).Visible = False '上一张图片为不可见
focus = -1 '将缓存中图片清空
ftype = "" '将缓存中图片信息清空
cc = cc - 2 '将可见图片数量减一
Label4.Caption = Label4.Caption + 1
Dim flag As Integer
Dim a As Integer
flag = SND_ASYNC Or SND_NODEFAULT
a = sndPlaySound(App.Path & "\c.wav", flag) '播放声音
Else '如果两张图片类型不一致执行
focus = Index '获取当前焦点
ftype = Picture1(Index).Tag '获取当前图片类型
flag = SND_ASYNC Or SND_NODEFAULT
a = sndPlaySound(App.Path & "\a.wav", flag) '播放声音
End If
If cc = 0 Then '如果可见图片数量为零就执行
flag = SND_ASYNC Or SND_NODEFAULT
a = sndPlaySound(App.Path & "\e.wav", flag) '播放声音
Dim but As VbMsgBoxResult
but = MsgBox("恭喜你通过瑶瑶犀利版连连看!是否进入下一关?", vbOKCancel, "连连看")
If but = vbOK Then
Call rom '重新开始
Label3.Caption = Label3.Caption + 1
nd = nd + 1
Else
End '结束
End If
End If
End Sub
Private Sub Picture1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
For i = 0 To Picture1.Count - 1
If (i = Index) Then
Picture1(i).BorderStyle = 1
Else
If (i = focus) Then
Picture1(i).BorderStyle = 1
Else
Picture1(i).BorderStyle = 0
End If
End If
Next i
End Sub
Sub rom() '开始
Label2.Width = 3255
For k = 0 To 59 '产生随机数
Picture1(k).Visible = True
Next k
focus = -1
cc = False
ftype = ""
cc = Picture1.Count
Dim a(60) As Integer
Randomize
Dim flag As Boolean
a(0) = Int(Rnd * 60)
For i = 1 To 59
Do
flag = True
temp = Int(Rnd * 60)
For j = 0 To i - 1
If temp = a(j) Then
flag = False
Exit For
End If
Next j
Loop While (flag = False)
a(i) = temp
Next i
Dim tt As Integer
Dim ll As Integer
tt = Picture1(0).Height + 100
ll = Picture1(0).Width + 100
Dim tp As Integer
tp = 0
For xx = 1 To 10 '设置图片位置
For yy = 1 To 6
Picture1(a(tp)).Left = xx * ll
Picture1(a(tp)).Top = yy * tt
tp = tp + 1
Next yy
Next xx
End Sub
Private Sub Timer1_Timer()
Line1.Visible = False '让线消失
End Sub
Private Sub Timer2_Timer()
Label2.Width = Label2.Width - nd
If Label2.Width <= 50 Then
flag = SND_ASYNC Or SND_NODEFAULT
a = sndPlaySound(App.Path & "\d.wav", flag) '播放声音
MsgBox ("恭喜您败了!")
End
End If
If Label2.Width >= 3255 Then Label2.Width = 3255
End Sub
4.2程序运行截图
图1
图2
5.问题分析与解决方案
在第一步编程过程中很顺利的编写好了各模块,最后整合成了一个完整的程序,但在调试过程中遇到许多问题。如一些由于粗心导致分号,括号,字母输错的例子很多,但都很快改正。还有函数调用错误,还有在写程序中我常忘记头文件包含命令,以及函数声明,导致调试中出现警告。这让我体会到只有耐心的一行一行的改错误才能把程序调试好。
运行中遇到的问题:例如,对数据的写文件操作中,我把存在
Fly[N]中的数据以fwite(&fly[N,sizeof(struct flight)],1,fp)写入文件,结果发现文件中总是不能出现数据。以致程序不能运行后面部分。后来才发现取得地址错了应改成fwrite(&t,sizeof(struct flight),1,fp)。在显示阶段就是这问题让程序出现错误。不能正确读出输入的信息
6.小结与体会
回顾大学这一年的学习生活,拾起记忆的碎片,点点滴滴如幕影般在脑海中匆匆闪过,百感交集……
下面就闲谈一些学习生活上的心得以及这次课程设计的一些体会,整理一下自己的学习历程,希望能给自己一些启示。做为学生,学习是自己重要的事情是理所当然的,在明确它的重要性之后,就要以严谨的态度对待学习,认真的态度是学习上取得成绩的首要条件。在具体的学习过程中,要注意学习方法的利用和学习效率的保证。要知道长时间的自习并不一定能取得相应的成果,每个人的学习习惯是不同的,合理的安排自己的学习与休息时间是非常重要的,尽量挑选自己注意力最集中的时间段做关键科目的学习。注意劳逸结合,走科学的学习道路。学习计划的拟定也是必不可少的,特别是在课程较多的学期,拟定学期的学习计划可以提高学习的效率,并做到根据自己的实践情况实时地调整计划。学习的方法多种多样,同学之间一起研讨问题是提高大家水平的很好途径,教学相长,遇到困难请教同学,向同学讲解题目都有很大的益处,当然要掌握尺度,自己要有独立思考的能力。在各个科目的学习中,考试虽然是检验学生学习成果的有力手段,是我们应该重视的环节,可是平时的学习过程才是最重要的,扎实地掌握各专业课程内容,并尽量多的了解课本之外的专业相关的内容对将来的发展有极大的好处,无论是以后工作还是继续深造。以上的一切学习方法只是理论,要付诸实践毅力是必备的,牢记学海无涯苦作舟,学习并不是轻松的事情,须要刻苦求学并为之坚持不懈。路漫漫其修远兮,人们一直在寻求学习的方法,每个人在不同的阶段应追求不同的学习方法,可是学习应有的态度是始终不变的,在今后的学习道路上,我将在新的环境下新的学习历程中继续追寻…
参考资料
[1]刘大有等,《数据结构》(vb语言版),高等教育出版社,2003
[2]严蔚敏等,《数据结构》(vb语言版),清华大学出版社,2010
[3]William Ford,William Topp,《Data Structure with C++》清华大学出版社。 2009
[4]苏仕华等,《vb课程设计》,华夏出版社 2008
[5]陶大鹏,《vb语言实践教程》北京:中国水利水电出版社:2010
第二篇:vb课程设计说明书
Vb课程设计说明书
学生姓名: 学 号:
系别班级:
题 目: 记事本应用程序
20##年 12月19日
1 选题背景与意义
1.1 背景
为了满足一般用户对文本文件编辑的最基本需求,主要包括文本输入、字体编辑、支持纯文本文件的保存和文件打开处理等功能。所以在老师的帮助和自己查阅书籍的情况下,选择了记事本应用程序这个题目。
1.1.1 记事本应用程序的要求
记事本应用程序要求实现新建,打开,保存文件,对文本进行字体颜色编辑,对文本实现查找,能够复制粘贴功能。
1.1.2 记事本应用程序的功能
文件:可在任意时刻打开或新建文件,可将文件另存为和打印。也可对打开后的任意文件进行保存关闭。在退出时,对于没有保存的文件,程序将给予提示。
编辑:支持所有块操作。利用菜单或快捷键进行设置,有粘贴、复制、剪切、全选等功能。
对齐:包括居中、左对齐、右对齐。
颜色:有黑色、蓝色、绿色、红色以及所有颜色。
样式:粗体、下划线、删除线、斜体。
查找:查找和查找下一个。
帮助:提供对所有操作的详细说明。几乎所有操作都有对应的快捷键,使用户使用更加方便。
1.2 意义
通过设计记事本程序,学会了更好的使用CommonDialog 控件、ComboBox控件、RichTextBox等一些重要控件,掌握了如何设计工具栏和状态栏,在设计的过程中,把课堂上学到的知识,真正的运用到实践当中去,不仅加深了旧知识,还学到了一些新知识,收获很大。
2 主要程序代码及图示
Private Sub mnuedit_Click() '编辑 菜单项代码
If RichTextBox1.SelLength <> 0 Then '如果文本框中有选中的内容
muncut.Enabled = True '则剪切\复制\删除和粘贴菜单有效,
muncopy.Enabled = True
mnudelete.Enabled = True
munpaste.Enabled = True
Else
muncut.Enabled = False '否则无效
muncopy.Enabled = False
mnudelete.Enabled = False
End If
End Sub
设计界面如下:
Private Sub center_Click() '居中
RichTextBox1.SelAlignment = 2
End Sub
Private Sub right_Click() '右对齐
RichTextBox1.SelAlignment = 1
End Sub
Private Sub left_Click() '左对齐
RichTextBox1.SelAlignment = 0
End Sub
Private Sub RichTextBox1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
If RichTextBox1.SelText <> "" Then
muncut.Enabled = True '启用"剪切"菜单项
muncopy.Enabled = True '启用 "复制"菜单项
mnudelete.Enabled = True '启用"删除"菜单项
munpaste.Enabled = True '启用"粘贴"菜单项
End If
End If
End Sub
Private Sub muncopy_Click() '复制
Clipboard.SetText RichTextBox1.SelText
End Sub
Private Sub muncut_Click() '剪切
Dim muncut As Integer
Clipboard.SetText RichTextBox1.SelText
RichTextBox1.SelRTF = ""
End Sub
Private Sub munpaste_Click() '粘贴
If Clipboard.GetFormat(vbCFRTF) Then
RichTextBox1.SelText = Clipboard.GetText
ElseIf Clipboard.GetFormat(vbCFText) Then
RichTextBox1.SelText = Clipboard.GetText
End If
End Sub
Private Sub mnuprint_Click() '文件打印
On Error Resume Next
CmnDlg1.ShowPrinter
Printer.Copies = CmnDlg1.Copies
Printer.Print RichTextBox1.Text
End Sub
Private Sub mnusave_Click() '文件保存
Dim rtffile As String, ab As Boolean
CmnDlg1.Filter = "text 文件(*.txt)|*.txt|rtf文件(*.rtf)|*.rtf"
CmnDlg1.FilterIndex = 2
CmnDlg1.ShowSave
rtffile = CmnDlg1.FileName
RichTextBox1.SaveFile rtffile
ab = False
End Sub
Private Sub allcolor_Click() '所有颜色
CmnDlg1.ShowColor
RichTextBox1.SelColor = CmnDlg1.Color
End Sub
Private Sub about_Click() '帮助
Shell ("notepad 帮助文件.txt")
End Sub
Private Sub Form_Load()
Dim I As Integer
RichTextBox1.Width = Form1.ScaleWidth
RichTextBox1.Height = Form1.ScaleHeight
ab = True
Form1.Caption = "新文档 - 记事本" '标题栏显示名
For I = 0 To Screen.FontCount - 1
Combo1.AddItem (Screen.Fonts(I)) '将系统屏幕字体赋给Combo1
Next I
Combo1.Text = RichTextBox1.Font.Name '将RichTextBox1字体赋给Combo1
For I = 1 To 80
Combo2.AddItem (I) '给Combo2赋值1~80
Next I
Combo2.Text = RichTextBox1.Font.Size '将当前RichTextBox1控件的字体大小作为
End Sub '初值赋给combo2
Private Sub Combo1_Click()
RichTextBox1.SelFontName = Combo1.Text '改变RichTextBox1所选文本的字体
End Sub
Private Sub Combo2_Click()
RichTextBox1.SelFontSize = Combo2.Text '改变RichTextBox1所选文本字体大小
End Sub Private Sub find_Click() '查找
findstr = InputBox("请输入字符串:", "输入", RichTextBox1.SelText)
If Len(findstr) > 0 Then
RichTextBox1.find findstr, 0
findpos = RichTextBox1.SelStart + 1
find.Enabled = True
End If
End Sub
Private Sub fintN_Click() '查找下一个
If Len(findstr) > 0 Then
RichTextBox1.find findstr, findpos
findpos = RichTextBox1.SelStart + 1
End If
End Sub
文本编辑栏中工具栏的程序设计如下:
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Key
Case "tnew"
mnunew_Click
Case "topen"
mnuopen_Click
Case "tsave"
mnusave_Click
Case "tcut"
muncut_Click
Case "tcopy"
muncopy_Click
Case "tpaste"
munpaste_Click
Case "tprint"
mnuprint_Click
Case "tprint"
mnuprint_Click
Case "tabout"
about_Click
End Select
End Sub
Private Sub mnuexit_Click() '退出
Dim stat As Integer, ab As Boolean
If ab Then
stat = MsgBox("文件已被修改,是否保存?", vbYesNo Or vbQuestion, "警告")
End If
If stat = 6 Then
mnusave_Click
Else
Unload Me
End If
End Sub
课程设计心得
经过这几周的课程设计,使我对 Visual Basic编程有了更深一层的了解。经过这几天的编程与不断调试,我的努力终于有了成果。我设计的是记事本,这其中得用CommonDialog 控件、ComboBox控件、RichTextBox等一些重要控件,来设计工具栏和状态栏完成文本编辑和操作。整个设计的过程也是我不断学习的一个过程,我在运用旧知识的同时也学到了不少新知识,给自己大脑充电的同时也填补了一些相关知识方面的空白。
整个设计的过程中,我不仅仅只是经历了是失败与成功所带来的启迪,我还体会到了一种很重要的东西,那就是团体的力量。设计中,我有解决不了得地方就请教老师和同学, 可以说在大家的帮助下我才得以完整的呈现出我的成果。这次课程设计让我学到了很多东西。对程序设计有了更具体的认识,让我复习了以前学过的知识,也让我们对程序设计有了更深刻的理解。总之,这次的设计使我受益颇深。
参 考 文 献
1张宇敬,郑艳娟. Visual Basic程序设计教程.第1版.中国市场出版社,2006