共有回帖数 1 个
-

《主窗体 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 ExplicitPrivate 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 '穿墙模式
blnO
nKeyEvents = 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
楼主 2016-07-15 09:31 回复
-
; 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 SubPrivate 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 '在暂停状态下不接受&ldqu
o;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
&nbs
p; 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
&n
bsp;
tmrMove.Enabled = False '暂停Timer事件,等到本次移动操作全部完成后(即sub RefreshSnake(...)过程执行完毕),再启动Timer
Call PlayerMove
End Sub
1楼 2016-07-15 09:32 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知