游戏截图

开始游戏时显示的帮助 :

游戏的主要变量为小球、弹板、砖块,为此需要设计相应的对象(可以设计为类,本例设计为结构体了),地图(gamemap)设计为2维字节数组,其它变量有游戏关卡、得分、刷新时间等等。游戏地图用GDI绘制,因此引用Drawing2D组件。游戏界面绘制用mydraw()。

主要代码如下:

Imports System.Drawing.Drawing2D
Imports System.Drawing.Color
Imports System.ThreadingPublic Structure Qiu '定义小球Dim q_center As PointDim q_radius As IntegerDim q_type As IntegerDim q_color As ColorDim q_v_sudu As IntegerDim q_v_fangxiang As IntegerEnd StructurePublic Structure Tanban '定义弹板Dim t_length As IntegerDim t_center As PointDim t_type As Integer '1-普通弹板End StructurePublic Structure teshuFK '特殊方块Dim tsfk_x As Integer 'x坐标Dim tsfk_y As Integer 'y坐标Dim tsfk_type As Integer '类型Dim tsfk_show As Boolean '是否显示End StructurePublic QiuL() As Qiu '弹球集合Public qiuNum As Integer = 1 '弹球数量Public Const W As Integer = 50 '方块长度Public Const H As Integer = 20 '方块宽度Public Const mapW As Integer = 1000 '游戏区宽度Public Const mapH As Integer = 640 '游戏区高度Public gameMap As Byte(,) '游戏地图Public Const mapMX As Integer = 19Public Const mapMY As Integer = 31Public myTanban As Tanban '弹板Public mydefen As Integer = 0 ' 得分Public guanka As Integer = 1 '关卡Public qiuJDxian As Boolean = False '小球运动方向线Public shijianJge As Integer = 15 '刷新间隔,毫秒Public fnyinStr As String = My.Application.Info.DirectoryPath '程序所在目录Public tList As New List(Of Thread)Public Sub newGame() '初始化游戏With myTanban.t_center = New Point(mapW / 2, mapH - H / 2).t_length = 160.t_type = 1End WithqiuNum = 1ReDim QiuL(qiuNum - 1)For i As Integer = 0 To qiuNum - 1QiuL(i).q_center = New Point(myTanban.t_center.X, myTanban.t_center.Y - H)QiuL(i).q_radius = 7QiuL(i).q_type = 1QiuL(i).q_color = Color.RedQiuL(i).q_v_sudu = 0QiuL(i).q_v_fangxiang = Int(Rnd() * 100 + 40)NextReDim gameMap(mapMX, mapMY)For i As Integer = 0 To mapMXFor j As Integer = 0 To mapMYgameMap(i, j) = 0NextNextmydefen = 0guanka = 1setGuanka()End SubPublic Sub setGuanka() '根据关卡设置数组For i As Integer = 0 To 19For j As Integer = 0 To 31gameMap(i, j) = 0NextNextIf guanka > 19 Then guanka = 1If guanka < 1 Then guanka = 19Dim RANDOM As New Random(guanka)For i As Integer = 1 To guanka * 17Dim s As String = RANDOM.Next.ToStringgameMap(guanka * s.Substring(0, 1) Mod 20, guanka * s.Substring(1, 1) Mod 20) = Val(s.Substring(2, 1)) Mod 5gameMap((guanka * s.Substring(3, 1) + 13) Mod 20, guanka * s.Substring(4, 1) Mod 20) = Val(s.Substring(5, 1)) Mod 5NextFor j As Integer = 1 To guanka * 3Dim s As String = RANDOM.Next.ToStringgameMap(guanka * s.Substring(0, 1) Mod 20, guanka * s.Substring(1, 1) Mod 20) = 9NextFor k As Integer = 1 To 5 '设置特殊方块5个gameMap(Int(mapMX * Rnd()), Int((mapMY - 15) * Rnd())) = Int(Rnd() * 8 + 91)NextIf guanka Mod 2 = 0 Then '根据关卡设置弹板样式myTanban.t_type = 2ElsemyTanban.t_type = 1End IfEnd SubPublic Function myDraw() As Bitmap '绘图Dim bmp As Bitmap = New Bitmap(mapW, mapH)Dim ea As Graphics = Graphics.FromImage(bmp)ea.SmoothingMode = SmoothingMode.HighQualityea.Clear(Color.Black)For i As Integer = 0 To mapMXFor j As Integer = 0 To mapMYIf gameMap(i, j) = 1 Thenea.FillRectangle(Brushes.Brown, New Rectangle(i * W, j * H, W, H))ElseIf gameMap(i, j) = 2 Thenea.FillRectangle(Brushes.Teal, New Rectangle(i * W, j * H, W, H))ElseIf gameMap(i, j) = 3 Thenea.FillRectangle(Brushes.MediumBlue, New Rectangle(i * W, j * H, W, H))ElseIf gameMap(i, j) = 4 Thenea.FillRectangle(Brushes.LightBlue, New Rectangle(i * W, j * H, W, H))ElseIf gameMap(i, j) = 9 Thenea.FillRectangle(Brushes.Yellow, New Rectangle(i * W, j * H, W, H))ElseIf gameMap(i, j) > 90 And gameMap(i, j) < 100 Then '画特殊方块ea.FillRectangle(Brushes.Indigo, New Rectangle(i * W, j * H, W, H))End IfNextNextIf myTanban.t_type = 1 Then '画弹板ea.FillRectangle(Brushes.Orange, New Rectangle(myTanban.t_center.X - myTanban.t_length / 2, myTanban.t_center.Y - H / 2, myTanban.t_length, H))ElseIf myTanban.t_type = 2 Thenea.FillRectangle(Brushes.Red, New Rectangle(myTanban.t_center.X - myTanban.t_length / 8, myTanban.t_center.Y - H / 2, myTanban.t_length / 4, H))ea.FillRectangle(Brushes.Orange, New Rectangle(myTanban.t_center.X - myTanban.t_length / 2, myTanban.t_center.Y - H / 2, 3 * myTanban.t_length / 8, H))ea.FillRectangle(Brushes.LawnGreen, New Rectangle(myTanban.t_center.X + myTanban.t_length / 8, myTanban.t_center.Y - H / 2, 3 * myTanban.t_length / 8, H))End IfFor i As Integer = 0 To qiuNum - 1 '画小球If QiuL(i).q_v_sudu >= 0 Thenea.FillPie(New SolidBrush(QiuL(i).q_color), New Rectangle(New Point(QiuL(i).q_center.X - QiuL(i).q_radius, QiuL(i).q_center.Y - QiuL(i).q_radius), New Size(2 * QiuL(i).q_radius, 2 * QiuL(i).q_radius)), 0, 360)End IfNext'绘制文件(块文本)Dim denfenStr As String = "分数:" + mydefen.ToStringDim textSize As SizeFDim myBackBrush As Brush = Brushes.GreenDim myForeBrush As Brush = Brushes.GreenYellowDim myFont As New Font(SystemFonts.DefaultFont.Name, 15, FontStyle.Regular)' 找出绘制示例文本所需要的大小textSize = ea.MeasureString(denfenStr, myFont)Dim xLocation, yLocation As Single ' 用于位置' 获取一次位置以消除冗余计算xLocation = mapW - textSize.Width - 10yLocation = 10Dim effectDepth As Integer = 2For i = effectDepth To 0 Step -1ea.DrawString(denfenStr, myFont, myBackBrush, xLocation + i, yLocation + i)Next' 在黑色文本之上绘制水绿色主文本ea.DrawString(denfenStr, myFont, myForeBrush, xLocation, yLocation)If qiuJDxian Then '画角度虚线Dim mypen As Pen = New Pen(Color.GreenYellow, 2)Dim pDash() As DashStyle = {DashStyle.Dot, DashStyle.DashDot, DashStyle.Dash}mypen.DashStyle = pDash(2)For i As Integer = 0 To qiuNum - 1If QiuL(i).q_v_sudu > 0 ThenElseea.DrawLine(mypen, New Point(QiuL(i).q_center.X, QiuL(i).q_center.Y), New Point(QiuL(i).q_center.X + 140 * Math.Cos(QiuL(i).q_v_fangxiang / 180 * Math.PI), _QiuL(i).q_center.Y - 140 * Math.Sin(QiuL(i).q_v_fangxiang / 180 * Math.PI)))End IfNextEnd IfReturn bmpea.Dispose()bmp.Dispose()End FunctionPublic Function shifouguoguan() As Boolean '是否过关?,若数组全为0或9返回TRUE,过关Dim sfgg As Boolean = FalseDim num As Integer = 0For Each mapV As Integer In gameMapIf (mapV > 0 And mapV < 9) Or (mapV > 90 And mapV < 99) Then num += 1NextIf num = 0 Then sfgg = TrueReturn sfggEnd Function

接下来就是小球运动时碰到方块反弹。主要是根据小球所处位置,判断是否碰撞。代码如下:

   Public Function juliPP(ByVal P1 As Point, ByVal P2 As Point) As Single '求两点距离Return Math.Sqrt((P1.X - P2.X) ^ 2 + (P1.Y - P2.Y) ^ 2)End FunctionPublic Function YJpz(ByVal Yx As Integer, ByVal Yy As Integer, ByVal Jx As Integer, ByVal Jy As Integer) As Integer '检查圆与矩形碰撞'Yx、Yy是小球在圆心;Jx,Jy是矩形在左上角在地图上在坐标Dim v As Integer = 0Dim r As Integer = QiuL(0).q_radius '小球的半径Dim yc As Point = New Point(Yx, Yy) '小球的圆心If Jx < 0 Or Jy < 0 Or Jx > mapMX Or Jy > mapMY Then '地图数组下标超范围,不碰撞v = 0ElseDim Jc1 As Point = New Point(Jx * W, Jy * H) '矩形左上角Dim Jc2 As Point = New Point(Jx * W + W, Jy * H) '矩形右上角Dim Jc3 As Point = New Point(Jx * W + W, Jy * H + H) '矩形右下角Dim Jc4 As Point = New Point(Jx * W + W, Jy * H + H) '矩形左下角If gameMap(Jx, Jy) > 0 Then '地图数组不为0If Yx - Jc1.X > 0 And Yx - Jc1.X < W And Yy - Jc1.Y > 0 And Yy - Jc1.Y < H Then '小球在矩形内部v = 9ElseIf Yx < Jc1.X And Yy < Jc1.Y And juliPP(yc, Jc1) <= r Thenv = 1 '碰左上角ElseIf Yx > Jc1.X + W And Yy < Jc1.Y And juliPP(yc, Jc2) <= r Thenv = 2 '碰右上角ElseIf Yx > Jc1.X + W And Yy > Jc1.Y + H And juliPP(yc, Jc3) <= r Thenv = 3 '碰右下角ElseIf Yx < Jc1.X And Yy > Jc1.Y + H And juliPP(yc, Jc4) <= r Thenv = 4 '碰左下角ElseIf Yx >= Jc1.X And Yx <= Jc1.X + W And Yy < Jc1.Y And Jc1.Y - Yy <= r Thenv = 5 '碰上边ElseIf Yx >= Jc1.X + W And Yy >= Jc1.Y And Yy <= Jc1.Y + H And Yx - Jc1.X - W <= r Thenv = 6 '碰右边ElseIf Yx >= Jc1.X And Yx <= Jc1.X + W And Yy >= Jc1.Y + H And Yy - Jc1.Y - H <= r Thenv = 7 '碰下边ElseIf Yx <= Jc1.X And Yy >= Jc1.Y And Yy <= Jc1.Y + H And Jc1.X - Yx <= r Thenv = 8 '碰左边End IfEnd IfElse '地图数组为0,表示没砖块,不碰撞v = 0End IfEnd IfReturn vEnd Function

接下来在窗体上添加Timer控件,不断检查碰撞情况。

接下来在窗体KeyDown过程中进行按键控制。

打砖块游戏基本设计完成了。

--------------------------------------

vb.net打砖块游戏相关推荐

  1. vb中可视对象的操作

    问题 : 在调试机房结账的部分,这两部分总是出问题,实时错误424. 错误解释: 未找到窗体(错误 424) 后来通过大量的查阅,找到了答案. MSHFlexGrid1是一个"控件" ...

  2. 机房收费系统【VB版】——前期准备

    前言: 没有源码和参考的机房收费系统,很犯怵的开始,完全不懂如何下手,经过后来小伙伴的交流和巨人的博客. 准备: 1.安装机房收费系统程序 1.1添加ODBC数据源--添加文件DSN--附加数据库-- ...

  3. 【VB】学生信息管理系统6——错误调试

    因为站在了巨人的肩膀上,在理解代码意思后的调试中,用到之前的别人的CSDN.所以原理查的不是很透彻.这里总结一下我的问题! 1.VB(如下代码)中mrc.EOF = False应该怎么理解呢? Set ...

  4. 【VB】学生信息管理系统5——数据库代码

    这次学生信息管理系统在代码的理解过程中遇到了一些问题.总结如下: 1. sql server的安装过程各个步骤的意思.在安装SQL Server的时候按照网上的步骤,我觉得这个需要学完整个数据库再返回 ...

  5. 【VB】学生信息管理系统4——数据库的发展

    由于连接数据的时候出现了很多不懂得问题,为什么要连接,它是怎么连接的,查着查着,就越看越多.又不舍得就这么放过这些问题,所以就耐心看看究竟是怎么回事! 1.自从出现数据库,人们渴望用数据和应用程序做交 ...

  6. 【VB】学生信息管理系统2——窗体设计

    这次学生系统是照着书敲的,先敲完然后开始调试!中途遇到了很多问题,查了很多,这里不容易系统的总结!所以就针对各个问题,各个击破! 问题一:VB 6.0中,状态栏控件(sbstatusbar):右击选项 ...

  7. 【VB】学生信息管理系统1——系统设计怎样开始?

    历时两周完成用VB完成的学生信息管理系统.从刚开始只会敲好玩的小程序到现在完整的做出一个像样的系统.自己的编程思维进行了很大的跨越. 这次的学生信息管理系统让我从整体的角度看到了一个系统设计的过程. ...

  8. vb matlab 比较,【笔记】VB.NET和MATLAB读取二进制文件(中文+数值)之比较

    搜索热词 Dim fs = New FileStream(str,FileMode.Open) Dim fr = New BinaryReader(fs) temp_byte = fr.ReadByt ...

  9. 机房收费系统(VB.NET)——超具体的报表制作过程

    之前做机房收费系统用的报表是Grid++Report,这次VB.NET重构中用到了VisualStudio自带的报表控件. 刚開始当然对这块功能非常不熟悉,只是探究了一段时间后还是把它做出来了. 以下 ...

  10. vb打开ftp服务器文件路径,VB上传指定文件到FTP指定目录。。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 目前用如下代码能够实现上传,但是不能上传到指定目录去..怎么改变? Option Explicit Private Const INTERNET_OPEN ...

最新文章

  1. HTTP协议处理流程
  2. php post请求跳转,学习猿地-php如何实现post跳转
  3. JAVA16版本.JDK16关于TCP和UDP的优化
  4. AJAX+JavaScript无刷新检查用户名
  5. golang反编译_【Golang】脱胎换骨的defer(一)
  6. 数字图像处理 采样定理_数字图像处理基础知识总结
  7. linux下配置Java和Go环境
  8. 微信悄悄更新:朋友圈不喜欢的评论可以删除了
  9. HTML如何消除别的块的影响,CSS清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?...
  10. c51单片机c语言交通灯的程序设计,基于51单片机的交通灯设计(三)-编写c51程序
  11. Echarts经纬度坐标实现地图定位
  12. 如何使用PTPX预估芯片功耗
  13. 第十周项目2——二叉树的便利的递归算法
  14. BUU MISC(5_10-5_14)
  15. 智慧安全3.0的融合之道
  16. VxWorks 引导程序(BIOS/BootLoader/Bootrom)
  17. Linux Signal信号详解
  18. java转义字符响铃_转义字符
  19. 328个计算机毕业设计题目
  20. 你知道哪些出身最奇特的程序员?

热门文章

  1. [JZOJ1320] 【Usaco2009 gold 】拯救奶牛
  2. 联网时显示已连接无法连接到服务器怎么办,路由器显示已连接不可上网怎么办?...
  3. 给学妹学弟们的看书小建议!
  4. aid learning安装应用_aidlearning下载-Aid Learning 安卓版v0.80-PC6安卓网
  5. python基础题-字符串列表训练
  6. 2010年度CSDN十大博客文章
  7. ANR问题分析实例 logcat anr trace
  8. arp: 查看,为主机添加一个arp 表项
  9. 抽象代数 04.03 Sylow 子群
  10. Nacos+openFeign 服务之间调用 出现错误:Load balancer does not contain an instance for the service 解决