尝试捕获按键,而小组运行(蛇游戏)VBA

我是一个,但坚持一个我想要做的蛇游戏,似乎目前蛇的“头”(这是一个绿色的绿色“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 

…..

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

 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。

备注

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

当函数返回时,由lpKeyState参数指向的数组的每个成员都包含虚拟键的状态数据。 如果高位为1,则表示closures。 否则,它是起来的。 如果键是一个切换键,例如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函数,这些左侧​​和右侧区分常量才可用于应用程序。