vb游戏编程

 Visual Basic小游戏:猜英雄
量脚器
相信不少读者都看过央视的《水浒》吧,林冲、武松、李逵等英雄好汉的音容笑貌仿佛还浮现在我的眼前,那么108将中你最喜欢谁呢?我做了一个小程序来让电脑猜测你的心思,程序界面如图所示。
  为了简化问题,我选择了其中的27将,将他们分成3组,每组9人。如果你最喜欢其中的一个(比如史进),他在第一组出现了,那么就按下按钮“第一组”。然后这27将会重新排列顺序,你再史进在哪一组,比如发现他在第二组,就按下按钮“第二组”,画面中的人物次序会再次打乱,再史进所在组别……最多3次,电脑将会猜出你心中的英雄!
  知道了玩法,下面我将介绍程序是如何实现的:
  一、猜测的奥妙——推算原理
  猜测的原理其实也不复杂,我们来模拟一下猜测的过程大家就清楚了。程序初始化时是把1~27将随机打乱分别放入PageControl控件的三个选项卡中,每个选项卡放9张图片。点击一次按钮后其实不是盲目地将顺序打乱,而是进行了筛选,把有用的图片(就是点选的那组的9张图片)筛选出来平均分配到PageControl控件的三个选项卡中,再把不需要的图片集中起来平均分配到PageControl控件的三个选项卡中,最后在各个选项卡中把有用的、无用的图片随机打乱再次重新排列显示出来,从而完成猜测。用表1来说明:
点击按钮的次数
选项卡1
选项卡2
选项卡3
1
3
3
3
2
1
1
1
3
0
0
0
  具体讲,当第一次按下按钮时,表示你相中的图片在其中一个选项卡的9张图片内。于是把这9张图片均分成3份,每份3张,分别送入3个选项卡,其余的图片就不做考虑了。当第二次按下按钮时,表示你相中的图片在其中一个选项卡的3张图片内,于是把这3张图片均分成3份,每份1张,分别送入3个选项卡,当第三次按下按钮时,表示你相中的图片在其中一个选项卡的1张图片内,毫无疑问,这张图片就是你相中的图片,于是程序把这张图片显示出来。
  打乱重排的算法
  在程序中的很多地方要涉及打乱顺序重排的问题,下面我们就来先简单介绍一下打乱是如何实现的。
  这里要实现的方法是比较简单的,也就是多次把数组的不同位置的值互换,就像读小学时老师让两个同学互换位置一样,老师不断随机抽两个同学互换位置,最后同学们的座位就都重新排了一遍。
  举个例子:
  int i,temp1,temp2,a[2],b[27]
for(i=1;i<=27;i++)//先对数组赋初值
b[i]=i;
randomize();
for(i=1;i<=500;i++)//i的大小决定打乱的程度,循环次数越多,打乱程度越高
{
temp1=random(27)+1;
temp2=random(27)+1;
a[1]=b[temp1
];
b[temp1]=b[temp[2];
b[temp2]=a[1];
}
//输出
ListBox1->Clear();
for(i=1;i<=27;i++)
ListBox1->Items->Add(IntToStr(b[i]));
  如上例所示,经过打乱,b[27]数组将不再是旧时容颜。
  二、实现的关键——筛选算法的介绍
  在整个实现的过程中,如何在每一次打乱后对人物进行筛选是程序的关键所在,处理不好,程序就不
会有结果。而且筛选很容易把你搅得头晕脑胀,所以涉及的各个数组之间的关系一定要先理顺,先用一个例子来解释如何进行筛选。以点击按钮的次数是第一次并且点击的按钮是Button1为例加以介绍,其思路如下:
  初始:
  第一次执行按钮事件并且按下的是Button1时(表a的数组就是关键数组):
directdraw  把表a打乱后平均拆分为3组分别送入内存缓冲区
  把表b和表c打乱后也平均拆分为3组分别送入内存缓冲区(非重要的数组),然后将它们进行组合,分别把有用的和无用的搭配重新组合为三张表并显示出来:
  把全部的筛选过程表述出来:
  1.初始化:
  把a[1-27]打乱并将
  a[1-9] 赋给first[1-9]
  a[10-18] 赋给second[1-9]
  a[19-27] 赋给third[1-9]
  2.第一次按钮事件(假设选中的是第二个选项卡)
  second[1-9]打乱后赋给temp1[1-3]、temp2[1-3]、temp3[1-3]
  a[1-9]+a[19-27]赋给temp4[1-18] 并打乱
  temp1[1-3]+temp4[1-6]赋给first[1-9]并打乱
  temp2[1-3]+temp4[7-12]赋给second[1-9] 并打乱
  temp3[1-3]+temp4[13-18]赋给third[1-9] 并打乱
  3.第二次按钮事件(假设选中的是第二个选项卡)
  temp2[1-3]打乱后赋给temp5[1]、 temp6[1] 、temp7[1]
  temp1[1-3]+temp3[1-3]+temp4[1-18]赋给temp8[1-24]并打乱
  temp5[1]+temp8[1-8]赋给first[1-9] 并打乱
  temp5[2]+temp8[9-16]赋给second[1-9] 并打乱
  temp5[3]+temp8[17-24]赋给third[1-9] 并打乱
  4.第三次按钮事件(如果选中的是第二个选项卡)
  把temp5[2]所对应的图片显示出来即可。
  最后分别把表a—表c打乱后显示出来即可。 进行二次、多次筛选的方法都一样,只是要注意相中的好汉在哪个数组里面,千万别搞错就行了。
  三、小结
  最后的工作就比较简单了。可以设计一个友好的界面,然后在程序启动的时候对数组赋初值,并显示出来;对每个按钮分别先进行次数判断,然后进行前面讲述的处理,不断筛选直到剩下惟一的好汉后就可以显示在界面的正下方了。
用VB.NET实现你的游戏梦想
简单的游戏往往更耐玩,就比如伴我度过高考的赛车游戏:一切都是方块,所谓的赛车也只是四个方块。
  第一步,绘制对象:用函数drawcar()画赛车,drawway(n)画跑道的第n层。
  第二步,接受控制:F
orm的KeyPreview属性要设为true,在Form_KeyPress函数中通过改变全局变量cx来控制赛车的位置。
  第三步,游戏循环:作为即时游戏,必须要有一个Timer,并在其事件Timer1_Timer()中绘制所有对象和进行碰撞检测。本例中,绘图部分写在了Timer1_Timer()中,碰撞测试放在了test()中。
  ……这也是所有即时游戏所共通的框架。当然,我们往往还是根据具体的设计作一些变通,发挥一些技巧……比如这里设计的跑道是随机产生的的,这就要通过一点技巧以便既让玩家感到挑战,又不至于出现不可逾越的难关……
  下面是全部源代码,窗体上只需放个按钮Command1就行了!
  Const D = 100 '方格的宽度
Const BT = 3000 '跑道底部的y坐标
Dim l1(22) As Integer '每层跑道左边有几个方块
Dim l2(22) As Integer '每层跑道右边有几个方块
Dim cx As Single '赛车的在x轴的位置
Private Sub Command1_Click()
 cx = Width / 2 - 3 * D / 2
 cy = Height - D
 drawcar
 For i = 1 To 20
  l1(i) = 0
  l2(i) = 0
  drawway (i)
 Next i
 Timer1.Enabled = True
End Sub
Private Sub drawcar()
 Line (cx, BT - 100)-Step(3 * D, D), BackColor, BF
 Line (cx + D, BT - 200)-Step(D, D), BackColor, BF '先擦
 Line (cx, BT - 100)-Step(3 * D, D), RGB(225, 0, 0), BF
 Line (cx + D, BT - 200)-Step(D, D), RGB(225, 0, 0), BF
End Sub
Private Sub drawway(n)
 Line (Width/2-3*D/2-2*D,BT-n*D)-Step(7*D,D),BackColor, BF
'先擦后画
 Line (Width/2-3*D/2-2*D,BT-n*D)-Step(l1(n)*D, D), ,BF
 Line (Width/2-3*D/2+5*D,BT-n*D)-Step(-l2(n)*D,D), ,BF
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
 Select Case KeyAscii
  Case Asc("a"), Asc("A")
   cx = cx - D
  Case Asc("s"), Asc("S")
   cx = cx + D
 End Select
End Sub
Private Sub Timer1_Timer()
 Randomize
 For i = 1 To 19
  l1(i) = l1(i + 1)
  l2(i) = l2(i + 1)
  drawway (i)
 Next i
 Do
  l1(20) = Int(Rnd * 5)
双角钢  l2(20) = Int(Rnd * 5)
 Loop Until ((l1(20) + l2(20) <= 4) And (l1(20) - l1(19) <= 1) And _
(l2(20) - l2(19) <= 1) And (l1(19) + l2(20) <= 4) And _
(l1(20) + l2(19) <= 4)) '这里生成新一层跑道,
'注意要筛去玩家不可能通过的情况!
drawway (20)
'以上画出跑道
 drawcar
 test
End Sub
Private Sub test()
 If 3.5*D-Width/2+cx<l1(1)*D Then Timer1.Enabled=False
 If 3.5*D-Width/2+cx+D<l1(2)*D Then Timer1.Enabled=False
调频音箱 If 3.5*D-(cx+3*D-Width/2)<l2(1)*D Then Timer1.Enabled=False
 If 3.5*D-(cx+2*D-Width/2)<l2(2)*D Then Timer1.Enabled=False
End Sub
用VB6.0设计简易赛车游戏
 游戏开发是许多程序员的梦想,看着游戏中那华丽的画面。有多少人会感叹,如果自己能做就好了。?
  然而开发游戏需要对DirectX的调用,原来除了C++没有其他语言可以胜任这份工作,虽然DirectX7.0S
DK加入了对VB的支持,但是VB毕竟能力有限,无法胜任这份严峻的工作,游戏可以说是最吃资源的程序,VB的速度无法完成。即使做出个游戏也被人说做不入流。这样一来VB程序员无法实现自己的梦想了。
  推出了,VB的性能已经可以和VC++媲美,用微软的说法内核是一样的,只不过是语法的差异。VB程序员大喜,这样再也不会被C++程序员说成是傻瓜程序员了,你们能做的我们一样可以。
  好了现在切入正题,现在我们来做一个简单的游戏。
  首先先要对游戏有个整体构架才行,VB中对类的设定比较可爱,功能也非常强大,不用一用起不太对不起微软了。
  调用DirectX,首先先要安装DirectX7.0以上版本的SDK开发包,然后新建一个项目,选择Windwos应用程序。
  然后选择引用DirectX方法是,选择引用->COM->DirectX7 for VisualBasic Type Library
  好了,至此你已经引用了DirectX7.0
  首先为了方便使用我们调用DirectX7.0,所以我们声明
  Imports DxVBLib
  然后我们定义一个DirectX7.0的对象
  Public DirectX As New DirectX7
  声明一个DirectDraw对象,用于2D游戏的绘图
  Public DDraw As DirectDraw7
DDraw = DirectX.DirectDrawCreate("")
  然后要设置DirectDraw的协作层
  Call DDraw.SetCooperativeLevel(Me.Handle.ToInt32, CONST_DDSCLFLAGS.DDSCL_FULLSCREEN Or CONST_DDSCLFLAGS.DDSCL_ALLOWMODEX Or CONST_DDSCLFLAGS.DDSCL_EXCLUSIVE)
用VB6.0开发猜数字小游戏
 随着Windows95 and 98的流行,越来越多的人加入Windows程序设计的队伍之中。以前,Windows程序设计是那些训练有素的专业程序设计者才会涉足的神秘领域,几乎所有的Windows程序都是用C/C++语言编写的,这对大部分普通程序设计者来说,要想高效迅速地编写出具有一定功能的Windows程序就不是一件容易的事情了。
  1991年,Microsoft公司首次推出了Visual Basic for Windows,从此,人们不用C/C++或汇编就可以编写Windows程序了。到目前为止,我认为在所有的Windows程序设计工具中,Visual Basic 是最方便的,它以一种全新的思想让程序员快捷和高效地设计出Windows程序。目前,Visual Basic 的最高版本为6.0,本文讲述用运行于Win95/98 上的VB6.0来开发一个猜数字的小游戏。
  首先说一说猜数字这个游戏的玩法,一开始计算机会随机产生一个不重复的四位数,你要输入四位不重复的数与计算机给出的数作对比,如果与计算机给出的数的位置相同数字相同,那么将会是1A,如果数字相同而位置相不同,将会显示1B。例如:计算机的随机数字为:1234 ,我猜的数字为:1356 ,那么这时计算机会给你提示为:1A1B,也就是说,你猜的数字中,有一位数字是猜对
的,而且数字位置都对,所以显示为1A;还有一个数字也猜对了,但是位置不对,所以显示为1B。就这些了,看谁猜的次数少。
  首先在Form中加入一个CommandButtion控件,在Command1上点击鼠标右键,选择复制,在窗体上点击鼠标右键,选择粘贴在窗体上粘贴出九个Command1,此时出现对话框问你要不要创建控件数组,在此选择是。然后再加入两个CommandButtion控件,一个ListBox、一个Frame、一个Label 。设置窗体的Caption属性为“猜一猜”、BorderStyle为1-Fixed Single、控件数组的Captin分别为0、1、2、3、4、5、6、7、8、9,Command2的Caption为“确定",Command3的Caption为“取消",Frame1
的Caption为“提示:",Label1的Cpation为“0A0B"。然后选择菜单编辑器编辑菜单为:游戏、新游戏、显示答案、结束游戏,她们的Name属性分别为:Game、New、View、End。好了,其余属性使用缺省的即可,最后的界面应跟下图一样:
GIFs,JPGs和DirectInputMouse在用VB做游戏的运用
相对而言,不是很难,我们并不需要解码器来得到JPG的每一个字节,或任何类似于次的,相反,我们将用一个图片框来打开一个图片,然后再将其传到表面,但首先我门需要声明API函数:
  Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC 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 dwRop As Long) As Long
  Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
  Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
  Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  Public 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
  现在我们要为加载图片作好准备
  Dim Pict1 As StdPicture
  Set Pict1 = LoadPicture("MyPict.jpg")
  创造表面:
  Dim TDesc As DDSurfaceDesc2
  TDesc.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
  TDesc.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
  TDesc.lHeight = CLng((Pict1.Height * 0.001) * 567 / Screen.TwipsPerPixelY)
  TDesc.lWidth = CLng((TPict.Width * 0.001) * 567 / Screen.TwipsPerPixelX)
 Set Surf = DDraw.CreateSurface(TDesc)
  Dim SurfDC As Long, PictDC As Long
彩印业务  SurfDC = Surf.GetDC
  PictDC = CreateCompatibleDC(0)
  SelectObject Pict1.Handle, PictDC
  我们将使用Dcs和Bitblt或StretchBlt来把Pic1复制到表面
  只复制成一样大小:
  BitBlt SurfDC, 0, 0, TDesc.lWidth, TDesc.lHeight, PictDC, 0, 0, vbSrcCop
y
  现在复制并且改变图片大小
  StretchBlt SurfDC, 0, 0, StretchWidth, StretchHeight, PictDC, 0, 0, TDesc.lWidth, TDesc.lWidth, vbSrcCopy
  释放DC:
  Surf.ReleaseDC SurfDC
  DelecteDC PictDC
  Set Pict1 = Nothing
  下一步该怎么作呢?下载SurfUtil。Bas,我将利用这一技巧来创造并加载图片
  注意:有时StretchBlt不能正常显示GIF,那就是我添加了BitBlt这个函数的原因
  .
  特殊效果
  你会懒的不想利用C/C++或汇编来创造一个动态连接库,并用那个动态连接库来完成特殊效果吗?
  就让blitter(我不认识,也查不出来,可能是glitter,闪光)光栅操作(ROP)为你工作!
  我的格言是让最小的努力为你带来最大的报酬!
  在Vb中有不少可使用的ROP常数:
  vbSrcPaint -逻辑或操作,源和目标图片,做一个模拟的Alpha混合效果。
  vbSrcAnd - 逻辑与操作,灰度效果。
  vbSrcInvert - 逻辑异或操作。
蒸汽发电机  vbSrcErase - 翻转目标图片,然后再和源图片进行逻辑与操作
  vbSrcCopy - 把原图片直接复制到目标图片上,在圆满的替换掉?(replacing it completely)
  vbDstInvert -翻转目标图片,全部忽略原图片。
  vbNotSrcCopy -翻转源图片,然后在直接复制到目标上,又是圆满的替换掉?(replacing it completely)
 vbNotSrcErase - 对源图片和目标图片进行逻辑或操作,在翻转。
  现在我们利用这些ROP有两个执行销毁的方法。我们能够使用APIBitBlt这个函数,,也可以使用DirectX的BltFx函数,只有用户的显卡能够使用硬件来支持ROP而不是软件模拟ROP,BltFx才能够工作,否则BltFx将会失败!无论怎样,BltFx失败时,API的BitBlt还是能够调用,在软件中,一切就绪时,BitBlt就决不会失败!
  (深思熟虑:当使用BltFx时,它可以完美的将表面放到显存以使其借助显卡的Blitter(和上面的一样,不认识也查不出来)来快速访问,而当另外使用API函数BitBlt时,它却完美的将其置放到系统内存,否则数据将会被从显存中修改后带来,然后它将回到显存,没有效率啊!)
  容易的知道确认用户的显卡是否硬件支持特殊的ROP是件很好的事,我写了一个简单的函数来确认:
  Private Function TestROP(ByRef surfBack As DirectDrawSurface7, lngROP As Long) As Boolean
  Dim objBltFx As DDBLTFX
  Dim rectTemp As RECT
  Dim surfTemp As DirectDrawSurface7
  Dim udtDDSD As DDSURFACEDESC2
  '创造一个临时的表面
  udtDDSD.lFlags = DDSD_HEIGHT Or DDSD_WIDTH
  udtDDSD.lHeight = 1
  udtDDSD.lWidth = 1
  Set surfTemp = mdd.CreateSurface(udtDDSD)
  '设置BltFx的ROP操作代码
  objBltFx.lROP = lngROP
  '源和目标矩形
  rectTemp.Right = 1

本文发布于:2024-09-20 20:18:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/337279.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图片   游戏   进行   打乱   程序   出来
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议