⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.bas

📁 自己做的俄罗斯方块游戏,vb开发
💻 BAS
📖 第 1 页 / 共 2 页
字号:
Attribute VB_Name = "Module"
'方块程序主模块
'
'
'
Public Const MapY As Integer = 26   '定义地图数组y的最大值值
Public Const MapX As Integer = 15   '定义地图数组x的最大值值
Public Map(-3 To MapY, -1 To MapX + 1) As String  '定义地图数组(数组中用字符表示若干状态,如NULL,SIDE等)
Public Are(0 To 3, 3) As Integer                   '定义方块数组
Public Startfag As Boolean

Public Type GameInfo                   '定义游戏状态信息
GamePoint As Integer                   '游戏分数
GameSpeed As Integer                    '游戏速度
Gamefag As Integer                      '是否停止的标志
GameLevel As Integer                     '游戏等级
GameMusicFag As Boolean                  '背景音乐是否播放标志
GameSoundFag As Boolean                  '系统声音是否播放标志
End Type
Public GameInfo As GameInfo

Dim a As Integer

Public Type kuai                  '定义方块结构
x As Integer                       '定义方块数组在地图的位置x值
Y As Integer                       '定义方块数组在地图的位置y值
mode As Integer                    '定义方块的模型(如长条,方型,F型等)
state As Integer                   '定义方块的状态(4种状态)
Are(0 To 3, 3) As Integer          '定义方数组的实现
End Type

Dim fangnext As kuai                '定义下一个方块
Public fang1 As kuai                '定义整个程序中的方块实体

'定义api函数,该函数功能是播放wav音乐,用本函数播放本程序中系统音乐,具体用法请参考有关api书籍
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Const SND_ASYNC = &H1     '可于其他wav音乐同时播放互不影响
Const SND_SYNC = &H0      '


Function Sound(SND_FILENAME)            '系统音乐播放函数,SND_FILENAME为需播放音乐地址
If GameInfo.GameSoundFag = False Then
Exit Function                           '如果系统音乐开关为关那么调用此函数无用
End If
PlaySound App.Path & SND_FILENAME, 0, SND_ASYNC
End Function


Function res_start()                  '初始化地图数组,把地图数组的边框赋为side,中间为null,并按赋值输出图象
Main_F.Main_P.Cls                                       '清空main_p所有图象
For Y = 0 To MapY
    For x = -1 To MapX + 1
        Map(Y, x) = "Null"
        If x = 0 Or x = -1 Or Y = 0 Or x = MapX Or x = MapX + 1 Or Y = MapY Then     '边框判断
           Map(Y, x) = "Side"
           Main_F.Main_P.PaintPicture Main_F.Are(0).Picture, x * 20, Y * 20, 20, 20, 0, 0, 20, 20  '把main_f.are(0)图象拷贝到Main_P的相映位置。由x,y决定
        End If
        'Main_F.Main_P.PaintPicture Main_F.Are(0).Picture, x * 20, Y * 20, 20, 20, 0, 0, 20, 20
    Next x
Next Y
GameInfo.GamePoint = 0   '把游戏分数清零
End Function


Function lost()        '调用此函数(过程)判断是否输掉游戏,并作出相应处理
For x = 0 To MapX + 1
    If Map(1, x) <> "Null" And x > 1 And x < MapX Then    '当地图数组最上面一排非二边值不为NULL,则游戏输了
       Startfag = False
       Main_F.Timer.Enabled = False                       'timer停止
       Main_F.Game_Stop.Enabled = False                     '菜单中暂停选项不可用
    End If
Next x
If Startfag = False Then                           '播放lose系统声,并停止播放背景音乐
   Sound ".\sound\lost.wav"
   Main_F.BackMusic.mmStop
   msg = MsgBox("你输了,想再试试吗?", 36, "系统提示")
   If msg = vbYes Then
      Main_F.Game_New_Click                        '点击“是”按钮后触发Game_New_Click事件达到重新开始的目的
      Exit Function
   End If
res_start        '点击“否”后初始地图
End If


End Function

Function Game_speed()   '游戏速度函数,每次调用此函数判断游戏应有的速度,升级时也有次函数改变游戏速度
'由于只是测试游戏,所以只设了6各级别,每个级别达到200分升级,升级时分数清零,只有达到最高级时分数才有可能大于200
If GameInfo.GamePoint >= 2000 And GameInfo.GameLevel < 5 Then
   GameInfo.GamePoint = 0
   GameInfo.GameLevel = GameInfo.GameLevel + 1
   Main_F.Timer = False
   Startfag = False
   Main_F.Game_level_Num_Click (GameInfo.GameLevel) '触发Game_level_Num_Click事件改变菜单中级别
   Main_F.Timer = True
   Startfag = True
   Sound ".\sound\shenji.wav"
End If
Select Case GameInfo.GameLevel      '设定现在级别的速度
       Case 1
       GameInfo.GameSpeed = 500
       Case 2
       GameInfo.GameSpeed = 350
       Case 3
       GameInfo.GameSpeed = 200
       Case 4
       GameInfo.GameSpeed = 150
       Case 5
       GameInfo.GameSpeed = 80
End Select

End Function

Function Start()            '游戏开始,每次timer调用此函数。
Main_F.Main_P.Cls           '清空Main_P的图形
s = Judge("define", fang1)  '调用judge,参数define决定judge中处理方法,参数fang1是具体的方块结构
fang1.Y = fang1.Y + 1
s = Dis_are(fang1)          '显示方块
Load_map                    '显示地图
lost                        '调用lost函数,判断其是否“输”,并做相应处理。
End Function


Function Load_map()                                '地图处理函数
Dim num                                            '
Dim npoint                                         '
npoint = 1                                         'npoint多层消除时的所得分数的系数
For Y = 0 To MapY                                  '扫描地图数组,把值为side的位置用are(0)贴图,are用are(1)贴图
    num = 0
    For x = 0 To MapX + 1
        If Map(Y, x) = "Side" Then
           Main_F.Main_P.PaintPicture Main_F.Are(0).Picture, x * 20, Y * 20, 20, 20, 0, 0, 20, 20
        End If
        If Map(Y, x) = "Are" Then
           num = num + 1                           '统计数组每一行值为are的数量
           Main_F.Main_P.PaintPicture Main_F.Are(1).Picture, x * 20, Y * 20, 20, 20, 0, 0, 20, 20
        End If
    Next x
    
    If num = MapX - 1 And Y <> 0 And Y <> MapY Then       '当are数量为数组的行最大值减去2边的side的数量时,
    Main_F.Enabled = False                                '表示这一行每个元素为满,既应该消除这一行(下面2个for执行)。
    Sound ".\sound\broken.wav"                            '播放消除声音
    For i = Y To 1 Step -1
        For j = 1 To MapX - 1                             '把数组中消除(broken)那一行上面所有的行向下移动一行
            Map(i, j) = Map(i - 1, j)
            Map(1, j) = "Null"                            '把最上面一行清空(赋值成NULL)
        Next j
    Next i
    GameInfo.GamePoint = GameInfo.GamePoint + 100 * npoint      '统计消除得分并加到GamePoint中
    npoint = npoint + 0.5                                       '每次多消一行得分系数+50%
    Main_F.Enabled = True
  End If
Next Y
Main_F.Point_L.Caption = GameInfo.GamePoint                    '显示分数
End Function

Function Judge(char As String, fang As kuai) As String     '方快判断处理函数
Dim n
n = 0
For Y = 0 To 3                                       '用2个for循环扫描方快数组are
    For x = 0 To 3
        If fang.Are(Y, x) = 1 Then
           Select Case char                          'char是调用函数时的参数,主要用来区分在何种情况下调用此函数的
                  Case "down", "define"              '根据不同的char参数,judge作不同的处理
                                                     'down 为当按下↓时,define为一般情况(什么都不按,不做任何操作)。
                       
                       If Map(fang.Y + Y + 1, fang.x + x) <> "Null" Then   '当前方块are其中一个元素为1时,他在地图数组的相应位置的纵轴+1坐标不为空
                          Startfag = False                                 '既方块数组某一元素在地图上下方元素不为空(下面有东西,“side”或“are”)
                          Sound ".\sound\floor.wav"                        '播放floor声音,准备处理“石化”过程
                          Startfag = True
                           For i = 0 To 3                                  '石化过程
                               For j = 0 To 3                              '找出地图数组中相应的位置“石化”(这个位置由are数组每个元素的y加上fang.y,每个x+fang.x组成)
                                   If fang.Are(i, j) = 1 Then              '
                                      Map(fang.Y + i, fang.x + j) = "Are"  '“石化”
                                   End If
                               Next j
                           Next i
                       s = Next_are(fang)                                 '石化完了调用next_are,取得下一个方块的数组
                       s = zuobiao(fang)                                  '调用初始坐标函数,初始方块坐标
                       Exit Function
                       End If
                  Case "left"                                              '当按向左移动时,判断是否可向左移
                       If Map(fang.Y + Y, fang.x + x - 1) <> "Null" Then   '不能移动,函数返回error
                       Judge = "error"
                       End If
                  Case "right"                                             '同上(向右)
                       If Map(fang.Y + Y, fang.x + x + 1) <> "Null" Then
                       Judge = "error"
                       End If
                  Case "state"                                                  '当响应方块转变“形态”时,
                       If Map(fang.Y + Y, fang.x + x) <> "Null" And x = 0 Then  'are数组元素加fang.x,fang.y后是否与地图中相对位置的左边元素重合
                          fang.x = fang.x + 1                                   '重合则向右移一格
                          n = 1                            '统计are数组元素加fang.x,fang.y后和地图上非空元素重合的个数,既
                       End If
                       If Map(fang.Y + Y, fang.x + x) <> "Null" Then       'are数组元素加fang.x,fang.y后是否与地图中相对位置的右边()元素重合
                          fang.x = fang.x - 1                              '向左移
                       End If
           End Select
        End If
    Next x
    If m < n Then
    m = n

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -