| 
                                    
                                    
                                    
                                    
                                    
                                    
                                    
                                     
                                        
                                     
                                    
                                        
                                        - 博士后
 
                                        
                                        - 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
  
  复制代码   
                        
                     
                    
                    
                    
                    
                    
                    
                    
                    
                        
                        
                     
                     |