vb.net实现简单的俄罗斯方块小游戏 您所在的位置:网站首页 简单的方块 vb.net实现简单的俄罗斯方块小游戏

vb.net实现简单的俄罗斯方块小游戏

2024-07-03 11:23| 来源: 网络整理| 查看: 265

    博主大二,最近刚完成vb.net的期末大作业,做的是一个简单的俄罗斯方块小游戏,运行效果如下:

(本来是画了网格线的,但是闪的厉害,双缓冲也没用,最后干脆就删了)

以下是源代码:

Public Class Form1 Dim curCube As FatherCube '当前方块 Dim nextCube As FatherCube '下一个方块 Dim time As Integer = 1000 '时间间隔 Dim map(11, 16) As Integer '网格 Dim g As Graphics 'panel1画布 Dim g2 As Graphics 'panel2画布 Dim myPen As New Pen(Color.Black, 0.5F) Dim myBrush As New SolidBrush(Color.Yellow) Dim s As New Size(30, 30) Dim myScore As Integer = 0 Dim myClear As Integer = 0 Dim myLevel As Integer = 1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Left = 500 Me.Top = 50 Me.DoubleBuffered = True Me.KeyPreview = True Timer1.Enabled = True Call Init() End Sub Private Sub Init() Call RaiseCube() Call RaiseNextCube() g = Me.Panel1.CreateGraphics g2 = Me.Panel2.CreateGraphics TextBox1.Text = Str(myScore) TextBox2.Text = Str(myClear) TextBox3.Text = Str(myLevel) End Sub '初始化 Private Sub RaiseCube() Dim Temps() As FatherCube = {New Cube_I, New Cube_J, New Cube_L, New Cube_O, New Cube_S, New Cube_T, New Cube_Z} Randomize() Dim n As Integer = Int(Rnd() * 7) curCube = Temps(n) curCube.Reset() curCube.Setmap(map) End Sub '随机创建一个方块 Private Sub RaiseNextCube() Dim Temps() As FatherCube = {New Cube_I, New Cube_J, New Cube_L, New Cube_O, New Cube_S, New Cube_T, New Cube_Z} Randomize() Dim n As Integer = Int(Rnd() * 7) nextCube = Temps(n) nextCube.Reset() End Sub '创建下一个方块 Private Sub PaintCube() For i = 0 To 3 Dim x As Integer = curCube.小方块(i).左坐标 Dim y As Integer = curCube.小方块(i).上坐标 Dim pt As New Point(x * 30, y * 30) Dim rec As New Rectangle(pt, s) g.FillRectangle(myBrush, rec) Next End Sub '将方块涂上颜色 Private Sub PaintNextCube() For i = 0 To 3 Dim x As Integer = nextCube.小方块(i).左坐标 - 3 Dim y As Integer = nextCube.小方块(i).上坐标 + 1 Dim pt As New Point(x * 30, y * 30) Dim rec As New Rectangle(pt, s) g2.FillRectangle(myBrush, rec) Next End Sub '给下一个方块涂色 Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint g.Clear(Color.Cyan) g2.Clear(Color.Cyan) Call PaintCube() Call PaintNextCube() 'For i = 0 To 12 ' g.DrawLine(myPen, i * 30, 0, i * 30, 18 * 30) 'Next 'For i = 0 To 16 ' g.DrawLine(myPen, 0, i * 30, 12 * 30, i * 30) 'Next '画网格线,不过闪烁比较厉害 For i = 0 To 11 For j = 0 To 16 If map(i, j) = 1 Then g.FillRectangle(myBrush, i * 30, j * 30, 30, 30) End If Next '重绘前面落下固定的方块 Next End Sub '在此处实现所有涂色的代码 Private Sub ClearCube() Dim curScore As Integer = 0 '本次得分 Dim clearRow As Integer = 0 '本次消行 Dim Occupy(16) As Integer For i = 0 To 16 Occupy(i) = 0 Next For j = 0 To 16 For i = 0 To 11 If map(i, j) = 1 Then Occupy(j) = Occupy(j) + 1 End If Next Next '计算每行已有格子总数 For i = 16 To 0 Step -1 If Occupy(i) = 12 Then clearRow = clearRow + 1 For j = i To 1 Step -1 For k = 0 To 11 map(k, j) = map(k, j - 1) '上面的放格下落 Next Next 'i = i + 1 '再检查一遍当前行 End If '行满则消 Next For i = 0 To 11 map(i, 0) = 0 Next curScore = clearRow * clearRow * 10 myScore = myScore + curScore myClear = myClear + clearRow myLevel = Int(myScore / 1000) + 1 TextBox1.Text = Str(myScore) TextBox2.Text = Str(myClear) TextBox3.Text = Str(myLevel) time = time * (11 - myLevel) / 10 End Sub '消除满行,更新数据 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Timer1.Interval = time If curCube.canMoveDown() Then curCube.moveDown() Call Form1_Paint(sender, New PaintEventArgs(g, New Rectangle)) Else Dim flag As Boolean = 1 For i = 0 To 3 Dim n As Integer = curCube.小方块(i).上坐标 If n 11 Or j < 0 Or j > 16) Then Return False ElseIf Me.地图(i, j) = 1 Then Return False End If Next Next Return True End Function End Class 'I型 Class Cube_O Inherits FatherCube Public Overrides Sub Reset() Me.状态() = 0 Me.小方块(0).左坐标 = 4 Me.小方块(0).上坐标 = 0 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 0 Me.小方块(2).左坐标 = 4 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 5 Me.小方块(3).上坐标 = 1 End Sub Public Overrides Function canTurn() As Boolean Return False End Function End Class 'O型 Class Cube_S Inherits FatherCube Public Overrides Sub Reset() Me.状态() = Int(Rnd() * 2) If Me.状态 = 0 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 0 Me.小方块(1).左坐标 = 6 Me.小方块(1).上坐标 = 0 Me.小方块(2).左坐标 = 4 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 5 Me.小方块(3).上坐标 = 1 Else Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 0 Me.小方块(2).左坐标 = 6 Me.小方块(2).上坐标 = 2 Me.小方块(3).左坐标 = 6 Me.小方块(3).上坐标 = 1 End If End Sub Public Overrides Sub Turn() If Me.状态() = 0 Then Dim m As Integer = Me.小方块(0).左坐标 Dim n As Integer = Me.小方块(0).上坐标 Me.小方块(1).左坐标 = m Me.小方块(1).上坐标 = n - 1 Me.小方块(2).左坐标 = m + 1 Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m + 1 Me.小方块(3).上坐标 = n Me.状态() = 1 Else Dim m As Integer = Me.小方块(0).左坐标 Dim n As Integer = Me.小方块(0).上坐标 Me.小方块(1).左坐标 = m + 1 Me.小方块(1).上坐标 = n Me.小方块(2).左坐标 = m - 1 Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m Me.小方块(3).上坐标 = n + 1 Me.状态() = 0 End If End Sub Public Overrides Function canTurn() As Boolean Dim m As Integer = Me.小方块(0).左坐标 - 1 Dim n As Integer = Me.小方块(0).上坐标 - 1 For i = m To m + 2 For j = n To n + 3 If (i < 0 Or i > 11 Or j < 0 Or j > 16) Then Return False ElseIf Me.地图(i, j) = 1 Then Return False End If Next Next Return True End Function End Class 'S型 Class Cube_Z Inherits FatherCube Public Overrides Sub Reset() Me.状态() = Int(Rnd() * 2) If Me.状态 = 0 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 0 Me.小方块(1).左坐标 = 4 Me.小方块(1).上坐标 = 0 Me.小方块(2).左坐标 = 6 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 5 Me.小方块(3).上坐标 = 1 Else Me.小方块(0).左坐标 = 6 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 6 Me.小方块(1).上坐标 = 0 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 2 Me.小方块(3).左坐标 = 5 Me.小方块(3).上坐标 = 1 End If End Sub Public Overrides Sub Turn() If Me.状态() = 0 Then Dim m As Integer = Me.小方块(0).左坐标 Dim n As Integer = Me.小方块(0).上坐标 Me.小方块(1).左坐标 = m Me.小方块(1).上坐标 = n - 1 Me.小方块(2).左坐标 = m - 1 Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m - 1 Me.小方块(3).上坐标 = n Me.状态() = 1 Else Dim m As Integer = Me.小方块(0).左坐标 Dim n As Integer = Me.小方块(0).上坐标 Me.小方块(1).左坐标 = m - 1 Me.小方块(1).上坐标 = n Me.小方块(2).左坐标 = m + 1 Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m Me.小方块(3).上坐标 = n + 1 Me.状态() = 0 End If End Sub Public Overrides Function canTurn() As Boolean Dim m As Integer = Me.小方块(1).左坐标 - 1 Dim n As Integer = Me.小方块(1).上坐标 - 1 For i = m To m + 2 For j = n To n + 3 If (i < 0 Or i > 11 Or j < 0 Or j > 16) Then Return False ElseIf Me.地图(i, j) = 1 Then Return False End If Next Next Return True End Function End Class 'Z型 Class Cube_L Inherits FatherCube Public Overrides Sub Reset() Me.状态() = Int(Rnd() * 4) If Me.状态 = 0 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 0 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 2 Me.小方块(3).左坐标 = 6 Me.小方块(3).上坐标 = 2 ElseIf Me.状态() = 1 Then Me.小方块(0).左坐标 = 4 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 6 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 6 Me.小方块(3).上坐标 = 0 ElseIf Me.状态() = 2 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 2 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 0 Me.小方块(3).左坐标 = 4 Me.小方块(3).上坐标 = 0 ElseIf Me.状态() = 3 Then Me.小方块(0).左坐标 = 6 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 4 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 4 Me.小方块(3).上坐标 = 2 End If End Sub Public Overrides Sub Turn() Dim m As Integer = Me.小方块(1).左坐标 Dim n As Integer = Me.小方块(1).上坐标 If Me.状态() = 0 Then Me.小方块(0).左坐标 = m - 1 Me.小方块(0).上坐标 = n Me.小方块(2).左坐标 = m + 1 Me.小方块(2).上坐标 = n Me.小方块(3).左坐标 = m + 1 Me.小方块(3).上坐标 = n - 1 Me.状态() = 1 ElseIf Me.状态() = 1 Then Me.小方块(0).左坐标 = m Me.小方块(0).上坐标 = n + 1 Me.小方块(2).左坐标 = m Me.小方块(2).上坐标 = n - 1 Me.小方块(3).左坐标 = m - 1 Me.小方块(3).上坐标 = n - 1 Me.状态() = 2 ElseIf Me.状态() = 2 Then Me.小方块(0).左坐标 = m + 1 Me.小方块(0).上坐标 = n Me.小方块(2).左坐标 = m - 1 Me.小方块(2).上坐标 = n Me.小方块(3).左坐标 = m - 1 Me.小方块(3).上坐标 = n + 1 Me.状态() = 3 ElseIf Me.状态() = 3 Then Me.小方块(0).左坐标 = m Me.小方块(0).上坐标 = n - 1 Me.小方块(2).左坐标 = m Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m + 1 Me.小方块(3).上坐标 = n + 1 Me.状态() = 0 End If End Sub Public Overrides Function canTurn() As Boolean Dim m As Integer = Me.小方块(1).左坐标 - 1 Dim n As Integer = Me.小方块(1).上坐标 - 1 For i = m To m + 2 For j = n To n + 2 If (i < 0 Or i > 11 Or j < 0 Or j > 16) Then Return False ElseIf Me.地图(i, j) = 1 Then Return False End If Next Next Return True End Function End Class 'L型 Class Cube_J Inherits FatherCube Public Overrides Sub Reset() Me.状态() = Int(Rnd() * 4) If Me.状态 = 0 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 0 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 2 Me.小方块(3).左坐标 = 4 Me.小方块(3).上坐标 = 2 ElseIf Me.状态() = 1 Then Me.小方块(0).左坐标 = 4 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 6 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 6 Me.小方块(3).上坐标 = 2 ElseIf Me.状态() = 2 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 2 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 0 Me.小方块(3).左坐标 = 6 Me.小方块(3).上坐标 = 0 ElseIf Me.状态() = 3 Then Me.小方块(0).左坐标 = 6 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 4 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 4 Me.小方块(3).上坐标 = 0 End If End Sub Public Overrides Sub Turn() Dim m As Integer = Me.小方块(1).左坐标 Dim n As Integer = Me.小方块(1).上坐标 If Me.状态() = 0 Then Me.小方块(0).左坐标 = m - 1 Me.小方块(0).上坐标 = n Me.小方块(2).左坐标 = m + 1 Me.小方块(2).上坐标 = n Me.小方块(3).左坐标 = m + 1 Me.小方块(3).上坐标 = n + 1 Me.状态() = 1 ElseIf Me.状态() = 1 Then Me.小方块(0).左坐标 = m Me.小方块(0).上坐标 = n + 1 Me.小方块(2).左坐标 = m Me.小方块(2).上坐标 = n - 1 Me.小方块(3).左坐标 = m + 1 Me.小方块(3).上坐标 = n - 1 Me.状态() = 2 ElseIf Me.状态() = 2 Then Me.小方块(0).左坐标 = m + 1 Me.小方块(0).上坐标 = n Me.小方块(2).左坐标 = m - 1 Me.小方块(2).上坐标 = n Me.小方块(3).左坐标 = m - 1 Me.小方块(3).上坐标 = n - 1 Me.状态() = 3 ElseIf Me.状态() = 3 Then Me.小方块(0).左坐标 = m Me.小方块(0).上坐标 = n - 1 Me.小方块(2).左坐标 = m Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m - 1 Me.小方块(3).上坐标 = n + 1 Me.状态() = 0 End If End Sub Public Overrides Function canTurn() As Boolean Dim m As Integer = Me.小方块(1).左坐标 - 1 Dim n As Integer = Me.小方块(1).上坐标 - 1 For i = m To m + 2 For j = n To n + 2 If (i < 0 Or i > 11 Or j < 0 Or j > 16) Then Return False ElseIf Me.地图(i, j) = 1 Then Return False End If Next Next Return True End Function End Class 'J型 Class Cube_T Inherits FatherCube Public Overrides Sub Reset() Me.状态() = Int(Rnd() * 4) If Me.状态 = 0 Then Me.小方块(0).左坐标 = 4 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 6 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 5 Me.小方块(3).上坐标 = 0 ElseIf Me.状态() = 1 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 2 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 0 Me.小方块(3).左坐标 = 4 Me.小方块(3).上坐标 = 1 ElseIf Me.状态() = 2 Then Me.小方块(0).左坐标 = 6 Me.小方块(0).上坐标 = 1 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 4 Me.小方块(2).上坐标 = 1 Me.小方块(3).左坐标 = 5 Me.小方块(3).上坐标 = 2 ElseIf Me.状态() = 3 Then Me.小方块(0).左坐标 = 5 Me.小方块(0).上坐标 = 0 Me.小方块(1).左坐标 = 5 Me.小方块(1).上坐标 = 1 Me.小方块(2).左坐标 = 5 Me.小方块(2).上坐标 = 2 Me.小方块(3).左坐标 = 6 Me.小方块(3).上坐标 = 1 End If End Sub Public Overrides Sub Turn() Dim m As Integer = Me.小方块(1).左坐标 Dim n As Integer = Me.小方块(1).上坐标 If Me.状态() = 0 Then Me.小方块(0).左坐标 = m Me.小方块(0).上坐标 = n + 1 Me.小方块(2).左坐标 = m Me.小方块(2).上坐标 = n - 1 Me.小方块(3).左坐标 = m - 1 Me.小方块(3).上坐标 = n Me.状态() = 1 ElseIf Me.状态() = 1 Then Me.小方块(0).左坐标 = m + 1 Me.小方块(0).上坐标 = n Me.小方块(2).左坐标 = m - 1 Me.小方块(2).上坐标 = n Me.小方块(3).左坐标 = m Me.小方块(3).上坐标 = n + 1 Me.状态() = 2 ElseIf Me.状态() = 2 Then Me.小方块(0).左坐标 = m Me.小方块(0).上坐标 = n - 1 Me.小方块(2).左坐标 = m Me.小方块(2).上坐标 = n + 1 Me.小方块(3).左坐标 = m + 1 Me.小方块(3).上坐标 = n Me.状态() = 3 ElseIf Me.状态() = 3 Then Me.小方块(0).左坐标 = m - 1 Me.小方块(0).上坐标 = n Me.小方块(2).左坐标 = m + 1 Me.小方块(2).上坐标 = n Me.小方块(3).左坐标 = m Me.小方块(3).上坐标 = n - 1 Me.状态() = 0 End If End Sub Public Overrides Function canTurn() As Boolean Dim m As Integer = Me.小方块(1).左坐标 - 1 Dim n As Integer = Me.小方块(1).上坐标 - 1 For i = m To m + 2 For j = n To n + 2 If (i < 0 Or i > 11 Or j < 0 Or j > 16) Then Return False ElseIf Me.地图(i, j) = 1 Then Return False End If Next Next Return True End Function End Class 'T型

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有