用arduino三个按键实现黑神话悟空劈棍的五连招状态机

14 2025-07-16 16:26

下面给出一种 3 个按键就能打出《黑神话:悟空》劈棍 5 段连招的 Arduino 实现思路:
整套逻辑用“状态机”描述,3 个按键分别代表
  • K1:轻击(左键)
  • K2:重击(右键)
  • K3:识破/取消(Shift)
5 段连招顺序就是官方推荐的 轻-轻-重-重-重
,只要按键节拍正确就逐段推进;任何时刻按 K3 都可立即回到 Ready 状态(相当于取消后摇或识破失败)。

1. 状态机 7 个状态

表格
 
复制
状态名 含义 下一跳条件
READY 待机 收到 K1 → L1
L1 第1段轻击 700 ms 内收到 K1 → L2;超时 → READY
L2 第2段轻击 700 ms 内收到 K2 → H3;超时 → READY
H3 第3段重击 700 ms 内收到 K2 → H4;超时 → READY
H4 第4段重击 700 ms 内收到 K2 → H5;超时 → READY
H5 第5段重击(终结) 自动回到 READY
CANCEL 通用取消 任意状态按 K3 → 立即 READY

2. Arduino 代码框架

cpp
 
复制
#include <Bounce2.h>

const uint8_t PIN_K1 = 2;   // 轻击
const uint8_t PIN_K2 = 3;   // 重击
const uint8_t PIN_K3 = 4;   // 识破/取消

Bounce btn1 = Bounce(), btn2 = Bounce(), btn3 = Bounce();

enum State { READY, L1, L2, H3, H4, H5 };
State state = READY;

uint32_t comboTimer = 0;
const uint32_t COMBO_TIMEOUT = 700;   // 连段时间窗口,可调

void setup() {
  Serial.begin(115200);
  pinMode(PIN_K1, INPUT_PULLUP);
  pinMode(PIN_K2, INPUT_PULLUP);
  pinMode(PIN_K3, INPUT_PULLUP);
  btn1.attach(PIN_K1); btn2.attach(PIN_K2); btn3.attach(PIN_K3);
  btn1.interval(5); btn2.interval(5); btn3.interval(5);
}

void sendCombo(uint8_t id) {
  Serial.print("Combo "); Serial.println(id);   // 可通过串口发到 PC/灯板/舵机
}

void loop() {
  btn1.update(); btn2.update(); btn3.update();

  if (btn3.fell()) {            // 随时取消
    state = READY;
    Serial.println("Cancel");
    return;
  }

  switch (state) {
    case READY:
      if (btn1.fell()) {
        state = L1;
        comboTimer = millis();
        sendCombo(1);
      }
      break;

    case L1:
      if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
      if (btn1.fell())         { state = L2; comboTimer = millis(); sendCombo(2); }
      break;

    case L2:
      if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
      if (btn2.fell())         { state = H3; comboTimer = millis(); sendCombo(3); }
      break;

    case H3:
      if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
      if (btn2.fell())         { state = H4; comboTimer = millis(); sendCombo(4); }
      break;

    case H4:
      if (millis() - comboTimer > COMBO_TIMEOUT) { state = READY; break; }
      if (btn2.fell())         { state = H5; sendCombo(5); }  // 终结技
      break;

    case H5:                    // 打完 5 段自动复位
      state = READY;
      break;
  }
}
 

3. 实物扩展建议

  • sendCombo(id) 换成点亮不同 LED、驱动继电器击打按键,或直接通过串口/USB HID 输出给 PC/PS5 手柄板。
  • 若想加入“识破”判定,可把 K3 的触发时间限制在 H3/H4 状态且正好在敌人攻击帧(需外接光电/声音传感器),实现真正的“破棍式”窗口
这样,仅用 3 个按键就能完整、流畅地打出黑神话劈棍 5 连招。

全部评论

·