gpt4 book ai didi

excel - 尝试在子运行时捕获按键(对于蛇游戏)VBA

转载 作者:行者123 更新时间:2023-12-04 21:38:57 24 4
gpt4 key购买 nike

我是一个但坚持我正在尝试制作的蛇游戏,似乎目前蛇的“头部”(这是一个带有绿色“x”的绿色单元格)将完美且连续地移动直到游戏结束时,我想在棋盘上停下来。但它在移动时不会拾取任何其他按键。

有没有办法另一个按键可以中断任何其他正在运行的潜艇。

我真的很感谢你们的任何帮助,或者可能是另一种方式。

    Option Explicit
Public speed As Integer
Dim r As Integer
Dim c As Integer
Dim moves As Boolean
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

...
Public Sub start()
Application.ScreenUpdating = False
Application.OnKey "{LEFT}", "k_left"
Application.OnKey "{UP}", "k_up"
Application.OnKey "{DOWN}", "k_down"
Application.OnKey "{RIGHT}", "k_right"
Application.ScreenUpdating = True
End Sub

……
Function go_Speed(x As Integer)
speed = 300 / x
End Function

……
Sub movecheck()
Do While moves = True
Call k_move(r, c)
Loop

End Sub

……
Function k_move(rows As Integer, columns As Integer)

DoEvents
Sleep (speed)
Dim a As Range
For Each a In Range("E4:ak37")
If a.Value = "x" Then
If a.Offset(rows, columns).Interior.Color <> RGB(255, 255, 255) Then
'''crash check call goes here
moves = False
Exit Function
Else
a.Interior.Color = RGB(255, 255, 255)
a.Offset(rows, columns).Interior.Color = RGB(78, 238, 148)
a.Offset(rows, columns).Font.Color = RGB(78, 238, 148)
a.Offset(rows, columns) = a.Value
a.Cells.Clear
a.Cells.BorderAround 1
movecheck
End If
End If
Next a
End Function

……
Sub k_left()
moves = False
r = 0
c = -1
moves = True
Call movecheck
End Sub

……
Sub k_up()
moves = False
r = -1
c = 0
moves = True
Call movecheck
End Sub

……
Sub k_down()
moves = False
r = 1
c = 0
moves = True
Call movecheck
End Sub

......
Sub k_right()
moves = False
r = 0
c = 1
moves = True
Call movecheck
End Sub

......

最佳答案

您可以在每一步之前轮询您的 sub 中的键盘。然后做一个

Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Byte) As Long

dim keybrdbuff(255) as byte

For x = 0 to 255
If 0<>keybrdbuff(x) then Exit Sub
Next

GetKeyboardState 函数

GetKeyboardState 函数将 256 个虚拟键的状态复制到指定的缓冲区。

句法
BOOL GetKeyboardState(PBYTE lpKeyState);

参数

lpKeyState
[in] 指向接收每个虚拟键状态数据的 256 字节数组的指针。
返回值

如果函数成功,则返回值非零。

如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。

评论

应用程序可以调用此函数来检索所有虚拟键的当前状态。当线程从其消息队列中删除键盘消息时,状态会发生变化。状态不会随着键盘消息被发布到线程的消息队列而改变,也不会随着键盘消息被发布到其他线程的消息队列或从其他线程的消息队列中检索而改变。 (异常(exception):通过 AttachThreadInput 连接的线程共享相同的键盘状态。)

当函数返回时,lpKeyState 参数指向的数组的每个成员都包含虚拟键的状态数据。如果高位为1,则key为down;否则,它就起来了。如果键是切换键,例如 CAPS LOCK,则低位在键被切换时为 1,如果键未切换,则低位为 0。低位对非切换键没有意义。据说切换键在打开时会被切换。切换键时键盘上的切换键指示灯(如果有)将在切换键时亮起,在键未切换时将熄灭。

要检索单个键的状态信息,请使用 GetKeyState 函数。无论是否已从消息队列中检索到相应的键盘消息,要检索单个键的当前状态,请使用 GetAsyncKeyState 函数。

应用程序可以使用虚拟键代码常量 VK_SHIFT、VK_CONTROL 和 VK_MENU 作为 lpKeyState 指向的数组的索引。这给出了 SHIFT、CTRL 或 ALT 键的状态,而不区分左右。应用程序还可以使用以下虚拟键代码常量作为索引来区分这些键的左右实例:
VK_LSHIFT 
VK_RSHIFT
VK_LCONTROL
VK_RCONTROL
VK_LMENU
VK_RMENU

应用程序只能通过 GetKeyboardState、SetKeyboardState、GetAsyncKeyState、GetKeyState 和 MapVirtualKey 函数使用这些左右区分常量。

关于excel - 尝试在子运行时捕获按键(对于蛇游戏)VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com