|   《主窗体 FrmPlay 代码》—— Private blnStartGame As Boolean '标记是否已经开始 
          新游戏(T=游戏已经开始)Private blnPause As Boolean '标记当前是否处于暂停状态(T=暂停)
 Private blnThroughWall As Boolean '标记是否为穿墙模式(T=可以穿墙)
 Private blnOnKeyEvents As Boolean '标记是否能够 接收键盘事件(T=可以接收),此变量可防止 Form_KeyDown()事件重复执行
 Private Map_Width As Integer '地图宽度(象素)Private Map_Height As Integer '地图高度(象素)
 Private Map_Empty_Color '地图-空白地颜色
 Private Map_Bomb_Color '地图-炸弹颜色
 Private Map_Food_Color '地图-食物颜色
 Private MapProperty() As Integer '记录地图各个网格的属性
 Private curEatCount As Integer '记录 每次出现奖品之前,一共吃进多少物品(包括食物和炸弹,奖品不计),当奖品出现后,此变量值变为 
          零"0",然后进入下一次统计Private curLevel As Integer '当前级别
 Private P1 As thePlayerInfo '记录Player1 的信息
 Private Snake_P1() As thePosition '记录蛇身坐标Private PrizePos As thePosition '记录奖品的坐标
 Private Record(9) As theRecord '存放前十名的 
          得分记录信息 Option Explicit Private Sub cmdHelp_Click()If blnPause = False Then Call Form_KeyDown(KEY_PAUSE, 
          0) '如果游戏正在进行,则发送“暂停”按键事件,暂停游戏
 frmHelp.Show
 
 End Sub
 '开始新游戏Private Sub cmdNewGame_Click()
 Dim i As Integer
 
 Randomize '重新生成随机数列
 
 blnStartGame = Not blnStartGame
 If blnStartGame Then
 cmdNewGame.Caption = "停止"
 Else
 cmdNewGame.Caption = "新游戏"
 End If
 
 
 '中止游戏
 If blnStartGame = False Then
 '如果上一次的奖品还没有消失(以 PrizeRemain 
          > 0 为标志),就先清除旧的奖品,然后才显示新的奖品
 If PrizeRemain > 0 Then 
          Call ShowPrize(False)
         picDisplay.Cls
 P1.Score = 0 '玩家的初始分数
 P1.Food = 0
 P1.Bomb = 0
 curEatCount = 0
 PrizeRemain = 0
 blnPause = False
 lblPause.Visible = False
 lblScore.Caption = P1.Score
 lblFoodCount.Caption = P1.Food
 lblBombCount.Caption = P1.Bomb
 P1.blnGameOver = True
 HscrLevel.Enabled = True
 tmrMove.Enabled = False
 Exit Sub
 End If
 
 blnThroughWall = True '穿墙模式
 blnOnKeyEvents = True
 
 '暂时使用默认填充色
 Map_Bomb_Color = BOMB_COLOR
 Map_Empty_Color = EMPTY_COLOR
 Map_Food_Color = FOOD_COLOR
 P1.BodyColor = BODY_COLOR
 P1.HeadColor = HEAD_COLOR
 
 '地图初始化
 ReDim MapProperty(MAX_COL_INDEX, MAX_ROW_INDEX)
 Map_Width = (MAX_COL_INDEX + 1) * MAP_SCALE
 Map_Height = (MAX_ROW_INDEX + 1) * MAP_SCALE
 picDisplay.Cls
 picDisplay.Width = Map_Width + 2
 picDisplay.Height = Map_Height + 2
 picDisplay.Line (0, 0)-Step(Map_Width, Map_Height), 
          Map_Empty_Color, BF
 
 FoodCount_AtOneTime = 2 '地图上同时存在的 食物数量
 BombCount_AtOneTime = 1 '地图上同时存在的 炸弹数量
 
 EatCountPerShowPrize = 5 '设置 蛇每吃进多少物品(包括食物和炸弹,奖品不计)才显示一次奖品
 
 curLevel = HscrLevel.Value
 AddScorePerFood = curLevel '每吃进一个 食物,所增加的分数=当前的级别值
 AddScorePerBomb = -curLevel * 2 '每吃进一个 炸弹,所扣掉的分数
 
 P1.Score = Abs(AddScorePerBomb) + 1 '玩家的初始分数='每吃进一个 
          炸弹,所扣掉的分数+1
 P1.Food = 0
 P1.Bomb = 0
 PrizeRemain = 0
 P1.blnGameOver = False
 lblScore.Caption = P1.Score
 lblFoodCount.Caption = P1.Food
 lblBombCount.Caption = P1.Bomb
 
 '初始化P1蛇身
 ReDim Snake_P1(START_SNAKE_LENGTH)
 For i = 0 To UBound(Snake_P1)
 '设定蛇身各段的起始位置
 Snake_P1(i).X = MAX_COL_INDEX 
          - UBound(Snake_P1) + i
 Snake_P1(i).Y = MAX_ROW_INDEX
 '初始化移动方向
 P1.X_Way = -1
 P1.Y_Way = 0
 MapProperty(Snake_P1(i).X, 
          Snake_P1(i).Y) = MAP_SNAKE
 picDisplay.Line (Snake_P1(i).X 
          * MAP_SCALE, Snake_P1(i).Y * MAP_SCALE)-Step(MAP_SCALE, MAP_SCALE), 
          BODY_COLOR, BF
 Next
 '使用蛇头颜色 重新绘画蛇头
 picDisplay.Line (Snake_P1(0).X * MAP_SCALE, Snake_P1(0).Y 
          * MAP_SCALE)-Step(MAP_SCALE, MAP_SCALE), HEAD_COLOR, BF
 
 
 '放置食物
 For i = 1 To FoodCount_AtOneTime
 Call AddFood
 Next
 
 '放置炸弹
 For i = 1 To BombCount_AtOneTime
 Call AddBomb
 Next
 
 lblPause.Visible = False
 lblScore.Caption = P1.Score
 lblFoodCount.Caption = P1.Food
 lblBombCount.Caption = P1.Bomb
 
 P1.blnGameOver = False
 HscrLevel.Enabled = False '游戏进行期间不能改变级别
 tmrMove.Enabled = True
 End Sub
 '显示得分榜Private Sub cmdShowScoreList_Click()
 If blnPause = False Then Call Form_KeyDown(KEY_PAUSE, 
          0) '如果游戏正在进行,则发送“暂停”按键事件,暂停游戏
 frmScoreList.Show
 
 End Sub
 Private Sub Form_KeyDown(KeyCode As Integer, Shift 
          As Integer)
 If P1.blnGameOver Or blnStartGame = False Or blnOnKeyEvents 
          = False Then Exit Sub '以下情况(游戏结束、游戏还没有开始、禁用击键事件)不接收按键操作。
 
 '按“Numpad 5”键--暂停/继续
 If KeyCode = KEY_PAUSE Then
 blnPause = Not blnPause
 lblPause.Visible = blnPause
 tmrMove.Enabled = Not blnPause
 Exit Sub
 End If
 
 If blnPause Then Exit Sub '在暂停状态下不接受“ESC”外的其它按键
 
 Select Case KeyCode
 Case KEY_LFUP
 blnOnKeyEvents 
          = False
 If 
          P1.X_Way <> 0 Then
 P1.X_Way = 0
 P1.Y_Way = -1
 ElseIf 
          P1.Y_Way <> 0 Then
 P1.X_Way = -1
 P1.Y_Way = 0
 End 
          If
 Case KEY_LFDN
 blnOnKeyEvents 
          = False
 If 
          P1.X_Way <> 0 Then
 P1.X_Way = 0
 P1.Y_Way = 1
 ElseIf 
          P1.Y_Way <> 0 Then
 P1.X_Way = -1
 P1.Y_Way = 0
 End 
          If
 
 Case KEY_RTUP
 blnOnKeyEvents 
          = False
 If 
          P1.X_Way <> 0 Then
 P1.X_Way = 0
 P1.Y_Way = -1
 ElseIf 
          P1.Y_Way <> 0 Then
 P1.X_Way = 1
 P1.Y_Way = 0
 End 
          If
 Case KEY_RTDN
 blnOnKeyEvents 
          = False
 If 
          P1.X_Way <> 0 Then
 P1.X_Way = 0
 P1.Y_Way = 1
 ElseIf 
          P1.Y_Way <> 0 Then
 P1.X_Way = 1
 P1.Y_Way = 0
 End 
          If
 
 '当蛇以 水平 方向移动时,LF 和 RT 按键无效
 Case KEY_LF
 blnOnKeyEvents 
          = False
 If 
          P1.X_Way = 0 Then
 P1.X_Way = -1
 P1.Y_Way = 0
 End 
          If
 Case KEY_RT
 blnOnKeyEvents 
          = False
 If 
          P1.X_Way = 0 Then
 P1.X_Way = 1
 P1.Y_Way = 0
 End 
          If
 
 '当蛇以 垂直 方向移动时,UP 和 DN 按键无效
 Case KEY_UP
 blnOnKeyEvents 
          = False
 If 
          P1.Y_Way = 0 Then
 P1.X_Way = 0
 P1.Y_Way = -1
 End 
          If
 Case KEY_DN
 blnOnKeyEvents 
          = False
 If 
          P1.Y_Way = 0 Then
 P1.X_Way = 0
 P1.Y_Way = 1
 End 
          If
 
 Case Else
 Exit 
          Sub
 End Select
 
 tmrMove.Enabled = False '暂停Timer事件,等到本次移动操作全部完成后(即sub 
          RefreshSnake(...)过程执行完毕),再启动Timer
 
 Call PlayerMove
 
 End Sub
 
 |