打开项目 → 工具 → 编译选项 → 切换到 “连接器” 标签页 → 在 “连接器命令行” 输入框中:-static-libgcc -lwinmm

#include <iostream>
#include <Windows.h>
#pragma comment(lib,"winmm.lib")
using namespace std;
enum Scale
{
    Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
    D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
    E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
    F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
    F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
    G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
    G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
    A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
    A0s = 22, A0 = 21
};
enum Voice
{
    X1 = C2, X2 = D2, X3 = E2, X4 = F2, X5 = G2, X6 = A2, X7 = B2,
    L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,
    M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,
    H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,
    LOW_SPEED = 500, MIDDLE_SPEED = 400, HIGH_SPEED = 300,
    _ = 0XFF
};
void Wind()
{
    HMIDIOUT handle;
    midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
    int volume = 0x7f;
    int voice = 0x0;
    int sleep = 350;
    int wind[] =
    {
         400,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,
         0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
         0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
         M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
         M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
         M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
         0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
         M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
         M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
         H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
         H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
         H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
         0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,
         0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
         0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
         M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
         M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
         M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
         0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
         M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
         M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
         H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
         H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
         H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
         H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
         H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
         H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
         H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
         H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
         H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
         0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,_,_,_,_,_,
    };

    int len = sizeof(wind) / sizeof(wind[0]);
    for (int i = 0; i < len; i++) {
        int val = wind[i];
        if (val == 0) { sleep = 175; continue; }
        if (val == 700) { Sleep(175); continue; }
        if (val == 300) { sleep = 350; continue; }
        if (val == _) {
            Sleep(350);
            continue;
        }
        voice = (volume << 16) + ((val) << 8) + 0x90;
        midiOutShortMsg(handle, voice);
        cout << voice << endl;
        Sleep(sleep);
    }
    midiOutClose(handle);
}
int main()
{
    Wind();
    return 0;
}

3 条评论

  • @ 2026-2-6 15:11:29
    #include <iostream>
    #include <Windows.h>
    #pragma comment(lib,"winmm.lib")
    using namespace std;
    
    enum Scale
    {
        Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
        D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
        E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
        F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
        F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
        G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
        G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
        A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
        A0s = 22, A0 = 21
    };
    
    enum Voice
    {
        X1 = C2, X2 = D2, X3 = E2, X4 = F2, X5 = G2, X6 = A2, X7 = B2,
        L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,
        M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,
        H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,
        HH1 = C6, HH2 = D6, HH3 = E6, HH4 = F6, HH5 = G6, HH6 = A6, HH7 = B6,
        _ = 0XFF
    };
    
    const int CHANNEL_PIANO = 0;
    const int CHANNEL_STRINGS = 1;
    const int CHANNEL_BASS = 2;
    const int TONE_PIANO = 0;
    const int TONE_STRINGS = 41;
    const int TONE_BASS = 33;
    const int VOL_PIANO = 0x7F;
    const int VOL_STRINGS = 0x55;
    const int VOL_BASS = 0x65;
    
    void SetMidiTone(HMIDIOUT handle, int channel, int tone, int volume)
    {
        DWORD setTone = 0xC0 | channel;
        midiOutShortMsg(handle, (0 << 24) | (tone << 16) | (0 << 8) | setTone);
        DWORD setVolCmd = 0xB0 | channel;
        midiOutShortMsg(handle, (0 << 24) | (volume << 16) | (7 << 8) | setVolCmd);
    }
    
    void PlayNote(HMIDIOUT handle, int channel, int note, int volume)
    {
        if (note == Rest) return;
        DWORD playCmd = 0x90 | channel;
        DWORD noteData = (volume << 16) | (note << 8) | playCmd;
        midiOutShortMsg(handle, noteData);
    }
    
    int GetBassNote(int mainNote)
    {
        if (mainNote >= M1 && mainNote <= M7) return mainNote - 12;
        if (mainNote >= H1 && mainNote <= H7) return mainNote - 24;
        if (mainNote >= HH1 && mainNote <= HH7) return mainNote - 36;
        return Rest;
    }
    
    int GetStringNote(int mainNote)
    {
        if (mainNote >= M3 && mainNote <= HH7) return mainNote + 4;
        return Rest;
    }
    
    void Wind()
    {
        HMIDIOUT handle;
        midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
        SetMidiTone(handle, CHANNEL_PIANO, TONE_PIANO, VOL_PIANO);
        SetMidiTone(handle, CHANNEL_STRINGS, TONE_STRINGS, VOL_STRINGS);
        SetMidiTone(handle, CHANNEL_BASS, TONE_BASS, VOL_BASS);
    
        int sleep = 350;
        int wind[] =
        {
             400,0,M7,H1,H2,H3,300,M3,0,H5,H3,300,M2,H5,2,_,0,M7,H1,H2,H3,300,M2,0,H5,H3,H2,H3,H1,H2,M7,H1,300,H5,0,M7,H1,H2,H3,300,M3,0,H5,H3,300,M2,H5,2,_,0,M7,H1,H2,H3,300,M2,0,H5,H3,H2,H3,H1,H2,M7,H1,300,H5,
             0,M7,H1,H2,H3,300,M3,0,H5,H3,300,M2,H5,2,_,0,M7,H1,H2,H3,300,M2,0,H5,H3,H2,H3,H1,H2,M7,H1,300,H5,0,M7,H1,H2,H3,300,M3,0,H5,H3,300,M2,H5,2,_,
             0,H6,H3,H2,M6,H3,M6,H2,H3,M6,_,_,_,
             H2,700,0,H1,300,H2,700,0,H1,300,H2,H3,H5,0,H3,700,300,H2,700,0,H1,300,H2,700,0,H1,H2,H3,H2,H1,300,M5,_,
             H2,700,0,H1,300,H2,700,0,H1,300,H2,H3,H5,0,H3,700,300,H2,700,0,H3,300,H2,0,H1,700,300,H2,_,_,_,
             H2,700,0,H1,300,H2,700,0,H1,300,H2,H3,H5,0,H3,700,300,H2,700,0,H3,300,H2,0,H1,700,300,M6,_,
             0,H3,H2,H1,H2,300,H1,_,0,H3,H2,H1,H2,300,H1,700,0,M5,H3,H2,H1,H2,300,H1,_,_,_,
             H1,H2,H3,H1,H6,0,H5,H6,300,_,700,0,H1,300,H7,0,H6,H7,300,_,_,H7,0,H6,H7,300,_,H3,0,HH1,HH2,HH1,H7,300,H6,H5,H6,0,H5,H6,_,H5,H6,H5,300,H6,0,H5,H2,300,_,0,H5,700,300,H3,_,_,_,
             H1,H2,H3,H1,H6,0,H5,H6,300,_,700,0,H1,300,H7,0,H6,H7,300,_,_,H7,0,H6,H7,300,_,H3,0,HH1,HH2,HH1,H7,300,H6,H5,H6,0,HH3,HH3,300,_,H5,H6,0,HH3,HH3,300,_,0,H5,700,300,H6,_,_,_,_,_,
             HH1,HH2,HH3,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH2,HH3,300,HH3,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH2,HH3,300,HH2,0,HH1,H6,300,_,0,HH1,HH1,300,HH2,0,HH1,300,H6,700,0,_,300,HH1,700,HH3,_,0,HH3,HH4,HH3,HH2,HH3,300,HH2,700,
             HH1,HH2,HH3,0,HH6,HH5,_,HH6,HH5,_,HH6,HH5,300,_,HH3,HH3,0,HH6,HH5,_,HH6,HH5,_,HH6,HH5,700,300,HH3,700,HH2,0,HH1,H6,700,300,
             HH3,700,HH2,0,HH1,300,H6,700,HH1,HH1,_,_,_,_,_,
             0,H6,300,HH3,700,HH2,0,HH1,H6,700,300,HH3,HH2,700,300,0,HH1,H6,300,700,HH1,HH1,_,_,
             0,M7,H1,H2,H3,300,M3,0,H5,H3,300,M2,H5,2,_,0,M7,H1,H2,H3,300,M2,0,H5,H3,H2,H3,H1,H2,M7,H1,300,H5,0,M7,H1,H2,H3,300,M3,0,H5,H3,300,M2,H5,2,_,
             0,H6,H3,H2,M6,H3,M6,H2,H3,M6,_,_,_,
             H2,700,0,H1,300,H2,700,0,H1,300,H2,H3,H5,0,H3,700,300,H2,700,0,H1,300,H2,700,0,H1,H2,H3,H2,H1,300,M5,_,
             H2,700,0,H1,300,H2,700,0,H1,300,H2,H3,H5,0,H3,700,300,H2,700,0,H3,300,H2,0,H1,700,300,H2,_,_,_,
             H2,700,0,H1,300,H2,700,0,H1,300,H2,H3,H5,0,H3,700,300,H2,700,0,H3,300,H2,0,H1,700,300,M6,_,
             0,H3,H2,H1,H2,300,H1,_,0,H3,H2,H1,H2,300,H1,700,0,M5,H3,H2,H1,H2,300,H1,_,_,_,
             H1,H2,H3,H1,H6,0,H5,H6,300,_,700,0,H1,300,H7,0,H6,H7,300,_,_,H7,0,H6,H7,300,_,H3,0,HH1,HH2,HH1,H7,300,H6,H5,H6,0,H5,H6,_,H5,H6,H5,300,H6,0,H5,H2,300,_,0,H5,700,300,H3,_,_,_,
             H1,H2,H3,H1,H6,0,H5,H6,300,_,700,0,H1,300,H7,0,H6,H7,300,_,_,H7,0,H6,H7,300,_,H3,0,HH1,HH2,HH1,H7,300,H6,H5,H6,0,HH3,HH3,300,_,H5,H6,0,HH3,HH3,300,_,0,H5,700,300,H6,_,_,_,_,_,
             HH1,HH2,HH3,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH2,HH3,300,HH3,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH6,HH5,300,_,0,HH2,HH3,300,HH2,0,HH1,H6,300,_,0,HH1,HH1,300,HH2,0,HH1,300,H6,700,0,_,300,HH1,700,HH3,_,0,HH3,HH4,HH3,HH2,HH3,300,HH2,700,
             HH2,HH3,0,HH6,HH5,_,HH6,HH5,_,HH6,HH5,300,_,HH3,HH3,0,HH6,HH5,_,HH6,HH5,_,HH6,HH5,700,300,HH3,700,HH2,0,HH1,H6,700,300,
             HH3,700,HH2,0,HH1,300,H6,700,HH1,HH1,_,_,_,_,_,
             0,H6,300,HH3,700,HH2,0,HH1,H6,700,300,HH3,HH2,700,300,0,HH1,H6,300,700,HH1,HH1,_,_,_,_,_,_,_
        };
    
        int len = sizeof(wind) / sizeof(wind[0]);
        for (int i = 0; i < len; i++) {
            int val = wind[i];
            if (val == 0) { sleep = 175; continue; }
            if (val == 700) { Sleep(175); continue; }
            if (val == 300) { sleep = 350; continue; }
            if (val == _) { Sleep(350); continue; }
            if (val == 2) { Sleep(175); continue; }
    
            PlayNote(handle, CHANNEL_PIANO, val, VOL_PIANO);
            PlayNote(handle, CHANNEL_BASS, GetBassNote(val), VOL_BASS);
            if (val >= H1 || val >= HH1) {
                PlayNote(handle, CHANNEL_STRINGS, GetStringNote(val), VOL_STRINGS);
            }
    
            Sleep(sleep);
        }
        midiOutClose(handle);
    }
    
    int main()
    {
        while(1){
            Wind();
        } 
        return 0;
    }
    
    • @ 2025-12-4 16:59:10
      #include<bits/stdc++.h>
      #include<windows.h>
      #include<conio.h>
      using namespace std;
      int wolf_kill = -1; // 存储狼人击杀的目标座位号
      enum Scale
      {
          Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
          D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
          E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
          F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
          F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
          G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
          G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
          A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
          A0s = 22, A0 = 21
      };
      enum Voice
      {
          X1 = C2, X2 = D2, X3 = E2, X4 = F2, X5 = G2, X6 = A2, X7 = B2,
          L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,
          M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,
          H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,
          LOW_SPEED = 500, MIDDLE_SPEED = 400, HIGH_SPEED = 300,
          _ = 0XFF
      };
      void Wind()
      {
          HMIDIOUT handle;
          midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
          int volume = 0x7f;
          int voice = 0x0;
          int sleep = 350;
          int wind[] =
          {
               400,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,
               0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
               0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
               M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
               M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
               M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
               0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
               M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
               M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
               H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
               H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
               H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
               0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,
               0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
               0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
               M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
               M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
               M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
               0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
               M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
               M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
               H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
               H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
               H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
               H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
               H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
               H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
               H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
               H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
               H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
               0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,_,_,_,_,_,
          };
      
          int len = sizeof(wind) / sizeof(wind[0]);
          for (int i = 0; i < len; i++) {
              int val = wind[i];
              if (val == 0) { sleep = 175; continue; }
              if (val == 700) { Sleep(175); continue; }
              if (val == 300) { sleep = 350; continue; }
              if (val == _) {
                  Sleep(350);
                  continue;
              }
              voice = (volume << 16) + ((val) << 8) + 0x90;
              midiOutShortMsg(handle, voice);
              Sleep(sleep);
          }
          midiOutClose(handle);
      }
      const int DAY = 0, NIGHT = 1;
      enum Color { BLUE, YELLOW, RED, GREEN, PURPLE, WHITE };
      enum Role {
          WITCH = 0, VILLAGER = 1, SEER = 2, WEREWOLF = 3,
          HUNTER = 4, GUARD = 5, GOOD = 6
      };
      enum Status { DEAD = 1, ALIVE = 2 };
      int day = 0;                
      int current_phase = DAY;   
      int player_count;           
      int my_seat;                
      HWND hwnd = GetForegroundWindow();
      int police_seat = -1;     
      int wolf_count = 0;
      int witch_seat = -1, guard_seat = -1, seer_seat = -1, hunter_seat = -1;
      int wolf_seats[4] = {-1, -1, -1, -1};  
      bool witch_healed = false;  
      bool witch_poisoned = false; 
      int heal_target = -1;      
      int poison_target = -1;    
      int guard_protect = -1;
      int seer_check_target = -1;
      struct Player {
          Role role = (Role)-1;       
          Status status = ALIVE;      
          bool known = false;         
          int killer = INT_MAX;       
      };
      Player players[100];
      void set_color(Color c) {
          HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
          switch(c) {
              case RED: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED); break;
              case GREEN: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_GREEN); break;
              case YELLOW: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); break;
              case BLUE: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_BLUE); break;
              case WHITE: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); break;
              case PURPLE: SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); break;
          }
      }
      void gotoxy(int x, int y) {
          COORD pos = { (SHORT)x, (SHORT)y };
          SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
      }
      void init_window() {
          system("mode con lines=60 cols=188"); 
          ShowWindow(hwnd, SW_MAXIMIZE);
          DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
          DrawMenuBar(GetConsoleWindow());
      }
      bool array_contains(int arr[], int val, int len) {
          for(int i = 0; i < len; i++) {
              if(arr[i] == val) return true;
          }
          return false;
      }
      int rand_alive_player(Role exclude_role = (Role)-1) {
          int target = -1;
          while(true) {
              target = rand() % player_count;
              if(players[target].status == ALIVE && players[target].role != exclude_role) {
                  break;
              }
          }
          return target;
      }
      void init_players() {
          if(player_count == 12) wolf_count = 4;
          else if(player_count >= 10) wolf_count = 3;
          else wolf_count = 2;
          for(int i = 0; i < player_count; i++) {
              players[i].status = ALIVE;
              players[i].known = false;
              players[i].killer = INT_MAX;
              players[i].role = (Role)-1;
          }
          int wolf_idx = 0;
          while(wolf_idx < wolf_count) {
              int seat = rand() % player_count;
              if(!array_contains(wolf_seats, seat, 4)) {
                  wolf_seats[wolf_idx++] = seat;
                  players[seat].role = WEREWOLF;
              }
              Sleep(rand() % 80 + 100);
          }
          if(player_count == 12) {
              do { guard_seat = rand() % player_count; }
              while(players[guard_seat].role != (Role)-1);
              players[guard_seat].role = GUARD;
          }
          do { witch_seat = rand() % player_count; }
          while(players[witch_seat].role != (Role)-1);
          players[witch_seat].role = WITCH;
          if(player_count >= 10) {
              do { hunter_seat = rand() % player_count; }
              while(players[hunter_seat].role != (Role)-1);
              players[hunter_seat].role = HUNTER;
          }
          do { seer_seat = rand() % player_count; }
          while(players[seer_seat].role != (Role)-1);
          players[seer_seat].role = SEER;
          for(int i = 0; i < player_count; i++) {
              if(players[i].role == (Role)-1) {
                  players[i].role = VILLAGER;
              }
          }
          my_seat = rand() % player_count;
          players[my_seat].known = true;
          if(players[my_seat].role == WEREWOLF) {
              for(int i = 0; i < wolf_count; i++) {
                  players[wolf_seats[i]].known = true;
              }
          }
      }
      void print_ui() {
          gotoxy(0, 0);
          set_color(WHITE);
          cout << "作者:chenzhan";
          gotoxy(90, 0);
          if(current_phase == NIGHT) set_color(RED);
          else set_color(BLUE);
          printf("第%d天 | %s\n", day, current_phase == NIGHT ? "黑夜" : "白天");
          gotoxy(0, 3);
          set_color(BLUE);
          cout << " 我的号位:" << my_seat + 1;
          for(int i = 0; i < player_count; i++) {
              gotoxy(i * 8 + 1, 4);
              if(i == police_seat) set_color(YELLOW);
              else set_color(BLUE);
              cout << i + 1 << "号位";
              gotoxy(i * 8 + 1, 5);
              if(players[i].status == DEAD) {
                  set_color(RED);
                  cout << "死 亡";
              } else {
                  set_color(GREEN);
                  cout << "存 活";
              }
              gotoxy(i * 8 + 1, 6);
              set_color(BLUE);
              if(players[i].known) {
                  switch(players[i].role) {
                      case WITCH: cout << "女 巫"; break;
                      case SEER: cout << "预言家"; break;
                      case VILLAGER: cout << "村 民"; break;
                      case WEREWOLF: cout << "狼 人"; break;
                      case HUNTER: cout << "猎 人"; break;
                      case GUARD: cout << "守 卫"; break;
                      default: cout << "好人";
                  }
              } else {
                  cout << "未知";
              }
          }
          set_color(WHITE); 
      }
      int check_game_end() {
          int dead_wolf = 0, dead_villager = 0, dead_god = 0;
          int alive_wolf = 0, alive_good = 0;
          for(int i = 0; i < player_count; i++) {
              if(players[i].status == DEAD) {
                  if(players[i].role == WEREWOLF) dead_wolf++;
                  else if(players[i].role == VILLAGER) dead_villager++;
                  else dead_god++; 
              } else {
                  if(players[i].role == WEREWOLF) alive_wolf++;
                  else alive_good++;
              }
          }
          if(alive_wolf == 0) return 1; 
          int god_total = (witch_seat != -1) + (seer_seat != -1) + (hunter_seat != -1) + (guard_seat != -1);
          int villager_total = player_count - god_total - wolf_count;
          if(dead_god >= god_total || dead_villager >= villager_total) return 2;
          if(alive_wolf == alive_good) return 3;
          return 0;
      }
      void pre_game() {
          srand(time(NULL));
          init_window();
      
          set_color(GREEN);
          cout << "欢迎来到狼人杀游戏\t\t\t注:10/11/12人局开设猎人  12人局开设守卫/警长\n";
          cout << "----------------------------------------\n";
          cout << "请输入玩家人数(8-12人): ";
          cin >> player_count;
          while(player_count < 8 || player_count > 12) {
              cout << "人数不符合要求,请重新输入(8-12): ";
              cin >> player_count;
          }
          system("cls");
          cout << "初始化身份中,请稍等.";
          for(int i = 0; i < 6; i++) {
              for(int j = 0; j < 12; j++) {
                  cout << ".";
                  Sleep(50);
              }
              cout << "\b\b\b\b\b\b\b\b\b\b\b\b            \b\b\b\b\b\b\b\b\b\b\b\b";
          }
          system("cls");
          init_players();
          cout << "我的号位: " << my_seat + 1 << endl;
          cout << "我的身份: ";
          switch(players[my_seat].role) {
              case WITCH: cout << "女巫\n"; break;
              case SEER: cout << "预言家\n"; break;
              case VILLAGER: cout << "村民\n"; break;
              case WEREWOLF: cout << "狼人\n"; break;
              case HUNTER: cout << "猎人\n"; break;
              case GUARD: cout << "守卫\n"; break;
          }
          current_phase = DAY;
          day = 1; 
          system("pause");
          system("cls");
          cout << "游戏加载中.";
          int load_times = rand() % 3 + 2;
          for(int i = 0; i < load_times; i++) {
              for(int j = 0; j < 6; j++) {
                  cout << ".";
                  Sleep(rand() % 100 + 150);
              }
              cout << "\b\b\b\b\b\b      \b\b\b\b\b\b";
          }
          system("cls");
          print_ui();
      }
      void guard_action() {
          set_color(BLUE);
          cout << "守卫~请睁眼~~\n";
          Sleep(1500);
          guard_protect = -1;
          if(players[my_seat].role == GUARD && players[my_seat].status == ALIVE) {
              cout << "你要守护的是? (输入座位号1-" << player_count << "): ";
              cin >> guard_protect;
              guard_protect--; 
              while(guard_protect < 0 || guard_protect >= player_count || players[guard_protect].status == DEAD) {
                  cout << "输入无效,请重新输入存活玩家的座位号: ";
                  cin >> guard_protect;
                  guard_protect--;
              }
              cout << "你今晚要守护的是" << guard_protect + 1 << "号\n";
          } else if(guard_seat != -1 && players[guard_seat].status == ALIVE) {
              guard_protect = rand_alive_player();
          }
          Sleep(2000);
          cout << "守卫请闭眼\n\n";
      }
      int wolf_action() {
          set_color(RED);
          cout << "狼人~请睁眼~~~\n";
          Sleep(1500);
          int kill_target = -1;
          if(players[my_seat].role == WEREWOLF && players[my_seat].status == ALIVE) {
              cout << "你们今晚要杀谁?(输入座位号1-" << player_count << "): ";
              cin >> kill_target;
              kill_target--;
              while(kill_target < 0 || kill_target >= player_count || players[kill_target].status == DEAD || players[kill_target].role == WEREWOLF) {
                  cout << "输入无效,请重新输入非狼人存活玩家的座位号: ";
                  cin >> kill_target;
                  kill_target--;
              }
              cout << "你们今晚要杀的是" << kill_target + 1 << "号\n";
          } else {
              kill_target = rand_alive_player(WEREWOLF);
          }
          Sleep(3500);
          cout << "狼人请~闭眼~~\n\n";
          return kill_target;
      }
      void witch_action(int wolf_kill) {
          set_color(PURPLE);
          cout << "女巫~~请睁眼~~\n";
          Sleep(2000);
          heal_target = -1;
          poison_target = -1;
          if(players[my_seat].role == WITCH && players[my_seat].status == ALIVE) {
              if(!witch_healed) {
                  cout << "今晚" << wolf_kill + 1 << "号被狼人杀死,你想用解药吗?(1=想 / 2=不想): ";
                  int choice;
                  cin >> choice;
                  while(choice != 1 && choice != 2) {
                      cout << "输入无效,请输入1或2: ";
                      cin >> choice;
                  }
                  if(choice == 1) {
                      heal_target = wolf_kill;
                      witch_healed = true;
                      cout << "已解救" << wolf_kill + 1 << "号\n";
                  }
              } else {
                  cout << "你已经用过解药\n";
                  Sleep(1500);
              }
              Sleep(1500);
              if(!witch_poisoned) {
                  cout << "你想用毒药吗?(1=想 / 2=不想): ";
                  int choice;
                  cin >> choice;
                  while(choice != 1 && choice != 2) {
                      cout << "输入无效,请输入1或2: ";
                      cin >> choice;
                  }
                  if(choice == 1) {
                      cout << "你想毒谁?(输入座位号1-" << player_count << "): ";
                      cin >> poison_target;
                      poison_target--;
                      while(poison_target < 0 || poison_target >= player_count || players[poison_target].status == DEAD) {
                          cout << "输入无效,请重新输入存活玩家的座位号: ";
                          cin >> poison_target;
                          poison_target--;
                      }
                      witch_poisoned = true;
                      cout << "已毒死" << poison_target + 1 << "号\n";
                  }
              } else {
                  cout << "你已经用过毒药\n";
                  Sleep(1500);
              }
          } else if(players[witch_seat].status == ALIVE) {
              if(!witch_healed && rand() % 10 == 0) {
                  heal_target = wolf_kill;
                  witch_healed = true;
              }
              if(!witch_poisoned && rand() % 4 == 0) {
                  poison_target = rand_alive_player();
                  witch_poisoned = true;
              }
          }
          Sleep(1500);
          cout << "女巫~请闭眼~~\n\n";
      }
      void seer_action() {
          set_color(GREEN);
          cout << "预言家~请睁眼~~\n";
          Sleep(2000);
          seer_check_target = -1;
          if(players[my_seat].role == SEER && players[my_seat].status == ALIVE) {
              cout << "你想查验谁的身份?(输入座位号1-" << player_count << "): ";
              int check;
              cin >> check;
              check--;
              while(check < 0 || check >= player_count || players[check].status == DEAD) {
                  cout << "输入无效,请重新输入存活玩家的座位号: ";
                  cin >> check;
                  check--;
              }
              Sleep(2000);
              cout << check + 1 << "号的身份是——";
              Sleep(1000);
              if(players[check].role == WEREWOLF) {
                  cout << "狼人\n";
                  players[check].known = true;
              } else {
                  cout << "好人\n";
                  players[check].known = true;
              }
          } else if(players[seer_seat].status == ALIVE) {
              seer_check_target = rand_alive_player();
              if(players[seer_check_target].role == WEREWOLF) {
                  seer_check_target = seer_check_target;
              }
          }
          Sleep(1000);
          cout << "预言家~~请闭眼~~\n\n";
      }
      void night_phase() {
          current_phase = NIGHT;
          system("cls");
          print_ui();
          gotoxy(0, 7);
          cout << "----------------------------------------\n";
          set_color(WHITE);
          cout << "天黑~请闭眼~~~\n";
          Sleep(1500);
          if(player_count == 12) {
              guard_action();
              Sleep(2000);
          }
          int wolf_kill = wolf_action();
          Sleep(3500);
          witch_action(wolf_kill);
          Sleep(3000);
          seer_action();
          Sleep(2000);
          current_phase = DAY;
      }
      void hunter_skill(int dead_seat) {
          if(players[dead_seat].role != HUNTER || players[dead_seat].status == ALIVE) return;
      
          set_color(RED);
          cout << dead_seat + 1 << "号是猎人,触发技能!\n";
          Sleep(1000);
          int take_seat = -1;
          if(dead_seat == my_seat) {
              cout << "你想带走几号?(输入座位号1-" << player_count << "): ";
              cin >> take_seat;
              take_seat--;
              while(take_seat < 0 || take_seat >= player_count || players[take_seat].status == DEAD) {
                  cout << "输入无效,请重新输入存活玩家的座位号: ";
                  cin >> take_seat;
                  take_seat--;
              }
          } else {
              take_seat = rand_alive_player();
          }
          Sleep(2000);
          cout << "猎人选择带走" << take_seat + 1 << "号\n";
          players[take_seat].status = DEAD;
          players[take_seat].killer = HUNTER;
          Sleep(3000);
      }
      void announce_night_result() {
          system("cls");
          print_ui();
          gotoxy(0, 7);
          cout << "----------------------------------------\n";
          Sleep(3000);
          set_color(WHITE);
          cout << "天亮了\n";
          Sleep(2000);
          vector<int> dead_players;
          if(wolf_kill != -1 && wolf_kill != guard_protect && wolf_kill != heal_target) {
              players[wolf_kill].status = DEAD;
              players[wolf_kill].killer = WEREWOLF;
              dead_players.push_back(wolf_kill);
          }
          if(poison_target != -1) {
              players[poison_target].status = DEAD;
              players[poison_target].killer = WITCH;
              dead_players.push_back(poison_target);
          }
          cout << "昨晚";
          if(dead_players.empty()) {
              cout << "是平安夜\n";
          } else {
              for(int i = 0; i < dead_players.size(); i++) {
                  if(i > 0) cout << "和";
                  cout << dead_players[i] + 1 << "号";
                  if(dead_players[i] == police_seat) {
                      cout << "(警长)";
                  }
              }
              cout << "死了\n";
              for(int seat : dead_players) {
                  hunter_skill(seat);
              }
          }
          Sleep(3000);
      }
      void elect_police() {
          system("cls");
          print_ui();
          gotoxy(0, 7);
          cout << "----------------------------------------\n";
          set_color(YELLOW);
          cout << "开始选举警长,不能选举自己!\n";
          Sleep(2000);
          int votes[100] = {0};
          int cannot_vote[100] = {-1}; 
          int cannot_len = 0;
          while(true) {
              memset(votes, 0, sizeof(votes));
              for(int i = 0; i < player_count; i++) {
                  if(players[i].status == DEAD || array_contains(cannot_vote, i, cannot_len)) {
                      continue;
                  }
                  int vote_target = -1;
                  if(i == my_seat) {
                      cout << "你要选举谁当警长?(输入座位号1-" << player_count << "): ";
                      cin >> vote_target;
                      vote_target--;
                      while(vote_target < 0 || vote_target >= player_count || vote_target == i || players[vote_target].status == DEAD || array_contains(cannot_vote, vote_target, cannot_len)) {
                          cout << "输入无效,请重新输入: ";
                          cin >> vote_target;
                          vote_target--;
                      }
                      cout << i + 1 << "号选举" << vote_target + 1 << "号\n";
                  } else {
                      do {
                          vote_target = rand() % player_count;
                      } while(vote_target == i || players[vote_target].status == DEAD || array_contains(cannot_vote, vote_target, cannot_len));
                      cout << i + 1 << "号选举" << vote_target + 1 << "号\n";
                  }
                  votes[vote_target] += (i == police_seat) ? 2 : 1;
                  Sleep(1500);
              }
              int max_vote = -1;
              vector<int> max_seats;
              for(int i = 0; i < player_count; i++) {
                  if(votes[i] > max_vote) {
                      max_vote = votes[i];
                      max_seats.clear();
                      max_seats.push_back(i);
                  } else if(votes[i] == max_vote) {
                      max_seats.push_back(i);
                  }
              }
              if(max_seats.size() == 1) {
                  police_seat = max_seats[0];
                  cout << "恭喜" << police_seat + 1 << "号当选警长!\n";
                  Sleep(3000);
                  break;
              } else {
                  cout << "平票:";
                  cannot_len = 0;
                  for(int seat : max_seats) {
                      cout << seat + 1 << "号 ";
                      cannot_vote[cannot_len++] = seat;
                  }
                  cout << "进入重选,平票者不能参与\n";
                  Sleep(2000);
              }
          }
      }
      void police_death() {
          set_color(YELLOW);
          cout << "警长死亡,处理警徽!\n";
          Sleep(1500);
      
          int choice = 1; // 1=撕毁,2=移交
          if(police_seat == my_seat) {
              cout << "你想撕毁警徽还是移交警徽?(1=撕毁 / 2=移交): ";
              cin >> choice;
              while(choice != 1 && choice != 2) {
                  cout << "输入无效,请输入1或2: ";
                  cin >> choice;
              }
          } else {
              choice = rand() % 2 + 1;
          }
          if(choice == 1) {
              cout << "警长选择撕毁警徽\n";
              police_seat = -1;
          } else {
              int new_police = rand_alive_player();
              cout << "警长选择把警徽移交给" << new_police + 1 << "号\n";
              police_seat = new_police;
          }
          Sleep(2000);
      }
      int vote_phase() {
          system("cls");
          print_ui();
          gotoxy(0, 7);
          cout << "----------------------------------------\n";
          set_color(WHITE);
          cout << "进入投票环节,选出要放逐的玩家!\n";
          Sleep(2000);
          int votes[100] = {0};
          int cannot_vote[100] = {-1}; 
          int cannot_len = 0;
          while(true) {
              memset(votes, 0, sizeof(votes));
              for(int i = 0; i < player_count; i++) {
                  if(players[i].status == DEAD || array_contains(cannot_vote, i, cannot_len)) {
                      continue;
                  }
      
                  int vote_target = -1;
                  if(i == my_seat) {
                      cout << "你要投谁出局?(输入座位号1-" << player_count << "): ";
                      cin >> vote_target;
                      vote_target--;
                      while(vote_target < 0 || vote_target >= player_count || players[vote_target].status == DEAD) {
                          cout << "输入无效,请重新输入: ";
                          cin >> vote_target;
                          vote_target--;
                      }
                      cout << i + 1 << "号投了" << vote_target + 1 << "号";
                      if(i == police_seat) cout << "(警长,2票)";
                      cout << endl;
                  } else {
                      do {
                          vote_target = rand() % player_count;
                          if(i == seer_seat && seer_check_target != -1 && players[seer_check_target].role == WEREWOLF) {
                              vote_target = seer_check_target;
                              seer_check_target = -1;
                              break;
                          }
                          if(array_contains(wolf_seats, i, wolf_count) && players[vote_target].role == WEREWOLF) {
                              vote_target = -1;
                              continue;
                          }
                      } while(vote_target == -1 || players[vote_target].status == DEAD);
      
                      cout << i + 1 << "号投了" << vote_target + 1 << "号";
                      if(i == police_seat) cout << "(警长,2票)";
                      cout << endl;
                  }
                  votes[vote_target] += (i == police_seat) ? 2 : 1;
                  Sleep(rand() % 1000 + 1000);
              }
              int max_vote = -1;
              vector<int> max_seats;
              for(int i = 0; i < player_count; i++) {
                  if(votes[i] > max_vote) {
                      max_vote = votes[i];
                      max_seats.clear();
                      max_seats.push_back(i);
                  } else if(votes[i] == max_vote) {
                      max_seats.push_back(i);
                  }
              }
              if(max_seats.size() == 1) {
                  int out_seat = max_seats[0];
                  cout << out_seat + 1 << "号获得最高票,出局!\n";
                  players[out_seat].status = DEAD;
                  players[out_seat].killer = GOOD;
                  Sleep(4000);
                  if(out_seat == police_seat) {
                      police_death();
                  }
                  hunter_skill(out_seat);
                  return out_seat;
              } else {
                  cout << "平票:";
                  cannot_len = 0;
                  for(int seat : max_seats) {
                      cout << seat + 1 << "号 ";
                      cannot_vote[cannot_len++] = seat;
                  }
                  cout << "进入重选!\n";
                  Sleep(3000);
              }
          }
      }
      void game_over() {
          system("cls");
          set_color(WHITE);
          int result = check_game_end();
          switch(result) {
              case 1: cout << "?? 好人阵营胜利!??\n\n"; break;
              case 2: cout << "?? 狼人阵营胜利!??\n\n"; break;
              case 3: cout << "?? 本局平局!??\n\n"; break;
          }
          cout << "===== 最终结算 =====\n";
          for(int i = 0; i < player_count; i++) {
              cout << i + 1 << "号位: \t";
              switch(players[i].role) {
                  case WITCH: cout << "女巫\t"; break;
                  case SEER: cout << "预言家\t"; break;
                  case VILLAGER: cout << "村民\t"; break;
                  case WEREWOLF: cout << "狼人\t"; break;
                  case HUNTER: cout << "猎人\t"; break;
                  case GUARD: cout << "守卫\t"; break;
              }
              cout << "最终: ";
              if(players[i].status == ALIVE) {
                  cout << "存活\n";
              } else {
                  switch(players[i].killer) {
                      case WEREWOLF: cout << "被狼人杀死\n"; break;
                      case WITCH: cout << "被女巫毒死\n"; break;
                      case GOOD: cout << "被投票出局\n"; break;
                      case HUNTER: cout << "被猎人带走\n"; break;
                      default: cout << "死亡(未知原因)\n";
                  }
              }
          }
          set_color(WHITE);
      }
      int main() {
      	for(int i=0;i<=1;i++){
         	 Wind();
         	 pre_game();
          int round = 0;
          while(!check_game_end()) {
              night_phase();
              announce_night_result();
              if(check_game_end()) break;
              system("cls");
              print_ui();
              if(round == 0 && player_count == 12 && police_seat == -1) {
                  elect_police();
                  system("cls");
                  print_ui();
              }
              vote_phase();
              if(check_game_end()) break;
      
              day++;
              round++;
              system("cls");
              print_ui();
          }
          game_over();
          system("pause");
      }
          return 0;
      }
      
      • @ 2025-11-30 9:01:29

        新代码:

        #include <iostream>
        #include <Windows.h>
        #pragma comment(lib,"winmm.lib")
        using namespace std;
        enum Scale
        {
            Rest = 0, C8 = 108, B7 = 107, A7s = 106, A7 = 105, G7s = 104, G7 = 103, F7s = 102, F7 = 101, E7 = 100,
            D7s = 99, D7 = 98, C7s = 97, C7 = 96, B6 = 95, A6s = 94, A6 = 93, G6s = 92, G6 = 91, F6s = 90, F6 = 89,
            E6 = 88, D6s = 87, D6 = 86, C6s = 85, C6 = 84, B5 = 83, A5s = 82, A5 = 81, G5s = 80, G5 = 79, F5s = 78,
            F5 = 77, E5 = 76, D5s = 75, D5 = 74, C5s = 73, C5 = 72, B4 = 71, A4s = 70, A4 = 69, G4s = 68, G4 = 67,
            F4s = 66, F4 = 65, E4 = 64, D4s = 63, D4 = 62, C4s = 61, C4 = 60, B3 = 59, A3s = 58, A3 = 57, G3s = 56,
            G3 = 55, F3s = 54, F3 = 53, E3 = 52, D3s = 51, D3 = 50, C3s = 49, C3 = 48, B2 = 47, A2s = 46, A2 = 45,
            G2s = 44, G2 = 43, F2s = 42, F2 = 41, E2 = 40, D2s = 39, D2 = 38, C2s = 37, C2 = 36, B1 = 35, A1s = 34,
            A1 = 33, G1s = 32, G1 = 31, F1s = 30, F1 = 29, E1 = 28, D1s = 27, D1 = 26, C1s = 25, C1 = 24, B0 = 23,
            A0s = 22, A0 = 21
        };
        enum Voice
        {
            X1 = C2, X2 = D2, X3 = E2, X4 = F2, X5 = G2, X6 = A2, X7 = B2,
            L1 = C3, L2 = D3, L3 = E3, L4 = F3, L5 = G3, L6 = A3, L7 = B3,
            M1 = C4, M2 = D4, M3 = E4, M4 = F4, M5 = G4, M6 = A4, M7 = B4,
            H1 = C5, H2 = D5, H3 = E5, H4 = F5, H5 = G5, H6 = A5, H7 = B5,
            LOW_SPEED = 500, MIDDLE_SPEED = 400, HIGH_SPEED = 300,
            _ = 0XFF
        };
        void Wind()
        {
            HMIDIOUT handle;
            midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);
            int volume = 0x7f;
            int voice = 0x0;
            int sleep = 350;
            int wind[] =
            {
                 400,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,
                 0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
                 0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
                 M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
                 M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
                 M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
                 0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
                 M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
                 M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
                 H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
                 H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
                 H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
                 0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,
                 0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,0,L7,M1,M2,M3,300,L2,0,M5,M3,M2,M3,M1,M2,L7,M1,300,L5,0,L7,M1,M2,M3,300,L3,0,M5,M3,300,L2,L5,2,_,
                 0,M6,M3,M2,L6,M3,L6,M2,M3,L6,_,_,_,
                 M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M1,300,M2,700,0,M1,M2,M3,M2,M1,300,L5,_,
                 M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,M2,_,_,_,
                 M2,700,0,M1,300,M2,700,0,M1,300,M2,M3,M5,0,M3,700,300,M2,700,0,M3,300,M2,0,M1,700,300,L6,_,
                 0,M3,M2,M1,M2,300,M1,_,0,M3,M2,M1,M2,300,M1,700,0,L5,M3,M2,M1,M2,300,M1,_,_,_,
                 M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,M5,M6,_,M5,M6,M5,300,M6,0,M5,M2,300,_,0,M5,700,300,M3,_,_,_,
                 M1,M2,M3,M1,M6,0,M5,M6,300,_,700,0,M1,300,M7,0,M6,M7,300,_,_,M7,0,M6,M7,300,_,M3,0,H1,H2,H1,M7,300,M6,M5,M6,0,H3,H3,300,_,M5,M6,0,H3,H3,300,_,0,M5,700,300,M6,_,_,_,_,_,
                 H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
                 H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
                 H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
                 H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
                 H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
                 H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
                 H1,H2,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H3,0,H6,H5,300,_,0,H6,H5,300,_,0,H6,H5,300,_,0,H2,H3,300,H2,0,H1,M6,300,_,0,H1,H1,300,H2,0,H1,300,M6,700,0,_,300,H1,700,H3,_,0,H3,H4,H3,H2,H3,300,H2,700,
                 H1,H2,H3,0,H6,H5,_,H6,H5,_,H6,H5,300,_,H3,H3,0,H6,H5,_,H6,H5,_,H6,H5,700,300,H3,700,H2,0,H1,M6,700,300,
                 H3,700,H2,0,H1,300,M6,700,H1,H1,_,_,_,_,_,
                 0,M6,300,H3,700,H2,0,H1,M6,700,300,H3,H2,700,300,0,H1,M6,300,700,H1,H1,_,_,_,_,_,_,_,
            };
        
            int len = sizeof(wind) / sizeof(wind[0]);
            for (int i = 0; i < len; i++) {
                int val = wind[i];
                if (val == 0) { sleep = 175; continue; }
                if (val == 700) { Sleep(175); continue; }
                if (val == 300) { sleep = 350; continue; }
                if (val == _) {
                    Sleep(350);
                    continue;
                }
                voice = (volume << 16) + ((val) << 8) + 0x90;
                midiOutShortMsg(handle, voice);
                cout << voice << endl;
                Sleep(sleep);
            }
            midiOutClose(handle);
        }
        int main()
        {
           for(;;){
           	 Wind();
           }
            return 0;
        }
        
        
        
        • 1