问题标题: 酷町堂第一个音游

1
1
已解决
陈俊霖
陈俊霖
新手天翼
新手天翼

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#include<pthread.h>
/******************\
本题思路:

\******************/
using namespace std;

//    using namespace std;
namespace {
const HANDLE GSH=GetStdHandle(STD_OUTPUT_HANDLE);
    void SCxy(COORD pos){
        SetConsoleCursorPosition(GSH,pos);
    }
    void SCcolor(int col){
        SetConsoleTextAttribute(GSH,col);
    }
    void gotoxy(int x,int y)
    {
        COORD  pos;
        pos.X=x;
        pos.Y=y;
        SetConsoleCursorPosition(GSH,pos);
    }
    void color(int m)
    {
         SCcolor(m);
    }
    void set_console(std::string a){
        CONSOLE_SCREEN_BUFFER_INFO bInfo;
        GetConsoleScreenBufferInfo(GSH,&bInfo);
        SetConsoleTitle(a.data());
    }
    enum my_color{
        m_black,m_blue,m_green,w2_green,m_red,m_purple,m_yellow,
        m_white,m_gray,w_blue,w_green,w_w2_green,w_red,w_purple,
        w_yellow,l_white
    };
    void print(std::string a,int x,int y){
        int x2=0,y2=0;
        gotoxy(0,0);
        for(int i=0;i<a.size();i++){
            if(a[i]!='\n'){
                std::cout<<a[i];
                x2++;
            }else{
                for(int j=x2;j<x;j++){
                    std::cout<<" ";
                }
                y2++;
                gotoxy(0,y2);
                x2=0;
            }
        }
        for(int i=y2;i<y;i++){
            for(int j=0;j<x;j++){
                std::cout<<" ";
            }
            gotoxy(0,i+1);
        }
    }

    int SC(std::string s,int a=-1,int b=-1){
        if(s=="pos"){
            COORD pos;
            pos.X=a;
            pos.Y=b;
            SCxy(pos);
            return 1;
        }else if(s=="pos2"){
            SC("pos",a*2-2,b);
        }else if(s=="color"){
            if(b<0||b>15){
                SCcolor(a);
                return 1;
            }else if(a>=0&&a<16){
                SCcolor(a+b*16);
                return 1;
            }
            return 0;
        }else if(!s.find("console ")){
            if(s.size()>8){
                set_console(s.substr(8,s.size()-8));
                return 1;
            }
            return 0;
        }else if(s=="size"){
    //        COORD size = {100,100};
    //        SetConsoleScreenBufferSize(nout::GSH,size);
            if(a>1&&b>1){
                SMALL_RECT rc={0,0,a-1,b-1};
                SetConsoleWindowInfo(GSH,1,&rc);
                return 1;
            }
            return 0;
        }
        return 0;
    }
    void Line_render(int x,int y,int l,int colback,int colfont){
        if(y<0||y>35){
            return;
        }
        gotoxy(x,y);
        SC("color",colfont,colback);
        for(int i=1;i<=l;i++){
            printf("-");
        }
    }
    void Line_render(int x,int y,int l,int colback){
        if(y<0||y>35){
            return;
        }
        gotoxy(x,y);
        SC("color",0,colback);
        for(int i=1;i<=l;i++){
            printf(" ");
        }
    }
    void exit(){
        while(1){
            getch();
        }
    }
    struct Block{
        int m,x,y,r,h;
        //m是音色,h是高低,x是x轴,y是y轴,r是存在情况
    };
    vector<Block>block;
    const bool debug=0;
    enum _music{
        Do=523,Re=578,Mi=659,Fa=698,So=784,La=880,Si=988,sDo=554,
        sRe=622,sFa=740,sSo=831,sLa=932
    };
    struct music{
        int m,a;
    };
    int V=70;
    int b_m[12]{Do,sDo,Re,sRe,Mi,Fa,sFa,So,sSo,La,sLa,Si};
    int ztb(int k){
        switch(k){
            case 0:{
                return -1;
            }
            case 1:{
                return 0;
            }
            case 2:{
                return 2;
            }
            case 3:{
                return 4;
            }
            case 4:{
                return 5;
            }
            case 5:{
                return 7;
            }
            case 6:{
                return 9;
            }
            case 7:{
                return 11;
            }
        }
    }
    bool bp(music m){
        if(m.a>0){
            while(m.a--){
                m.m*=2;
            }
        }else{
            while(m.a++){
                m.m/=2;
            }
        }
        
        if(m.m>=100&&m.m<=3000){
            Beep(m.m,V);
            return 1;
        }
        return 0;
    }
    music bp(string s,int t){
        int c1,c2=0;
        double t2=1;
        int p=s.find("%");
        for(int i=0;i<((p==-1)?s.size():p);i++){
            if(s[i]<'8'&&s[i]>='0'){
                c1=s[i]-'0';
            }
        }
        if(debug)cout<<c1<<' ';
        c1=ztb(c1);
        if(debug)cout<<c1<<' ';
        for(int i=0;i<((p==-1)?s.size():p);i++){
            if(s[i]=='#'){
                c1++;
            }
            if(s[i]=='b'){
                c1--;
            }
            if(s[i]=='+'){
                c2++;
            }
            if(s[i]=='-'){
                c2--;
            }
        }
        stringstream ss;
        if(p!=-1){
            int end=s.size()-p-1;
            if(s[end+1]=='.'){
                end++;
                while(s[end]>='0'&&s[end]<='9'){
                    end++;
                }
                end--;
            }
            ss<<s.substr(p+1,end);
            ss>>t2;
        }
        if(c1==-1){
            if(debug)cout<<"休止 ";
            return {0,0};
        }
        else if(debug)cout<<t2<<' ';
        while(c1<0){
            c1+=12;
            c2--;
        }
        while(c1>11){
            c1-=12;
            c2++;
        }
    //    cout<<b_m[c1]<<" "<<t*t2<<" "<<c2;
        return {b_m[c1],c2};
    }
    int score,lianji;
    vector<music>Ms;
    void bps(string s){
        int a;
        while((a=s.find("/"))!=-1){
            Ms.push_back(bp(s.substr(0,a),0));
            s=s.substr(a+1,s.size()-a);
        }
        Ms.push_back(bp(s,0));
    }
    void cursor(bool visible) { //控制光标函数
        CONSOLE_CURSOR_INFO CursorInfo;
        GetConsoleCursorInfo(GSH, &CursorInfo);
        CursorInfo.bVisible = visible;
        SetConsoleCursorInfo(GSH, &CursorInfo);
    }
    void nofastedit() { //关闭快速编辑
        HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
        DWORD mode;
        GetConsoleMode(hStdin, &mode);
        mode &= ~ENABLE_QUICK_EDIT_MODE;
        mode &= ~ENABLE_INSERT_MODE;
        mode &= ~ENABLE_MOUSE_INPUT;
        SetConsoleMode(hStdin, mode);
    }
}
string MUSIC_STRING;
vector<music>MPRE;
void sinit(){
    while(block.size()){
        block.pop_back();
    }
    bps(MUSIC_STRING);
    for(int i=0;i<Ms.size();i++){
        block.push_back({0,0,0,0,0});
        block[i].y=-i*5;
        do{
            block[i].x=rand()%4;
        }while(block[i].x==block[i-1].x);
        block[i].r=Ms[i].m?1:0;
        block[i].h=Ms[i].a;
        block[i].m=Ms[i].m;
    }
}
void do_sth(){
    char ch=-1;bool flag=1;
    if(kbhit()){
        flag=0;
        ch=getch();
    }
    
    for(int i=0;i<block.size();i++){
        int&y=++block[i].y;
        int&x=block[i].x;
        int&h=block[i].h;
        int&r=block[i].r;
        int&m=block[i].m;
        if(r==0||y>40||y<-10){
            if(y>40&&r==1){
                score-=100;
                lianji=0;
                r=0;
            }
            continue;
        }
        if(y!=28){
            Line_render(x*5,y,5,0);
        }else{
            Line_render(x*5,y,5,0,0xc);
        }
        if(y!=33){
            Line_render(x*5,y-5,5,15);
        }else{
            Line_render(x*5,y-5,5,15,0xc);
        }
        bool Click_up=0;
        switch(ch){
            case '3':{
                if(x==0){
                    Click_up=1;
                }
                break;
            }
            case '4':{
                if(x==1){
                    Click_up=1;
                }
                break;
            }
            case '5':{
                if(x==2){
                    Click_up=1;
                }
                break;
            }
            case '6':{
                if(x==3){
                    Click_up=1;
                }
                break;
            }
        }
        if(Click_up&&y>=28&&y-4<=28){
            flag=1;
            if(r!=0){
                score+=100;
                if(y-2==28||y-3==28){
                    score+=100;
                }
                score+=(++lianji);
            }
            r=0;
            MPRE.push_back({m,h});
            for(int i=0;i>-5;i--){
                Line_render(x*5,y+i,5,15);
            }
            Line_render(x*5,28,5,15,0xc);
        }
    }
    if(flag==0){
        lianji=0;
        score-=100;
    }
}

void* Sings(void *arg){
    /*
    int ptr=0;
    while(1){
        if(MPRE.size()>ptr){
            bp(MPRE[ptr++]);
        }
    }
    */
}
string music_strings[10]{
    "3/0/0/0/0/0/0/0/0/0/0/0/0/1/2/1/3/0/0/0/0/0/0"
    "/0/0/0/0/1/2/1/2/3/6-/0/0/1/6-/0/0/1/6-/0/0/1/2/0/1/0/7-/0"
    "/0/0/0/0/0/0/0/0/0/0/0/0/0/0/3/0/0/0/0/0/0/0/0/0/0/0/0/1/2"
    "/1/3/0/0/0/0/0/0/0/0/0/0/1/2/1/2/3/6-/0/0/1/6-/0/0/1/6-/0/"
    "0/1/2/0/1/0/7-/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/6-/1/6/0/0/6/"
    "6/5/6/0/6/5/6/5/6/5/3/3/0/0/0/0/0/0/0/0/0/0/0/0/6-/1/6/0/0"
    "/6/6/5/6/5/7/0/0/7/7/6/7/0/0/6/0/3/0/0/0/0/0/0/0/0/0/3/5/3"
    "/2/0/0/3/2/0/0/3/2/0/0/3/5/3/5/3/2/0/0/3/2/0/0/3/2/0/0/0/0"
    "/0/1/2/3/0/6-/0/1/0/3/0/2/0/0/3/2/1/1/0/6-/0/0/0/0/0/0/0/0"
    "/0/0/0/0/0/6/7/1+/2+/7/1+/1+/0/1+/7/1+/2+/7/1+/1+/0/1+/2+/"
    "3+/2+/3+/2+/3+/0/3+/2+/3+/0/5+/0/3+/0/6/7/1+/2+/7/1+/1+/0/"
    "1+/7/1+/2+/7/1+/1+/0/1+/2+/3+/2+/3+/2+/3+/0/3+/2+/3+/0/5+/"
    "0/3+/0/5+/0/3+/0/0/5+/3+/0/0/5+/3+/5+/6+/3+/5+/0/5+/0/3+/0"
    "/0/5+/3+/0/0/5+/3+/5+/6+/3+/5+/0/5+/5+/3+/2+/2+/0/2+/0/1+/"
    "3+/0/2+/2+/0/2+/0/1+/1+/6/0/0/0/0/0/0/0/0/0/0/0/0/0/5+/5+/"
    "3+/2+/2+/0/2+/0/1+/3+/0/2+/2+/0/2+/0/1+/1+/6/0/0/0/0/0/0/0"
    "/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/6/5/6/0/0/5/6"
    "/5/6/5/6/0/6/5/6/5/6/5/3/3/0/0/0/0/0/0/0/0/0/0/0/0/6/5/6/0"
    "/0/5/6/5/6/5/7/0/0/7/7/6/7/6/3/3/0/0/0/0/0/0/0/0/0/0/0/3/5"
    "/3/2/0/0/3/2/0/0/3/2/0/0/3/5/3/5/3/2/0/0/3/2/0/0/3/2/0/0/0"
    "/0/0/1/2/3/0/6/0/1+/0/3+/0/2+/0/0/3+/2+/1+/1+/0/6/0/0/0/0/"
    "0/0/0/0/0/0/0/0/0/6/7/1+/2+/7/1+/1+/0/1+/7/1+/2+/7/1+/1+/0"
    "/1+/2+/3+/2+/3+/2+/3+/0/3+/2+/3+/0/5+/0/3+/0/6/7/1+/2+/7/1"
    "+/1+/0/1+/7/1+/2+/7/1+/1+/0/1+/2+/3+/2+/3+/2+/3+/0/3+/2+/3"
    "+/0/5+/0/3+/0/5+/0/3+/0/0/5+/3+/0/0/5+/3+/5+/6+/3+/5+/0/5+"
    "/0/3+/0/0/5+/3+/0/0/5+/3+/5+/6+/3+/5+/0/5+/5+/3+/2+/2+/0/2"
    "+/0/1+/3+/0/2+/2+/0/2+/0/1+/1+/6/0/0/0/0/0/0/0/0/0/0/0/0/0"
    "/5+/5+/3+/2+/2+/0/2+/0/1+/3+/0/2+/2+/0/2+/0/1+/1+/6/0/0/0/"
    "0/0/0/0/0/0/0/0/0/0/6-/0/1/0/3/0/7-/0/0/0/7-/0/7-/7-/6-/6-"
    "/0/0/0/0/0/0/0/0/0/0/0/0/0/0/6-/0/1/0/3/0/7-/0/0/0/7-/0/7-"
    "/7-/6-/6-/0/0/0/0/0/0/0/0/0/0/0/0/0/0/6/7/1+/2+/7/1+/1+/0/"
    "1+/7/1+/2+/7/1+/1+/0/1+/2+/3+/2+/3+/2+/3+/0/3+/2+/3+/0/5+/"
    "0/3+/0/6/7/1+/2+/7/1+/1+/0/1+/7/1+/2+/7/1+/1+/0/1+/2+/3+/2"
    "+/3+/2+/3+/0/3+/2+/3+/0/5+/0/3+/0/5+/0/3+/0/0/5+/3+/0/0/5+"
    "/3+/5+/6+/3+/5+/0/5+/0/3+/0/0/5+/3+/0/0/5+/3+/5+/6+/3+/5+/"
    "0/5+/5+/3+/2+/2+/0/2+/0/1+/3+/0/2+/2+/0/2+/0/1+/1+/6/0/0/0"
    "/0/0/0/0/0/0/0/0/0/0/5+/5+/3+/2+/2+/0/2+/0/1+/3+/0/2+/2+/0"
    "/2+/0/1+/1+/6/0/0/0/0/0/0/0/0/0/0/0/0/0",
    
    "1/1/5/5/6/6/5/0/4/4/3/3/2/2/1/0/5/5/4/4/3/3/2/0/5/5/4/4/3/"
    "3/2/0/1/1/5/5/6/6/5/0/4/4/3/3/2/2/1/0/0/0/1/3/5/3/6/4/5/3/"
    "4/2/3/1/1/7-/1/1-/1/3/5/3/6/4/5/3/4/2+/3/1+/2/7/1+/1/5/3+"
    "/4/2+/3/1+/2/7/5/3+/4/2+/3/1+/#1+/2+/7/5/1/3/5/3/6/4/5/3+"
    "/4/2+/3/1+/2/7/1+/0/0/0/1/b3/5/b3/b6/4/5/b3/4/2/b3/1/1/7-/"
    "1/1-/1/b3/5/b3/b6/4/5/b3/4/2+/b3/1+/2/7/1+/1/5/b3+/4/2+/b3"
    "/b3+/2+/5/5/b3/4/2/b3/1/2/7-/1/b3/5/b3/b6/4/5/b3/4/2/b3/1/"
    "2/7-/1/0/0/0/1/1/5/5/6/6/5/0/4/4/3/3/2/2/1/0/5/5/4/4/3/3/2"
    "/0/5/5/4/4/3/3/2/0/1/1/5/5/6/6/5/0/4/4/3/3/2/2/1/0",
    
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    "1/1/2/3/1/3/2/5-/1/1/2/3/1/0/7-/5-/1/1/2/3/4/3/2/1/7-/5-/6"
    "-/7-/1/0/1/0/0/0/0/0/0/0/0/0/"
    ,
};
int main(){
    int k;
    cout<<"关卡1:孤勇者\n";
    cout<<"关卡2:小星星\n";
    cout<<"关卡3:扬基歌\n";
    cout<<"请输入关卡:";
    cin>>k;
    MUSIC_STRING=music_strings[k-1];;
    system("cls");
    pthread_create(NULL, NULL, Sings, NULL);
    nofastedit();
    srand(time(0));
    system("color fc");
    SC("size",28,36);
    cursor(0);
    sinit();
    Line_render(0,28,20,0xf,0xc);
    while(block.size()&&block[block.size()-1].y<35){
        if(k==1){
            Sleep(30);
        }else if(k==2){
            Sleep(50);
        }else if(k==3){
            if(block[40].y<0){
                Sleep(50);
            }else if(block[80].y<0){
                Sleep(40);
            }else if(block[120].y<0){
                Sleep(35);
            }else if(block[160].y<0){
                Sleep(30);
            }else if(block[200].y<0){
                Sleep(25);
            }else if(block[240].y<0){
                Sleep(20);
            }else if(block[280].y<0){
                Sleep(15);
            }else if(block[320].y<0){
                Sleep(10);
            }
        }
        
          do_sth();
          SC("color",0,15);
        gotoxy(21,0);
        cout<<score<<"     ";
        gotoxy(21,3);
        cout<<lianji<<"    ";
    }
    exit();
}

当黑色钢琴块碰到下面的红线后点击3、4、5、6即可消除

第三关会让你怀疑人生!

第一关孤勇者我打了69940分,How about you?


0
已采纳
王海成
王海成
初级天翼
初级天翼

-117852的战绩见过吗

为什么没有音乐啊

0
薛乘志
薛乘志
初级启示者
初级启示者

看着不错哎

希望支持linux,不然我打不开

我要回答