【游戏】用按键精灵制作贪吃蛇小游戏

按键精灵小Q
按键精灵官方账号
2022-09-15 14:51:40

作者:神梦科技

 

用按键精灵制作贪吃蛇小游戏,不用第三方插件,完全用按键自带命令实现:

 

基本思路:

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

原文地址:http://bbs.anjian.com/showtopic-701961-1.aspx

...全文
518 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

11

社区成员

发帖
与我相关
我的任务
社区描述
按键精灵交流阵地
其他 企业社区
社区管理员
  • 按键精灵小Q
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧