admin 管理员组

文章数量: 887021


2024年3月1日发(作者:0是偶数吗还是奇数数吗为什么)

目 录

第1章 课程设计目的与要求 .....................................................................................................

1

1.1 课程设计目的 ........................................................................................................... 1

1.2 课程设计的实验环境 ............................................................................................... 1

1.3 课程设计的预备知识 ............................................................................................... 1

1.4 课程设计要求 ........................................................................................................... 1

第2章 课程设计内容....................................................................................................... 2

2.1 游戏介绍 ................................................................................................................... 2

2.2 游戏设计 ................................................................................................................... 2

2.3 游戏实现 ................................................................................................................... 12

第3章 课程设计总结....................................................................................................... 14

参考文献 ................................................................................................................................ 16

第1章 课程设计目的与要求

1.1 课程设计目的

本课程的课程设计实际是学生学习完《可视化编程技术》课程后,进行的一次全面的综合训练,其目的在于加深对可视化编程技术基本知识的理解,掌握运用VB开发应用程序的基本方法及基本技巧。

1.2 课程设计的实验环境

硬件要求能运行Windows 9.X操作系统的微机系统。

软件:Microsoft Visual Basic 6.0

1.3 课程设计的预备知识

熟悉Visual Basic 6.0程序设计的基本语法知识及常用技巧。

1.4 课程设计要求

按课程设计指导书提供的课题,每个小组设计一个完整的小游戏应用程序。要求根据规定设计游戏的具体要求,按照应用程序的设计步骤和VB的基本知识应用程序的分析与实现。应根据后面给出的基本学时分配合理安排设计时间,并独立完成各方面的设计。选择同一题目的同学,可以共同协作完成一个应用程序的开发任务。要求书写详细的设计说明书,对有复杂的代码段和程序段的部分,应画出程序流程图,写出全部的代码。在界面设计中,需画出每个窗体的布局,进行属性说明,杜绝雷同。

1

第2章 课程设计内容

2.1游戏介绍

2.1.1 游戏规则

游戏要求:游戏开始时自动进入第一关,状态栏里显示操作提示。可以通过方向键控制小人的移动,按空格键重新开始本关,或者用回车键、翻页键选择其他关;当按下键时退出本游戏。在移动过程中,如果前方是一个箱子,并且箱子的前面没有墙或其他箱子阻挡,那么就可以把它向前推动一格。游戏的任务是把所有的箱子都推到标记处。

2.1.2 游戏说明

游戏的意图是要求玩家推动箱子完成三个箱子任务,左右键用于走动,SHIFT键用于推动箱子,CONTROL用于跳,SHIFT和CONTROL是推动箱子一起跳,若游戏失败可重新开始游戏。

2.2游戏设计

2.2.1 界面设计

图2-1界面设计

2

2.2.2 属性设置

Form1()属性值:

控件名

属性值

Name Form1

Hscroll1.

HScrollBar

Hscroll1 Picture1

&H8000000F&

Label2

&H8000000F&

Left

eBox

BackColor &H8000000F&

Caption Menace Map

editor

Value

Visible

frmBlt()属性值:

控件名

属性值

Name

BackColor

Caption

Enabled

Interbal

Splash()属性值:

控件名

属性值

Name Command1

frmBlt

&H8000000F&

Menace

True

True

1

True

True

True

Timer1

False

100

dButton

Image1

1-3D

Label1

1-3D

splash

1-3D Appearance 1-3D

Caption Play Menace The left and Menace

right arrows

walk menace.

3

Visible

Cancel

True

False

True

0-None

True

0-None

True

2-Sizable BorderStyle

图2-2属性设置

2.2.3 编程思路及代码

游戏思路:使用棋盘法设计推箱子游戏

“棋盘”游戏的种类丰富,俄罗斯方块,推箱子,象棋,五子棋......等等这些都可以归类到“棋盘”游戏中来。面对这类游戏设计的时候,我本人的见解是首先对“棋盘”做研究,实在不行再去研究“棋子”。换句话说,就是以游戏中的活动区域为研究对象,像象棋就是他的棋盘,俄罗斯方块就是他整个的方块的活动区域。我们这里姑且就把他叫做“棋盘法”。

一. “棋盘法”基本实现方法

“棋盘法”实现起来其实很简单,一般来说就是把棋盘看作一个网格,那么我们就把他看作与之对应的二维数组。然后适当组织数据结构去抽象旗子,制定规

则,这样就很容易实现游戏。

二. “棋盘法”的优缺点

任何一个算法或思想都是有优缺点的,而我们的“棋盘法”的最大优点就是可以方 4

便我们组织数据结构,简化了游戏规则的编写,使我们编程时思路比较清晰直观,通常就是直接根据游戏实际规则编写就可以了,这个我们会以实例加以说明。然而他最大的缺点就是可能耗费大量内存,试想,如果我们的棋盘规格很大,那我们就得开辟一个比较大的二维数组,并且如果你要将代码移植到单片机,ARM等硬件平台上。那你就不得不考虑自己的方法问题,在这些硬件平台上内存资源是极其宝贵的。也许有朋友会说那在PC机上总可以的。的确现在PC机资源丰富,功能强大,可有时候还是不能如你所愿。一个很经典的例子就是五子棋的人工智能,为了让五子棋在人机对战中具备攻防兼备的智能,我们只有开辟一个于棋盘规格相呼应的二维的树组来记录棋盘上各点的胜算几率,(有兴趣的朋友可以到网上去找找资料)这样的话,在DOS下你就只能开辟一个约 10X10

的棋盘,即使在WINDOWS下也只能大约 16 X 16 的棋盘。(当然,这里是说直接开辟数组,采用特别技术的不算)。所以说,这个“棋盘法”也是有他自己的限制的。

游戏代码:

Form1()代码:

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As

Long

Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject

As Long, ByVal nCount As Long, lpObject As Any) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal

hObject As Long) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst

As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As

Long, ByVal un2 As Long) As Long

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As

Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC

As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal

nSrcHeight As Long, ByVal dwRop As Long) As Long

5

Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

Const ResolutionX = 640

Const ResolutionY = 480

Dim dd As DirectDraw2

Dim ddsdFront As DDSURFACEDESC

Dim ddsFront As DirectDrawSurface2

Dim ddsBack As DirectDrawSurface2

Dim aDDS As DirectDrawSurface2

Dim tDDS As DirectDrawSurface2

Dim ddCaps As DDSCAPS

Dim fx As DDBLTFX

Dim spnx%(40), spny%(40), spnw%(40), spnh%(40), spnox%(40), spnoy%(40)

Dim mode% , anim% , animshift% ,bname$(30) ,bcells%(30),bchar%(30, 30) ,bxo%(30, 30),byo%(30, 30),blockx%(30) ,blocky%(30),blockcell%(30),blockmode%(30) ,blockcount% ,level%

Dim map(40, 6) As Integer

Dim mapl%, mapv%

Private Function CreateDDSFromBitmap(dd As DirectDraw2, ByVal strFile As String)

As DirectDrawSurface2

Dim hbm As Long

Dim bm As BITMAP

Dim ddsd As DDSURFACEDESC

Dim dds As DirectDrawSurface2

Dim hdcImage ,mhdc , clr As Long

hbm = LoadImage(ByVal 0&, strFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE Or

LR_CREATEDIBSECTION)

GetObject hbm, Len(bm), bm

With ddsd

.dwSize = Len(ddsd)

.dwFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH

6

. = DDSCAPS_OFFSCREENPLAIN

.dwWidth = h

.dwHeight = ht

Private Sub Form_Load()

Dim a%, g$, bi%

mapv% = 0

mode% = 3

anim% = 1

ShowCursor 0

DirectDrawCreate ByVal 0&, dd, Nothing

perativeLevel , DDSCL_EXCLUSIVE Or DDSCL_FULLSCREEN

playMode ResolutionX, ResolutionY, 8, 0, 0

Set aDDS = CreateDDSFromBitmap(dd, & "")

Set tDDS = CreateDDSFromBitmap(dd, & "")

With ddsdFront

.dwSize = Len(ddsdFront)

.dwFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT

. = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP

DDSCAPS_COMPLEX Or DDSCAPS_SYSTEMMEMORY

.dwBackBufferCount = 1

End With

Surface ddsdFront, ddsFront, Nothing

= DDSCAPS_BACKBUFFER

achedSurface ddCaps, ddsBack

Open & "" For Random As #1 Len = 2

For a% = 0 To 39

Get #1, a% * 6 + 1, spnox%(a% + 1)

Get #1, a% * 6 + 2, spnoy%(a% + 1)

Get #1, a% * 6 + 3, spnx%(a% + 1)

Get #1, a% * 6 + 4, spny%(a% + 1)

7

Or

Get #1, a% * 6 + 5, spnw%(a% + 1)

Get #1, a% * 6 + 6, spnh%(a% + 1)

Private Sub DrawNextFrame()

Dim a%, b%, xx%, ofx%, sp%, cbx%, cby%

Dim t As RECT

With fx

.dwSize = Len(fx)

.dwFillColor = RGB(0, 0, 0)

End With

= 0

= 0

= ResolutionY

= ResolutionX

t, Nothing, t, DDBLT_COLORFILL, fx

ofx% = mapl% 60

For a% = 0 To 11

If a% + ofx% >= 0 And a% + ofx% <= 39 Then

For b% = 6 To 1 Step -1

drawblock map(a% + ofx%, b% - 1), a% * 60 - (mapl% Mod 60), b% * 60

Next

End If

Next

For a% = 1 To 30

If blockmode%(a%) > 0 Then 'something to do

drawblock blockcell%(a%), (blockx%(a%) - mapl%) - 300, blocky%(a%)

Select Case blockmode%(a%)

Case 1, 2

If blockmode%(a%) = 1 Then blockx%(a%) = blockx%(a%) - 6 Else

blockx%(a%) = blockx%(a%) + 6

If blockx%(a%) Mod 60 = 0 Then

8

If blockmode%(a%) = 1 Then cbx% = (blockx%(a%) - 235) 60 Else

cbx% = (blockx%(a%) - 355) 60

cby% = (blocky%(a%) - 10) 60

blockmode%(a%) = 3 'fall

checkabove cbx%, cby%

End If

Case 3

If map((blockx%(a%) - 300) 60, (blocky%(a%) + 10) 60) = 0 Then

blocky%(a%) = blocky%(a%) + 10

Else

map((blockx%(a%) - 300) 60, (blocky%(a%) - 5) 60) = blockcell%(a%)

blockmode%(a%) = 0

checkforgroup

End If

End Select

End If

Next

Select Case mode%

Case 1, 2

Case 3, 4

anim% = anim% + 1

If anim% > bcells%(mode%) Then anim% = 1

If map((mapl% + 300) 60, (mapv% + 10) 60) = 0 And map((mapl% +

355) 60, (mapv% + 10) 60) = 0 Then

mapv% = mapv% + 10

Else

If mode% = 3 Then mode% = 6 Else mode% = 8

End If

If mapv% > 350 Then

mapv% = 350

9

If mode% = 3 Then mode% = 6 Else mode% = 8

End If

Case 5, 7 'jump left or right

anim% = anim% + 1

If anim% > bcells%(mode%) Then

If mode% = 5 Then mode% = 3 Else mode% = 4

anim% = 1

Else

If anim% <= 15 Then

If mode% = 5 Then 'left

If map((mapl% + 300) 60, (mapv% - 60) 60) = 0

mapl% = mapl% + bxo%(mode%, anim%)

Else

mode% = 3: anim% = 1

If animshift% Then startmove 1

Private Sub Timer1_Timer()

d = 0

While Not blnend

DrawNextFrame

u = DoEvents

Wend

Set aDDS = Nothing

Set tDDS = Nothing

GDISurface

eDisplayMode

perativeLevel 0, DDSCL_NORMAL

Set ddsBack = Nothing

Set ddsFront = Nothing

Set dd = Nothing

ShowCursor 1

10

Unload frmBlt

End Sub

If >= 0 Then

If xx% < 0 Then

= + Abs(xx%)

xx% = 0

End If

If xx% > 560 Then

= - (xx% - 560)

End If

If > Then t

DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT

End If

End Sub

If Not flag% Then

For b% = 0 To 5

ct% = 0: cc% = 0

For a% = 0 To 39

If map(a%, b%) > 3 Then

If map(a%, b%) <> cc% Then ct% = 0

cc% = map(a%, b%)

ct% = ct% + 1

Next

Select Case mode%

Case 1, 2

Case 3, 4

anim% = anim% + 1

If anim% > bcells%(mode%) Then anim% = 1

mapv% = mapv% + 10

Else

11

xx%, yy%, tDDS, t,

Next

End If

End Sub

2.3 游戏实现

2.3.1程序调试及测试

程序调试:

图2-3程序调试

测试:

图2-4 测试

12

2.3.2游戏运行

图2-5游戏运行

玩家即可进入游戏。

13

第3章 课程设计总结

我的课程设计内容是设计游戏——推箱子。在这次课程设计中,我运用了VB所学的知识,并且能够较熟练的使用一些编程语句。

回顾起此次课程设计,至今我们仍有很多感触。的确,自从拿到题目到完成整个编程过程,从理论到实践,在这整整半个学期的日子里,学到过很多很多的东西,在做这个课程设计时,不仅可以巩固了以前所学过的知识,而且还学到了很多在书本上没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中到应用,才能真正提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到不少的问题,可以说得是困难重重,这毕竟新做的,难免会遇到各种各样的问题。同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固。通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。

其中有很多编程问题,起初,我不知道从什么地方入手,后来,慢慢的进入了状态。我们组做的是一个推箱子的设计,内容包括很多,所以我们组员改为分工合作,经过一星期的努力,我们完成了整个程序,但是总是有很多错误出现,有好多是些小问题,这都是我们粗心大意造成的,所以设计程序一定要仔细,不容一点的马虎。当然也有大问题,关于文件的操作,是我们最大的问题,不过,后来经过反复琢磨和修改,还是完成了这些任务。

在这过程中,我们难免也会产生一些小矛盾,当然这是不可避免的。产生小矛盾并不要紧,重要的是我们如何去解决它。为什么会产生这些矛盾,以怎样的方式去解决它,这是我们应该去考虑的问题。我想经过这样的一个过程我们会学到很多,学会了怎样去和别人沟通,理解别人所做的事,别人也会宽容的对待我们,从而我们就在无形之中加强了我们的人际交往能力。这个经验对我们以后的人生将会发挥很大的作用。毕竟我们是生活在人类这个群体之中的。假如世界上只剩下一个人,那么他不可能长久的生活下去的。

一个团队单靠一个人或者队里几个人的努力是完不成整个队的任务的,需要队里所有人的共同努力。每个人都分配任务,并且是适合他的任务。要将不适合的任务分配给 14

一个人,那么他将很难完成。即使完成了,那一定是花很大的努力和精力去做了,那样效率就不高了。我们都希望在最短的时间里达到最高的效率。

生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。

本次课程设计,最后成功的完成了,这是老师让我们运用知识的很好的机会。

15

参考文献

[1] 汉清计算机工作室.Visual Basic 6.0 数据库开发实例.北京:机械工业出版社,2000:10-54

[2] 何旭洪.Visual Basic 数据库开发实例导航.北京:人民邮电出版社,2002:75-86

[3] 孙健鹏.VB数据库开发实例解析.北京:机械工业出版社,2005:204-283

[4] 王汉新.Visual Basic程序设计.北京:科学出版社,2002:128-197

[5] 陈惟斌.Visual Basic 6.0开发指南.北京:清华大学出版社,2001:100-201

[6] 张春葆.VB数据库系统设计与开发.北京:清华大学出版社,2006:273-294

[7] 李金玲.Access 2002数据库开发即时应用.北京:人民邮电出版社,2002:267-308

[8] 张之洞.Visual Basic 6 Harry M.北京:电子工业出版社,2005:128-231

[9] 李晓黎,张巍.Visual Basic应用系统开发与实例.北京:人民邮电出版社,2003:143-284

[10] 刘瑾.VB从入门到精通.北京:人民邮电出版社,2001:64-127

16


本文标签: 游戏 设计 课程设计 棋盘 箱子