11
社区成员




作者:神梦科技
用按键精灵制作贪吃蛇小游戏,不用第三方插件,完全用按键自带命令实现:
基本思路:
1、用记事本来画游戏界面
2、设置游戏窗口信息
3、生成小蛇、投放食物
4、检测键盘操作,控制小蛇前进方向
5、碰撞检测,“咬蛇自尽”、“撞墙而死”
【游戏思路】
1、用记事本来画游戏界面
注:为了画面效果,需要将记事本的字体改为“宋体”
2、设置游戏窗口信息
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", "")
3、生成小蛇、投放食物
4、检测键盘操作,控制小蛇前进方向
5、碰撞检测
【游戏完整代码】
'# 【游戏】贪吃蛇
'#----------------------------------------------------------------
'# 【作者】:神梦无痕
'# 【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