- 按键认证大神
- 2699998
- 3587
- 11
- 2173 朵
- 7386 个
- 1021 个
- 91120
- 2014-08-23
|
1#
t
T
发表于 2022-09-04 09:29
|
|只看楼主
用按键精灵制作贪吃蛇小游戏,不用第三方插件,完全用按键自带命令实现:
基本思路: 1、用记事本来画游戏界面 2、设置游戏窗口信息 3、生成小蛇、投放食物 4、检测键盘操作,控制小蛇前进方向 5、碰撞检测,“咬蛇自尽”、“撞墙而死”
|
【游戏思路】
- 用记事本来画游戏界面
注:为了画面效果,需要将记事本的字体改为“宋体” |
- 设置游戏窗口信息
- Hwnd = Plugin.Window.Find("Notepad", "贪吃蛇 - by:神梦无痕")
- If Hwnd = 0 Then Hwnd = Plugin.Window.Find("Notepad", "无标题 - 记事本")
- If Hwnd = 0 Then
- RunApp "notepad.exe"
- Do
- Hwnd = Plugin.Window.Find("Notepad", "无标题 - 记事本")
- Delay 100
- Loop Until Hwnd > 0
- End If
- Call Plugin.Window.SetText(Hwnd, "贪吃蛇 - by:神梦无痕")
- Call Plugin.Window.Restore(Hwnd)
- Call Plugin.Window.Active(Hwnd)
- Call Plugin.Window.Size(Hwnd, 地图大小*16.7 + 30, 地图大小*16.7 + 160)
- HwndEdit = Plugin.Window.FindEx(Hwnd, 0, "Edit", "")
复制代码
- 生成小蛇、投放食物
- 检测键盘操作,控制小蛇前进方向
- 碰撞检测
【游戏完整代码】- '#================================================================
- '# 【游戏】贪吃蛇
- '#----------------------------------------------------------------
- '# 【作者】:神梦无痕
- '# 【QQ】:1042207232
- '# 【Q群】:624655641
- '# 【更新】:2022-09-04
- '#----------------------------------------------------------------
- '# 注意:为了画面效果,需要将记事本的字体改为“宋体”
- '#================================================================
- Dim 地图, 食物坐标, 贪吃蛇坐标, 运动方向, 运动速度
- Call 初始化界面(16)
- Call 贪吃蛇出生()
- Call 投放食物()
- Do
- // 检查键盘操作
- key = GetLastKey()
- Select Case key
- Case 38
- TracePrint "上"
- Call 贪吃蛇爬行(1)
- Case 40
- TracePrint "下"
- Call 贪吃蛇爬行(2)
- Case 37
- TracePrint "左"
- Call 贪吃蛇爬行(3)
- Case 39
- TracePrint "右"
- Call 贪吃蛇爬行(4)
- Case Else
- TracePrint "自动前行"
- Call 贪吃蛇爬行(0)
- End Select
- Delay 运动速度
- Loop
- //=======================================【功能函数】=======================================
- Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As string) As Long
- ' 初始化界面
- DimEnv 全局_窗口句柄
- Function 初始化界面(地图大小)
- Dim Hwnd, HwndEdit
-
- 食物坐标 = Array(0, 0)
- 贪吃蛇坐标 = Array("5,7", "5,6", "5,5")
- 运动方向 = 4
- 运动速度 = 1000
- Hwnd = Plugin.Window.Find("Notepad", "贪吃蛇 - by:神梦无痕")
- If Hwnd = 0 Then Hwnd = Plugin.Window.Find("Notepad", "无标题 - 记事本")
- If Hwnd = 0 Then
- RunApp "notepad.exe"
- Do
- Hwnd = Plugin.Window.Find("Notepad", "无标题 - 记事本")
- Delay 100
- Loop Until Hwnd > 0
- End If
- Call Plugin.Window.SetText(Hwnd, "贪吃蛇 - by:神梦无痕")
- Call Plugin.Window.Restore(Hwnd)
- Call Plugin.Window.Active(Hwnd)
- Call Plugin.Window.Size(Hwnd, 地图大小*16.7 + 30, 地图大小*16.7 + 160)
- HwndEdit = Plugin.Window.FindEx(Hwnd, 0, "Edit", "")
- 全局_窗口句柄 = HwndEdit
-
- ReDim 地图(地图大小)
- 地图(0) = String(地图大小, "■")
- For i = 1 To 地图大小 - 1
- 地图(i) = "■" & String(地图大小 - 2, " ") & "■"
- Next
- 地图(地图大小) = String(地图大小, "■")
-
- Call 绘制地图(HwndEdit)
- End Function
- ' 投放食物
- Function 投放食物()
- Assert Plugin.Window.IsWindow(全局_窗口句柄), "出错,游戏窗口句柄不存在!"
-
- Do
- 食物坐标 = 随机坐标()
- Loop Until Array_In(贪吃蛇坐标, Join(食物坐标, ",")) = False
- Call 设置地图(食物坐标(0), 食物坐标(1), "★")
- Call 绘制地图(全局_窗口句柄)
- End Function
- ' 贪吃蛇出生
- Function 贪吃蛇出生()
- Dim XY, i
- Assert Plugin.Window.IsWindow(全局_窗口句柄), "出错,游戏窗口句柄不存在!"
-
- XY = Split(贪吃蛇坐标(0), ",")
- Call 设置地图(Int(XY(0)), Int(XY(1)), "●")
- For i = 1 To UBound(贪吃蛇坐标)
- XY = Split(贪吃蛇坐标(i), ",")
- Call 设置地图(Int(XY(0)), Int(XY(1)), "■")
- Next
- Call 绘制地图(全局_窗口句柄)
- End Function
- ' 贪吃蛇爬行
- Function 贪吃蛇爬行(动作)
- Dim 蛇头坐标
-
- 蛇头坐标 = 获取蛇头坐标()
- If 动作 = 0 Then
- 动作 = 运动方向
- ElseIf 动作 = 1 And 运动方向 = 2 Then
- 动作 = 运动方向
- ElseIf 动作 = 2 And 运动方向 = 1 Then
- 动作 = 运动方向
- ElseIf 动作 = 3 And 运动方向 = 4 Then
- 动作 = 运动方向
- ElseIf 动作 = 4 And 运动方向 = 3 Then
- 动作 = 运动方向
- Else
- 运动方向 = 动作
- End If
- Select Case 动作
- Case 1'上
- 蛇头坐标(0) = Int(蛇头坐标(0)) - 1
- 蛇头坐标(1) = Int(蛇头坐标(1))
- Case 2'下
- 蛇头坐标(0) = Int(蛇头坐标(0)) + 1
- 蛇头坐标(1) = Int(蛇头坐标(1))
- Case 3'左
- 蛇头坐标(0) = Int(蛇头坐标(0))
- 蛇头坐标(1) = Int(蛇头坐标(1)) - 1
- Case 4'右
- 蛇头坐标(0) = Int(蛇头坐标(0))
- 蛇头坐标(1) = Int(蛇头坐标(1)) + 1
- End Select
- Call 贪吃蛇碰撞(蛇头坐标)
- Call 绘制地图(全局_窗口句柄)
- End Function
- ' 贪吃蛇碰撞
- Function 贪吃蛇碰撞(新坐标)
- Assert 新坐标(0) > 0 And 新坐标(0) < UBound(地图), "糟糕,贪吃蛇撞墙上了!"
- Assert 新坐标(1) > 0 And 新坐标(1) < UBound(地图), "糟糕,贪吃蛇撞墙上了!"
- Assert Array_Not_In(贪吃蛇坐标, Join(新坐标, ",")), "糟糕,贪吃蛇把自己吃了!"
-
- Call 设置地图(新坐标(0), 新坐标(1), "●")
- Dim XY: XY = 获取蛇头坐标()
- Call 设置地图(XY(0), XY(1), "■")
- If 食物坐标(0) = 新坐标(0) And 食物坐标(1) = 新坐标(1) Then
- ' 食物被吃了,蛇身变长
- 贪吃蛇坐标 = Array_Combine(Array(Join(新坐标, ",")), 贪吃蛇坐标)
- Call 投放食物()
- 运动速度 = 运动速度 - 10
- Else
- ' 删除蛇尾坐标
- Dim 蛇尾坐标
- 蛇尾坐标 = 获取蛇尾坐标()
- Call 设置地图(蛇尾坐标(0), 蛇尾坐标(1), " ")
- 贪吃蛇坐标 = Array_Combine(Array(Join(新坐标, ",")), 贪吃蛇坐标)
- Redim Preserve 贪吃蛇坐标(UBound(贪吃蛇坐标) - 1)
- End If
- TracePrint Join(贪吃蛇坐标, "|")
- End Function
- ' 获取蛇坐标
- Function 获取蛇坐标(Index)
- Dim XY
- Assert Index <= UBound(贪吃蛇坐标), "出错,贪吃蛇没有那么长!"
-
- If Index = -1 Then Index = UBound(贪吃蛇坐标)
- XY = Split(贪吃蛇坐标(Index), ",")
- XY(0) = Int(XY(0)) : XY(1) = Int(XY(1))
- 获取蛇坐标 = XY
- End Function
- ' 获取蛇头坐标
- Function 获取蛇头坐标()
- 获取蛇头坐标 = 获取蛇坐标(0)
- End Function
- ' 获取蛇尾坐标
- Function 获取蛇尾坐标()
- 获取蛇尾坐标 = 获取蛇坐标(-1)
- End Function
- ' 获取地图
- Function 获取地图(x, y)
- Assert x <= UBound(地图), "出错,坐标X在地图上越界!"
- Assert y + 1 <= Len(地图(x)), "出错,坐标X在地图上越界!"
-
- 获取地图 = Mid(地图(x), y+1, 1)
- End Function
- ' 设置地图
- Function 设置地图(x, y, value)
- Assert x <= UBound(地图), "出错,坐标X在地图上越界!"
- Assert y + 1 <= Len(地图(x)), "出错,坐标Y在地图上越界!"
-
- 地图(x) = Left(地图(x), y) & value & Right(地图(x), len(地图(x)) - y - 1)
- End Function
- ' 绘制地图
- Function 绘制地图(Hwnd)
- Dim map
- Dim WM_SETTEXT
-
- WM_SETTEXT = &HC
- map = Join(地图, vbCrLf)
- map = map & " ↑" & String(UBound(地图) - 5, " ") & vbCrLf
- map = map & "控制:←↓→" & vbCrLf
- map = map & "作者:神梦无痕" & vbCrLf
- Call SendMessage(Hwnd, WM_SETTEXT, 0, map)
- End Function
- ' 随机坐标
- Function 随机坐标()
- Dim x, y
- x = RandNum(1, UBound(地图) - 2)
- y = RandNum(1, UBound(地图) - 2)
- 随机坐标 = Array(x, y)
- End Function
- ' 绘制报错
- Function 绘制报错(ErrInfo)
- Dim h, l
- l = UBound(地图)
- h = UBound(地图) \ 2
- ErrInfo = ErrInfo & String(l - 3 - len(ErrInfo), " ")
- 地图(h - 1) = "■┎" & String(l - 4, "—") & "┒■"
- 地图(h) = "■ " & ErrInfo & "■"
- 地图(h + 1) = "■┖" & String(l - 4, "—") & "┚■"
- Call 绘制地图(全局_窗口句柄)
- End Function
- ' 断言报错
- Function Assert(expression, ErrInfo)
- If expression Then
- Else
- TracePrint ErrInfo
- Call 绘制报错(ErrInfo)
- ExitScript
- End If
- End Function
- '生成随机数
- Function RandNum(Min, Max)
- Randomize
- RandNum = Int(((Max - Min + 1) * Rnd) + Min)
- End Function
- ' 数组拼接
- Function Array_Combine(List, Arr)
- Dim i
- Result_Arr = Array()
- If IsArray(List) And IsArray(Arr) Then
- ReDim Result_Arr(UBound(List) + UBound(Arr) + 1)
- For i = 0 To UBound(List)
- Result_Arr(i) = List(i)
- Next
- For i = 0 To UBound(Arr)
- Result_Arr(i + UBound(List) + 1) = Arr(i)
- Next
- End If
- Array_Combine = Result_Arr
- End Function
- ' 数组切片
- Function Array_Slice(List, StartIndex, EndIndex)
- Dim i
- ReDim Result_Arr(EndIndex-StartIndex)
- If StartIndex >= LBound(List) And EndIndex <= UBound(List) Then
- For i = StartIndex To EndIndex
- Result_Arr(i-StartIndex) = List(i)
- Next
- End If
- Array_Slice = Result_Arr
- Result_Arr = Empty
- End Function
- ' 数组包含元素
- Function Array_In(List, Item)
- Array_In = CSng(InStr("|" & Join(List, "|") & "|", "|" & Item & "|") > 0)
- End Function
- ' 数组不包含元素
- Function Array_Not_In(List, Item)
- Array_Not_In = (Array_In(List, Item) = 0)
- End Function
复制代码
|