Beat BIT

· · 个人记录

//转自:https://www.luogu.com.cn/user/364963
//转自:https://www.luogu.com.cn/user/428154
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;

namespace GB {
    #define keydown(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
    #define downL ((GetAsyncKeyState(VK_LBUTTON) & 0x8000) ? 1:0)
    #define downR ((GetAsyncKeyState(VK_RBUTTON) & 0x8000) ? 1:0)
    #define Get GetStdHandle(STD_OUTPUT_HANDLE)
    #define color(a) SetConsoleTextAttribute(Get,a)
    #define pgrey 7
    #define pblue 9
    #define pgreen 10
    #define pred 12
    #define pyellow 14
    #define pwhite 15
    #define iv inline void
    #define ib inline bool
    #define ii inline int
    #define rep(i,a,b) for(int i=(a); i<=(b); ++i)
    #define rrep(i,a,b) for(int i=(a); i>=(b); --i)
    inline char DtoHsu(int x) {return x<10?x^48:(x-9)^96;}  //dec to hex (single and unsigned)
    inline string DtoHu(int x) {string ret="00"; ret[0]=DtoHsu(x>>4), ret[1]=DtoHsu(x&15); return ret;}
    inline string DtoH(int x) {return x<0?DtoHu(x+256):DtoHu(x);}
    iv getxy(int &x, int &y) {
        POINT pt;
        HWND hwnd=GetForegroundWindow();
        GetCursorPos(&pt), ScreenToClient(hwnd,&pt);
        x=pt.y/16+1, y=pt.x/8+1;
    }
    iv mouse(int a) {
        HANDLE handle=Get;
        CONSOLE_CURSOR_INFO CursorInfo;
        GetConsoleCursorInfo(handle,&CursorInfo);
        CursorInfo.bVisible=a;
        SetConsoleCursorInfo(handle,&CursorInfo);
    }
    iv goxy(int x, int y) {
        COORD position = { y-1, x-1 };
        HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hOut, position);
    }

    inline string freads(FILE *in) {
        string res=""; char c;
        while(!isalnum(c=fgetc(in))) ;
        while(isalnum(c)) res+=c, c=fgetc(in);
        return res;
    }
    ii fread(FILE *in) {
        int t=0, f=1; char c;
        while(!isdigit(c=fgetc(in))) f=c^45;
        while(isdigit(c)) t=t*10+(c^48), c=fgetc(in);
        return t;
    }
    iv fwrites(string s, FILE *in) {
        for(int i=0; s[i]; ++i) fputc(s[i], in);
    }
    iv writes(string s) {
        for(int i=0; s[i]; ++i) putchar(s[i]);
    }
    iv print(int c, string s) {
        color(c), writes(s), color(15);
    }
    inline string iturns(int x, int len) {
        string res="";
        if(x==0) res="0";
        while(x) res=char(x%10+48)+res, x/=10;
        while(res.size()<len) res+=' ';
        return res;
    }
    inline string cturns(char c, int len) {
        string res="";
        while(res.size()<len) res+=c;
        return res;
    }
    inline string sdown(string s) {
        for(int i=0; s[i]; ++i) if(isupper(s[i])) s[i]=tolower(s[i]);
        return s;
    }

    struct button {
        int u, d, l, r;
        button() {
            l=r=u=d=0;
        }
        button(int u, int d, int l, int r):
            u(u), d(d), l(l), r(r) {}
    };
    ii button_check(button q[], int siz, int px, int py) {
        for(int i=1; i<=siz; ++i) if(px>=q[i].u&&px<=q[i].d&&py>=q[i].l&&py<=q[i].r) return i;
        return -1;
    }
    iv sleep(int t) {
        t/=100;
        while(t--) {
            if(keydown(32)) return;
            Sleep(90);
        }
    }
}
using namespace GB;

namespace BT {

    const int col[8]={0, pblue, pred, 13, pgreen, 11, 14, 15};
    const int MNLEN=28, typsiz=20;
    int LEN;

    int type[20];
    int retik;
    int nxttyp;
    int px=19, py=10;

    string bat;
    int pbat=0;

    ii back(int a) {
        return a%LEN;
    }

    iv show() {
        goxy(px, py-2);
        for(int p=pbat-2, c=-2; c<=MNLEN; c++, p++) {
            p=back(p);
            print(col[c<retik? 0: (bat[p]^48)]*16, " ");
        }
        goxy(px-1, py), print(pyellow, "||");
        goxy(px, py), print(pyellow+col[0<retik? 0: (bat[pbat]^48)]*16, "|");
        print(pyellow+col[1<retik? 0: (bat[pbat+1]^48)]*16, "|");
        goxy(px+1, py), print(pyellow, "||");
    }

    iv update_nxt(int tapd) {
        retik=0;
        for(int p=pbat, c=0; ; ++c, ++p) {
            p=back(p);
            if(c>tapd+1&&bat[p]!=48) {
                nxttyp=bat[p]^48;
                break;
            }
            retik++;
        }
    }

    iv init(string baat) {
        string add="";
        bat="";
        for(int i=0; baat[i]; ++i) add+=baat[i], add+=baat[i];
        do bat+=add, LEN=bat.size(); while(LEN<MNLEN);
        pbat=0, update_nxt(-2);
    }

    bool music=0;
    ii tap(int typ) {   //此处,上传按下的键 
        typ=type[typ];
        if(music) cout<<(char)7;
        int res=666;
        if((typ&nxttyp)!=0 && retik>=-2 && retik<=2) {
            res=retik;
//          goxy(px, py+retik), print(col[0], "  ");
            update_nxt(res);
        }
        goxy(px-1, py-2);
        if(res==666) {
            print(pred, "F"), sleep(1000);
            return -1;
        } else if(res==0) {
            print(pyellow, "P");
            return 0;
        } else {
            print(pblue, "G");
            return res>=-1&&res<=1? 1:2;
        }
    }

    ii drop() {
        retik--, pbat++, pbat=back(pbat);
        if(retik<-3) {
            goxy(px-1, py-2), print(pred, "F"), sleep(1000);
            return -1;
        }
        return 0;
    }

    iv test() {
        init("000100100200");

        px=19, py=10;
        type[0]=type[1]=type[3]=1, type[2]=2;
        int now=0, t=clock(), th=clock()-160;
        while(1) {
            if(clock()-t>=160) {
                t=clock(), show();
                if(drop()==-1) break;
            }
            if(clock()-th>=160) {
                if(keydown('W')) now=tap(0), th=clock();
                if(keydown('D')) now=tap(1), th=clock();
                if(keydown('S')) now=tap(2), th=clock();
                if(keydown('A')) now=tap(3), th=clock();
                if(now==-1) break;
            }
        }
    }

}

namespace MP {
    const int dx[]= {0, 1, 0, -1}, dy[]= {1, 0, -1, 0}, maxkind=3, maxmap=10, nowtype=7;
    const int ty_xy[BT::typsiz][2]= {{8, 38}, {9, 39}, {9, 38}, {9, 37}, {8, 37}, {8, 39}, {10, 38}};
    string prt[]= {"", "  ", "==", "[]", "LL", "RR", "  "};
    const string jump[]= {"/\\", ">>", "\\/", "<<"};
    const int bl_col[]= {0, 8*16, 8*16+7, 8*16+6, 8*16, 8*16, 8*16};
    const char ty_char[BT::typsiz]= {'W', 'D', 'S', 'A', 'Q', 'E', 'X'};
    int px=0, py=0, pdir=0, num_mp=1, deduct=5, nowj=1, score=50;
    double gamespeed=2;
    string cycle;

    struct Block {  //方块
        int kind, col;
        vector <int> data;
        Block (int kind, int col=pwhite): kind(kind), col(col) {}
        Block () {}
    };
    map <pair<int, int>, Block> pre_floor[maxmap], floor[maxmap];
    map <pair<int, int>, int> pre_door[maxmap][2], door[maxmap][2];

    iv PrintFloor(int cnt, int x, int y) {  //打印单个方块
        #define pcol(cl) ((cl>>4<<4)+BT::col[cl&15])
        goxy(cnt/7*2+4, cnt%7*4+8);
        if(floor[nowj].find(make_pair(x, y))==floor[nowj].end()) putchar(32), putchar(32);
        else {
            Block b2=floor[nowj][make_pair(x, y)];
            if(b2.kind==6) prt[6]=jump[(b2.data[0]-pdir+4)&3];
//          if(x==2 && y==5) goxy(22, 1), printf("%d\n", b2.data[0]), system("pause");
            if(x==px && y==py) color(b2.col | pwhite), putchar(1), color(pcol(b2.col)), putchar(prt[b2.kind][1]), color(pwhite);
            else print(pcol(b2.col), prt[b2.kind]);
        }
    }
    iv PrintDoor(int opt, int cnt, int kind, int x, int y) {
//      if(opt==1) goxy(22, 1), printf("%d %d %d  \n", cnt, x, y), system("pause");
        opt==0 ? goxy(cnt/7*2+5, cnt%7*4+8) : goxy(cnt/6*2+4, cnt%6*4+10);
//      if(x==0 && y==0 && opt==1 && door[nowj][kind].find(make_pair(x, y))==door[nowj][kind].end()) cout<<cnt<<endl, system("pause");
        if(door[nowj][kind].find(make_pair(x, y))==door[nowj][kind].end()) putchar(32), putchar(32);
        else {
            int c2=door[nowj][kind][make_pair(x, y)];
            print(BT::col[7-c2]|8, opt==0 ? "==" : "||");
        }
    }
    iv PrintType(int typ) { //打印按键
        goxy(ty_xy[typ][0], ty_xy[typ][1]), color((BT::col[BT::type[typ]])^(keydown(ty_char[typ])<<3)), putchar(ty_char[typ]), color(15);
    }
    iv PrintScore() {   //打印分数
        goxy(5, 37), printf("%d ", score);
    }
    iv PrintMap() { //打印地图
        int cnt=0;
        switch (pdir) {
            case 0: {
                rrep(j, 3, -3) rep(i, -3, 3) PrintFloor(cnt++, px+i, py+j); cnt=0;
                rrep(j, 2, -3) rep(i, -3, 3) PrintDoor(0, cnt++, 0, px+i, py+j); cnt=0;
                rrep(j, 3, -3) rep(i, -3, 2) PrintDoor(1, cnt++, 1, px+i, py+j);
                break;
            }
            case 1: {
                rrep(i, 3, -3) rrep(j, 3, -3) PrintFloor(cnt++, px+i, py+j); cnt=0;
                rrep(i, 2, -3) rrep(j, 3, -3) PrintDoor(0, cnt++, 1, px+i, py+j); cnt=0;
                rrep(i, 3, -3) rrep(j, 2, -3) PrintDoor(1, cnt++, 0, px+i, py+j);
                break;
            }
            case 2: {
                rep(j, -3, 3) rrep(i, 3, -3) PrintFloor(cnt++, px+i, py+j); cnt=0;
                rep(j, -3, 2) rrep(i, 3, -3) PrintDoor(0, cnt++, 0, px+i, py+j); cnt=0;
                rep(j, -3, 3) rrep(i, 2, -3) PrintDoor(1, cnt++, 1, px+i, py+j);
                break;
            }
            case 3: {
                rep(i, -3, 3) rep(j, -3, 3) PrintFloor(cnt++, px+i, py+j); cnt=0;
                rep(i, -3, 2) rep(j, -3, 3) PrintDoor(0, cnt++, 1, px+i, py+j); cnt=0;
                rep(i, -3, 3) rep(j, -3, 2) PrintDoor(1, cnt++, 0, px+i, py+j);
                break;
            }
        }
    }
    iv InitMap() {  //初始化地图
        system("cls");
        goxy(1, 1);
        puts("");
        puts("  o======================================o");
        puts("  |   ---------------------------        |");
        puts("  |  | X   X   X   X   X   X   X | score |");
        puts("  |  |                           |  ???  |");
        puts("  |  | X   O   O   O   O   O   X |       |");
        puts("  |  |                           |       |");
        puts("  |  | X   O   O   O   O   O   X |  QWE  |");
        puts("  |  |                           |  ASD  |");
        puts("  |  | X   O   O   @   O   O   X |   X   |");
        puts("  |  |                           |       |");
        puts("  |  | X   O   O   O   O   O   X |       |");
        puts("  |  |                           |       |");
      printf("  |  | X   O   O   O   O   O   X |   %c   |\n", 2);
        puts("  |  |                           |       |");
        puts("  |  | X   X   X   X   X   X   X |       |");
        puts("  |   ---------------------------        |");
        puts("  |                                      |");
        puts("  |       mcgc                           |");
        puts("  |                                      |");
        puts("  o======================================o");
        PrintMap();
        PrintScore();
        rep(i, 0, 6) PrintType(i);
    }
    ib load(string s) { //加载地图种子
        #define Lchecks(i) (i+1<=len && isdigit(s[i])||s[i]>='a'&&s[i]<='f')
        #define Lcheck(i) (Lchecks(i)&&Lchecks(i+1))
        #define Lgetsu(i) (isdigit(s[i])?s[i]^48:(s[i]^96)+9)
        #define Lgetu(i) ((Lgetsu(i)<<4)+Lgetsu(i+1))
        #define Lget(i) (Lgetu(i)-(Lgetu(i)<128?0:256))
        goxy(21, 1), puts("loading...");
        int len=s.size(), i=0;
        if(!Lcheck(i)) return 0;    //地图速度,循环节长度,循环节 
        gamespeed=Lgetu(i)/16.0, i+=2;
        if(!Lcheck(i)) return 0;
        int lenc=Lgetu(i); i+=2;
        if(i+lenc>s.size()) return 0;
        rep(di, 0, lenc-1) if(!Lchecks(i)) return 0;
        cycle.assign(s, i, lenc), i+=lenc;

        if(!Lcheck(i)) return 0;    //扣分值
        deduct=Lgetu(i), i+=2;

        rep(j, 0, 7) {  //按键种类
            if(!Lchecks(i)) return 0;
            BT::type[j]=Lgetsu(i), ++i;
        }

        if(!Lcheck(i)) return 0;    //地图数量,地图 
        num_mp=Lgetu(i), i+=2;
        rep(j, 1, num_mp) pre_floor[j].clear(), pre_door[j][0].clear(), pre_door[j][1].clear();
//      puts("1");
        rep(j, 1, num_mp) {
            if(!Lcheck(i) || !Lcheck(i+2) || !Lcheck(i+4) || !Lcheck(i+6)) return 0;
            int n=Lgetu(i), m=Lgetu(i+2), sx=Lget(i+4), sy=Lget(i+6), tmp=0;
            i+=8;
            while(tmp<n*m) {
                if(!Lchecks(i)) return 0;
                int opt=Lgetsu(i); ++i;
                if(opt==0) {if(!Lcheck(i)) return 0; int cnt=Lgetu(i); i+=2, tmp+=cnt;}
                else {
                    int nx=tmp%m, ny=tmp/m;
                    pair <int, int> pxy=make_pair(nx-sx, ny-sy);
                    if(opt>=1 && opt<=3) {
                        Block b2(opt, bl_col[opt]);
                        pre_floor[j][pxy]=b2;
                    } else if(opt==4 || opt==5) {
                        if(!Lchecks(i)) return 0;
                        int col=Lgetsu(i); ++i;
                        if(col>7) return 0;
                        Block b2(opt, bl_col[opt]+col);
                        pre_floor[j][pxy]=b2;
                    } else if(opt==6) {
                        if(!Lchecks(i) && !Lchecks(i+1)) return 0;
                        int col=Lgetsu(i), dir=Lgetsu(i+1); i+=2;
                        if(col>7 || dir>3) return 0;
//                      if(nx==2 && ny==5) printf("%d %d\n", col, dir), system("pause");
                        Block b2(6, bl_col[5]+col);
                        b2.data.push_back(dir);
                        pre_floor[j][pxy]=b2;
                    } else return 0;
                    ++tmp;
                }
            }
//          printf("%d\n", n*m);
//          puts("3");
            tmp=0;
            while(tmp<(n-1)*m) {
//              puts("while 1");
                if(!Lchecks(i)) return 0;
                int opt=Lgetsu(i); ++i;
                if(opt==0) {if(!Lcheck(i)) return 0; int cnt=Lgetu(i); i+=2, tmp+=cnt;}
                else {
                    int nx=tmp%m, ny=tmp/m;
                    if(opt>=1 && opt<=7) pre_door[j][0][make_pair(nx-sx, ny-sy)]=opt;
                    ++tmp;
                }
            }
            tmp=0;
//          puts("4");
            while(tmp<n*(m-1)) {
                if(!Lchecks(i)) return 0;
                int opt=Lgetsu(i);
                ++i;
                if(opt==0) {if(!Lcheck(i)) return 0; int cnt=Lgetu(i); i+=2, tmp+=cnt;}
                else {
                    int nx=tmp%(m-1), ny=tmp/(m-1);
                    if(opt>=1 && opt<=7) pre_door[j][1][make_pair(nx-sx, ny-sy)]=opt;
                    ++tmp;
                }
            }
        }
//      puts("5");
        if(i!=len) return 0;
        BT::init(cycle);
        return 1;
    }
    ii leave(int x, int y) {    //离开..时的交互
        pair <int, int> pxy=make_pair(x, y);
        if(floor[nowj].find(pxy)==floor[nowj].end()) return 0;
        int kind=floor[nowj][pxy].kind;
        if(kind==2) {
            floor[nowj].erase(pxy);
        } else if(kind==4 || kind==5 || kind==6) {
            Block b2=floor[nowj][pxy];
            BT::type[kind]-=b2.data.back(), b2.data.pop_back(), floor[nowj][pxy]=b2;
        }
        return 0;
    }
    ii from_to(int xf, int yf, int xt, int yt, int thistik) {   //从..移动到..时的交互
        int xft=xf+xt>>1, yft=yf+yt>>1, kind=(xf==xt?0:1), typ=BT::type[thistik];
        if(door[nowj][kind].find(make_pair(xft, yft))!=door[nowj][kind].end()) {
            int c2=door[nowj][kind][make_pair(xft, yft)];
            goxy(22, 1);
            if((typ&c2)==typ) return -1;
        }
        return 0;//...
    }
    ii reach(int x, int y) {    //到达..时的交互
        pair <int, int> pxy=make_pair(x, y);
        if(floor[nowj].find(pxy)==floor[nowj].end()) return -1;
        int kind=floor[nowj][pxy].kind;
        if(kind==3) {
            score+=100;
            return -1;
        } else if(kind==4 || kind==5 || kind==6) {
            Block b2=floor[nowj][pxy];
            int typk=BT::type[kind], dtyp=(BT::type[kind]|b2.col-bl_col[kind])-BT::type[kind];
            BT::type[kind]+=dtyp, b2.data.push_back(dtyp), floor[nowj][pxy]=b2;
        } else return 0;
    }
    ii move(int kind) { //移动
        if(kind>=0 && kind<=3) {
            int Mdir=pdir+kind&3;
            if(from_to(px, py, px+dx[Mdir], py+dy[Mdir], kind)==-1) return -1;
            if(leave(px, py)==-1) return -1;
            px+=dx[Mdir], py+=dy[Mdir];
            if(reach(px, py)==-1) return -1;
            PrintMap();
        } else if(kind>=4 && kind<=5) {
            kind==4?--pdir:++pdir;
            pdir=pdir+4&3;
            PrintMap();
        } else if(kind==6) {
//          goxy(22, 1), puts("1");
            if(floor[nowj].find(make_pair(px, py))==floor[nowj].end()) return -1;
            Block b2=floor[nowj][make_pair(px, py)];
//          puts("1.5");
            if(b2.kind==6) {
//              puts("2");
                int dir=b2.data[0];
//              puts("3");
                rep(t, 0, 1) if(from_to(px+t*dx[dir], py+t*dy[dir], px+(t+1)*dx[dir], py+(t+1)*dy[dir], kind)==-1) return -1;
//              puts("4");
                if(leave(px, py)==-1) return -1;
                px+=2*dx[dir], py+=2*dy[dir];
//              puts("5");
                if(reach(px, py)==-1) return -1;
                PrintMap();
            } else return -1;
        }
//      if(kind==6) goxy(22, 1), system("pause");
        return 0;
    }
    iv init() { //初始化
        rep(j, 1, num_mp) floor[j]=pre_floor[j], door[j][0]=pre_door[j][0], door[j][1]=pre_door[j][1];
        px=py=0, pdir=0, nowj=1;
    }
    iv talk(int p) {
        switch(p) {
            case 0: {
                goxy(11, 36), print(pyellow, "跟节拍"); 
                goxy(12, 36), print(pyellow, "按adws");
                goxy(13, 36), print(pyellow, "移动到"); 
                goxy(14, 36), print(pyellow, "终点[]");
                break;
            }
            case 1: {
                goxy(11, 36), print(pyellow, "加油!");
                break;
            }
        }
    }
    ii main(int p) {
        int stik=1000/gamespeed;
        score=100;
        InitMap();
        talk(p);
        goxy(19, 10), print(pyellow, "输入S以开始");
        while(1) if(keydown('S')) break;
        BT::show();
        sleep(200);
        reach(0, 0);
        clock_t tim=clock();
        int b=-1;
        while(1) {
            if(BT::drop()==-1) break;
            BT::show();
            PrintScore();
            int thistik=-1;
            while(clock()-tim<=stik) {  //循环到过了一个 tik
                if(b!=-1 && !keydown(ty_char[b])) b=-1;
                if(b==-1)
                    rep(typ, 0, nowtype-1) if(keydown(ty_char[typ])) b=thistik=typ;
                rep(typ, 0, nowtype-1) PrintType(typ);
                if(keydown('P')) {
                    system("mode con cols=60 lines=22");
                    InitMap(), talk(p), BT::show();
                    goxy(3, 47), print(pyellow, "已暂停");
                    goxy(6, 47), print(pwhite, "1:继续");
                    goxy(8, 47), print(pwhite, "2:退出");
                    goxy(10, 47), print(pwhite, "3:重来");
                    int ret=-1;
                    while(1) {
                        if(keydown('1')) break;
                        if(keydown('2')) {ret=233; break;}
                        if(keydown('3')) {ret=666; break;}
                    }
                    system("mode con cols=44 lines=22");
                    InitMap(), talk(p), BT::show();
                    if(ret!=-1) return ret;
                }
            }
            tim=clock();
            if(thistik!=-1) {
                int ret=BT::tap(thistik);
                if(ret==-1) break;  //炸掉了
                score-=ret*deduct;
                if(score<=0) break; //分数太少
                if(move(thistik)==-1) break;
            }
        }
//      goxy(22, 1);
//      printf("%d", b);
//      system("pause");
//      PrintScore();
        PrintMap();
        tim=clock();
        while(clock()-tim>=2500) if(keydown('P')) break;
        score-=100;
        return score;
    }
    iv test() {
        string seed;
        cin>>seed;
        while(!load(seed)) puts("error!"), cin>>seed;
        init();
        system("cls");
        for(map <pair<int, int>, Block> :: iterator it=floor[1].begin(); it!=floor[1].end(); ++it) {
            printf("(%d, %d): %d\n", it->first.first, it->first.second, it->second.kind);
        }
        rep(t, 0, 1) {
            puts("");
            for(map <pair<int, int>, int> :: iterator it=door[1][t].begin(); it!=door[1][t].end(); ++it) {
                printf("(%d, %d): %d\n", it->first.first, it->first.second, it->second);
            }
        }
        system("pause");
        main(-1);
    }
}

namespace BS {

    const int totL=6, MXL=250;
    string mp[MXL]={
        "",
        "a01000001000100020000211210000010302000012210013004003",
        "a00c00010010020001112100000105050200002100120021110022213121100211001014014",
        "a00c0001001002000111210000010607040100222300321001100120012100112121222111211212002210012001023024",
        "a00c00010010020002112100000106030002002200162021262200120021002622300f00c",
        "a00c0001001002000211210000010c0301000012001621222262026202001222226212200162262062020012222220013001021018",
        "a00c0001001002000211210000010606030300241141152151001100111002152001200110011001300111100352001101e01e"
    };
    map<string, string> spmp;
    int score[MXL];
    bool opn[MXL]={0, 1};

    string diymp[4]={"", "NuLl", "NuLl", "NuLl"};
    string diykey[4]={"", "NuLl", "NuLl", "NuLl"};

    int wich[30][50], px, py, p;

    const int tipsiz=17;
    string tips[tipsiz+2]={
        "acbc!!!",
        "mcgc!!!",
        "no tip",
        "也许这个游戏可以在今年内做完?",
        "ITA:为什么我被插队了",
        "Beeeeeeeeeeeeeeeeeat!!",
        "ac特别喜欢bc",
        "我觉得有必要扩充一下tips",
        "算上这条, tips一共有"+iturns(tipsiz, 0)+"条",
        "acbc是BBIT世界中的唯一真理。",
        "不会真有人觉得tips里会有提示吧?(",
        "一定要把快速编辑模式给关掉!",
        "不要在显示 按S以开始 的时候干一些奇奇怪怪的事啊!",
        "为什么这个游戏是在愚人节开始做的呢?",
        "我个人感觉, 这游戏挺简单的--ztue",
        "这真的是一条为了写tip而写的tip",
        "《关于我什么都没干bug却自己好了的这档事儿》",
        "本游戏没有任何彩蛋, 真的"
    };

    iv special_map() {
        spmp["EZ"]="500c0001001002000110210000010705030000320015252415142415141424152414142525241415142415252424100230020056001560016560026655500260070076565001600160026600255005";
    }

    iv data_save() {
        FILE *fout=fopen("BBITdata.txt", "w");
        rep(i, 1, MXL) fwrites(iturns(score[i], 0)+' ', fout);
        fputc('\n', fout);
        rep(i, 0, MXL) fwrites(iturns(opn[i], 0)+' ', fout);
        fputc('\n', fout);
        rep(i, 1, 3) fwrites(diymp[i]+'\n', fout);
        rep(i, 1, 3) fwrites(diykey[i]+' ', fout);
        fclose(fout);
    }
    iv data_read() {
        FILE *fin;
        if(!(fin=fopen("BBITdata.txt", "r"))) data_save();
        fin=fopen("BBITdata.txt", "r");
        rep(i, 1, MXL) score[i]=fread(fin);
        rep(i, 0, MXL) opn[i]=fread(fin);
        rep(i, 1, 3) diymp[i]=freads(fin);
        rep(i, 1, 3) {
            diykey[i]=freads(fin);
            if(diykey[i]!="NuLl") spmp[diykey[i]]=diymp[i];
        }
        fclose(fin);
    }

    namespace DIY {

        const int prtsiz=12;
        const int front_col[prtsiz+2]= {0, 15, 0, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15};
        const int back_col[prtsiz+2]= {0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0};
        const bool hav_col[prtsiz+2]= {0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0};
        const bool out_map[prtsiz+2]= {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0};
        const string prt[prtsiz+2]= {"", "c ", "  ", "==", "[]", "LL", "RR", "==", "||", "<<", ">>", "/\\", "\\/"};

        const int col[8]={0, pblue, pred, 13, pgreen, 11, 14, 15};
        int pagesiz=ceil(1.0*prtsiz/5);
        int block[6];

        button bq[1000];
        int bqsiz;

        int wich[50][50];
        int tx[55], ty[55];
        int type_block[55]; //1 起点,2 普通,3 塌陷,4 终点,56 左右转,78 \,9abc 左右上下跳 
        int col_block[55];
        //1 2 3 4 5 6 7
        //8 9 a b c d e
        //...

        int owich[50][50];
        int otx[110], oty[110], outf[110];
        int type_o[110];    //123456 \,78 横竖门 
        int col_o[110];

        int de_score;
        double speed;
        int bat_len;    //速度;循环节长度
        int bat_col[20];    //循环节颜色,如 000100200100 从 1 开始 
        int key_col[20];    //以 qweasdx 的顺序的颜色 

        iv epty_map_show() {
            system("cls");
            puts("");
            puts("  o======================================o");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  o======================================o");
        } 

        iv block_show(int page, int chos) {
            goxy(19, 4), print(pyellow, page>1? "<-": "  ");
            goxy(19, 40), print(pyellow, page<pagesiz? "->": "  ");
            rep(i, 6, 10) bq[i]=button(0, 0, 0, 0);
            int bg=(page-1)*5, up=min(5, prtsiz-bg);
            bqsiz=5;
            rep(i, up+1, 5) goxy(19, i*8-2), print(0, "  ");
            rep(i, 1, 5) goxy(18, i*8-2), print(0, "  ");
            rep(i, 1, up) {
                goxy(19, i*8-2), print(front_col[bg+i]+back_col[bg+i]*16, prt[bg+i]);
                bq[++bqsiz]=button(19, 19, i*8-2, i*8-1), block[i]=bg+i;
                if(block[i]==chos) goxy(18, i*8-2), print(pgreen, "\\/");
            }
        }
        inline string seed_produce() {  //mcbc
//          goxy(22, 1);
//          rep(i, 1, 20) cout<<col_o[i]<<' ';
//          system("pause");
            string seed="";
            seed+=DtoHu((int) ceil(speed*16));
            seed+=DtoHu(bat_len);
//          rep(i, 1, 16) cout<<DtoHsu(bat_col[i])<<' ';
//          system("pause");
            rep(i, 1, bat_len) seed+=DtoHsu(bat_col[i]);
            seed+=DtoH(de_score);
            seed+=DtoHsu(key_col[2]); seed+=DtoHsu(key_col[6]); seed+=DtoHsu(key_col[5]); seed+=DtoHsu(key_col[4]);
            seed+=DtoHsu(key_col[1]); seed+=DtoHsu(key_col[3]); seed+=DtoHsu(key_col[7]); seed+='0';
            seed+="010707";
            int cnt=0;
            rep(tmp, 0, 48) if(type_block[tmp+1]==1) ++cnt, seed+=DtoHu(tmp%7), seed+=DtoHu(6-tmp/7);
            if(cnt!=1) return seed="error";
            #define checkcnt if(cnt!=0) seed+="0", seed+=DtoHu(cnt), cnt=0
            cnt=0;
            rep(tmp, 0, 48) {
                int tb=type_block[(6-tmp/7)*7+tmp%7+1], cb=col_block[(6-tmp/7)*7+tmp%7+1];
                if(tb==0) ++cnt;
                else {
//                  cout<<seed;
                    checkcnt;
//                  cout<<endl<<seed<<endl;
//                  system("pause");
                    if(tb==1) seed+="1";
                    else if(tb>=2 && tb<=4) seed+=DtoHsu(tb-1);
                    else if(tb>=5 && tb<=6) seed+=DtoHsu(tb-1), seed+=DtoHsu(cb);
                    else if(tb>=9 && tb<=12) {
                        seed+="6", seed+=DtoHsu(cb);
                        if(tb==9) seed+="3";
                        if(tb==10) seed+="1";
                        if(tb==11) seed+="0";
                        if(tb==12) seed+="2";
                    } else return seed="error and mcbc";
                }
            }
            checkcnt;
            rep(tmp, 0, 41) {
                int tmp2=tmp%7==6?(6-tmp/7)*13:(5-tmp/7)*13+tmp%7*2+2, to=type_o[tmp2], co=col_o[tmp2]^(to==0?0:7);
                if(to==0) ++cnt;
                else {
                    checkcnt;
                    if(to==7) seed+=DtoHsu(co);
                    else return seed="error and mcbc too";
                }
            }
            checkcnt;
            rep(tmp, 0, 41) {
                int tmp2=tmp<6?6*13+tmp+1:(6-tmp/6)*13+tmp%6*2+1, to=type_o[tmp2], co=col_o[tmp2]^(to==0?0:7);
                if(to==0) ++cnt;
                else {
                    checkcnt;
                    if(to==8) seed+=DtoHsu(co);
                    else return seed="error and mcbc three";
                }
            }
            checkcnt;
            return seed;
            #undef checkcnt
        }
        ib map_draw() {
            system("cls");
            puts("");
            puts("  o======================================o");
            puts("  |   ---------------------------        |");
            puts("  |  |                           |       |");
            puts("  |  |                           | 选择  |");
            puts("  |  |                           |颜色和 |");
            puts("  |  |                           |方块,  |");
            puts("  |  |                           |用左键 |");
            puts("  |  |                           |添加右 |");
            puts("  |  |                           |键删除 |");
            puts("  |  |                           |       |");
            puts("  |  |                           |       |");
            puts("  |  |                           |       |");
            puts("  |  |                           |       |");
            puts("  |  |                           |       |");
            puts("  |  |                           |       |");
            puts("  |   ---------------------------        |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  |                                      |");
            puts("  o======================================o");
            /*
            1-chos_red 2-chos_blue 3-chos-green
            4-last_page 5-next_page
            6~10 block
            */
            memset(wich, 0, sizeof(wich));
            goxy(1, 1), print(pred, "exit"), wich[1][1]=wich[1][2]=wich[1][3]=wich[1][4]=-1;
            goxy(1, 41), print(pgreen, "next"), wich[1][41]=wich[1][42]=wich[1][43]=wich[1][44]=-2;

            goxy(12, 37), print(pred*16, "   "), bq[1]=button(12, 12, 37, 39);
            goxy(14, 37), print(pblue*16, "   "), bq[2]=button(14, 14, 37, 39);
            goxy(16, 37), print(pgreen*16, "   "), bq[3]=button(16, 16, 37, 39);
            bq[4]=button(19, 19, 4, 5), bq[5]=button(19, 19, 40, 41);

            for(int x=4, cnt=0, ocnt=0; x<=16; x+=2) for(int y=8; y<=32; y+=4) {
                wich[x][y]=wich[x][y+1]=(++cnt), tx[cnt]=x, ty[cnt]=y, goxy(x, y), print(7*16, "  ");
                if(y!=32) owich[x][y+2]=owich[x][y+3]=++ocnt, otx[ocnt]=x, oty[ocnt]=y+2, outf[ocnt]=1;
                if(x!=16) owich[x+1][y]=owich[x+1][y+1]=++ocnt, otx[ocnt]=x+1, oty[ocnt]=y, outf[ocnt]=2;
            }

            int px, py, chos_block=1;
            int chos_col=0;
            int page=1, click;
            block_show(1, chos_block);

            int now=clock();
            while(1) if(clock()-now>100) {
                now=clock();
                if(downL) {
                    getxy(px, py);
//                  goxy(1, 5), print(pwhite, iturns(px, 2)+" "+iturns(py, 2));
                    click=button_check(bq, bqsiz, px, py);
//                  goxy(1, 20), print(pred, iturns(click, 0));
                    switch(click) {
                        case -1: {
                            break;
                        }
                        case 1: {
                            chos_col^=2, goxy(12, 37), print(((chos_col&2)? pgrey: pred)*16, "   ");
                            break;
                        }
                        case 2: {
                            chos_col^=1, goxy(14, 37), print(((chos_col&1)? pgrey: pblue)*16, "   ");
                            break;
                        }
                        case 3: {
                            chos_col^=4, goxy(16, 37), print(((chos_col&4)? pgrey: pgreen)*16, "   ");
                            break;
                        }
                        case 4: {
                            if(page>1) block_show(--page, chos_block);
                            break;
                        }
                        case 5: {
                            if(page<pagesiz) block_show(++page, chos_block);
                            break;
                        }
                        default: {
                            block_show(page, chos_block=block[click-5]);
                            break;
                        }
                    }
                    click=wich[px][py];
                    if(click==-1) return 0;
                    if(click==-2) return 1;
                    if(!out_map[chos_block]&&click>0) {
                        goxy(tx[click], ty[click]);
                        print((hav_col[chos_block]? front_col[chos_block]: (col[chos_col]? col[chos_col]: pgrey))+back_col[chos_block]*16, prt[chos_block]);
                        type_block[click]=chos_block, col_block[click]=chos_col;
                    }
                    click=owich[px][py];
                    if(out_map[chos_block]&&click>0) {
                        goxy(otx[click], oty[click]);
                        print((hav_col[chos_block]? front_col[chos_block]: (col[chos_col]? col[chos_col]: pgrey))+back_col[chos_block]*16, prt[chos_block]);
                        type_o[click]=chos_block, col_o[click]=chos_col;
                    }
                }
                if(downR) {
                    getxy(px, py);
                    click=wich[px][py];
                    if(click>0) {
                        goxy(tx[click], ty[click]), print(pgrey*16, "  ");
                        type_block[click]=0;
                    }
                    click=owich[px][py];
                    if(click>0) {
                        goxy(otx[click], oty[click]), print(0, "  ");
                        type_o[click]=0;
                    }
                }
            }
        }
    /*
---------------------------------------------
                                            |   --- 1
  o======================================o  |
  |                                      |  |
  |     QWE                              |  |   --- 4
  |     ASD       red   blu   gre        |  |
  |      X                               |  |
  |                                      |  |   --- 7
  |                                      |  |
  |                                      |  |
  |                                      |  |   --- 10
  |   [      1       2       3       ]   |  |
  |                                      |  |
  |                                      |  |   --- 13
  |                                      |  |
  |                                      |  |
  |                                      |  |   --- 16
  |                                      |  |
  |                                      |  |
  |                                      |  |   --- 19
  |                                      |  |
  o======================================o  |
                                            |   --- 22
---------------------------------------------
| |  |   |   |   |   |   |   |   |   |   |
1 3  6   10  14  18  22  26  30  34  38  42
     []      []      []      []      [] 

        page 1
            block
    */
        ib beat_draw() {
            int px, py;
            memset(wich, 0, sizeof(wich));

            bat_back:;
            epty_map_show();
            goxy(1, 1), print(pred, "exit"), wich[1][1]=wich[1][2]=wich[1][3]=wich[1][4]=-1;
            goxy(4, 12), print(pgreen, "请输入节拍循环的总长度");
            goxy(5, 12), print(pred, "范围4~16!");
            mouse(1), goxy(6, 12), cin>>bat_len, mouse(0);
            if(bat_len>16||bat_len<4) goto bat_back;

            speed_back:;
            epty_map_show();
            goxy(1, 1), print(pred, "exit"), wich[1][1]=wich[1][2]=wich[1][3]=wich[1][4]=-1;
            goxy(4, 12), print(pgreen, "请输入节拍的速度(一秒几个块)");
            goxy(5, 12), print(pred, "范围4~14");
            mouse(1), goxy(6, 12), cin>>speed, mouse(0);
            if(speed>14||speed<4) goto speed_back;

            scor_back:;
            epty_map_show();
            goxy(1, 1), print(pred, "exit"), wich[1][1]=wich[1][2]=wich[1][3]=wich[1][4]=-1;
            goxy(4, 12), print(pgreen, "请输入扣分值");
            goxy(5, 12), print(pred, "范围1~100");
            mouse(1), goxy(6, 12), cin>>de_score, mouse(0); 
            if(de_score<1||de_score>100) goto speed_back;

            epty_map_show();
            goxy(1, 1), print(pred, "exit"), wich[1][1]=wich[1][2]=wich[1][3]=wich[1][4]=-1;
            goxy(1, 41), print(pgreen, "next"), wich[1][41]=wich[1][42]=wich[1][43]=wich[1][44]=-2;

            int bat_cnt=0;
            goxy(11, 7);
            rep(i, 1, bat_len) print(pgrey*16, "  "), wich[11][5+i*2]=wich[11][6+i*2]=++bat_cnt;

            int chos_col=0, ktx[20], kty[20];
            string kc[20];
            goxy(5, 19), print(pred*16, "   "), bq[1]=button(5, 5, 19, 21);
            goxy(5, 25), print(pblue*16, "   "), bq[2]=button(5, 5, 25, 27);
            goxy(5, 31), print(pgreen*16, "   "), bq[3]=button(5, 5, 31, 33);
            goxy(4, 9), print(pgrey, kc[4]="Q"), bq[4]=button(ktx[4]=4, 4, kty[4]=9, 9);
            print(pgrey, kc[5]="W"), bq[5]=button(ktx[5]=4, 4, kty[5]=10, 10);
            print(pgrey, kc[6]="E"), bq[6]=button(ktx[6]=4, 4, kty[6]=11, 11);
            goxy(5, 9), print(pgrey, kc[7]="A"), bq[7]=button(ktx[7]=5, 5, kty[7]=9, 9);
            print(pgrey, kc[8]="S"), bq[8]=button(ktx[8]=5, 5, kty[8]=10, 10);
            print(pgrey, kc[9]="D"), bq[9]=button(ktx[9]=5, 5, kty[9]=11, 11);
            goxy(6, 10), print(pgrey, kc[10]="X"), bq[10]=button(ktx[10]=6, 6, kty[10]=10, 10);

            int now=clock(), click;
            while(1) if(clock()-now>100) {
                now=clock();
                if(downL) {
                    getxy(px, py);
                    click=button_check(bq, 10, px, py);
                    switch(click) {
                        case -1: {
                            break;
                        }
                        case 1: {
                            chos_col^=2, goxy(5, 19), print(((chos_col&2)? pgrey: pred)*16, "   ");
                            break;
                        }
                        case 2: {
                            chos_col^=1, goxy(5, 25), print(((chos_col&1)? pgrey: pblue)*16, "   ");
                            break;
                        }
                        case 3: {
                            chos_col^=4, goxy(5, 31), print(((chos_col&4)? pgrey: pgreen)*16, "   ");
                            break;
                        }
                        default: {
                            key_col[click-3]=chos_col;
                            goxy(ktx[click], kty[click]), print(col[chos_col]? col[chos_col]: pgrey, kc[click]);
                            break;
                        }
                    }
                    click=wich[px][py];
//                  goxy(22, 1), cout<<click;
                    if(click==-1) return 0;
                    if(click==-2) return 1;
                    if(click>0) {
                        bat_col[click]=chos_col;
                        goxy(11, 5+click*2), print((col[chos_col]? col[chos_col]: pgrey)*16, "  ");
                    }
                }
            }
        }

        iv DIY_clear() {
            bqsiz=0;
            memset(bat_col, 0, sizeof(bat_col)), memset(key_col, 0, sizeof(key_col));
            memset(type_o, 0, sizeof(type_o)), memset(col_o, 0, sizeof(col_o));
            memset(owich, 0, sizeof(owich)), memset(otx, 0, sizeof(otx)), memset(oty, 0, sizeof(oty));
            memset(type_block, 0, sizeof(type_block)), memset(col_block, 0, sizeof(col_block));
            memset(wich, 0, sizeof(wich)), memset(tx, 0, sizeof(tx)), memset(ty, 0, sizeof(ty));
        }
        inline string DIY_draw() {
            DIY_clear();
            if(!map_draw()) return "exit";
            if(!beat_draw()) return "exit";
            return seed_produce();
        }
    }

    iv DIY_map() {
        bool flag=1;
        int bqsiz;
        button bq[1000]={};
        string seed;
        while(flag) {
            system("cls");
            goxy(2, 12), print(pgreen, "输入种子(可输入钥匙码)"); 
            goxy(3, 12), print(pgreen, "输入draw进入地图编辑器");
            goxy(4, 12), print(pred, "输入exit以离开");
            goxy(5, 12), mouse(1), cin>>seed, mouse(0);
            if(seed=="draw") seed=DIY::DIY_draw();
            if(seed=="exit") return;
            if(spmp[seed].size()) seed=spmp[seed];
            if(MP::load(seed)) flag=0;
            else system("cls"), goxy(2, 16), print(pred, "输错了 :-("), sleep(1000);
        }
        start:;
        int scor;
        MP::load(seed), MP::init();
        system("cls"), print(pwhite, "tip:"+tips[rand()%tipsiz]), sleep(1000);
        system("cls"), scor=MP::main(-1), sleep(1000);
        system("cls");
        if(scor==233) return;
        if(scor==666) goto start;
        if(scor>=60) {
            goxy(2, 16), print(pyellow, "过关啦!"), sleep(1000);
            goxy(3, 16), print(pyellow, "分数 "+iturns(scor, 0));
            if(p>0)  score[p]=max(score[p], scor);
            goxy(4, 16), print(pgreen, "重来  返回  保存");
            bqsiz=0, bq[++bqsiz]=button(4, 4, 16, 19), bq[++bqsiz]=button(4, 4, 22, 25), bq[++bqsiz]=button(4, 4, 28, 31);
        } else {
            goxy(2, 16), print(pyellow, "失败了!"), sleep(1000);
            goxy(3, 16), print(pgreen, "重来  返回  保存");
            bqsiz=0, bq[++bqsiz]=button(3, 3, 16, 19), bq[++bqsiz]=button(3, 3, 22, 25), bq[++bqsiz]=button(3, 3, 28, 31);
        }
        int now=clock();
        while(1) if(clock()-now>=100) {
            now=clock();
            if(downL) {
                int click;
                getxy(px, py), click=button_check(bq, bqsiz, px, py);
                if(click==1) goto start;
                if(click==2) return;
                if(click==3) {
                    rep(x, 1, 3) {
                        goxy(10, 6+8*x);
                        if(diymp[x]=="NuLl") print(pgreen, iturns(x, 0)), bq[++bqsiz]=button(10, 10, 6+8*x, 6+8*x);
                        else print(pred, iturns(x, 0)), bq[++bqsiz]=button(0, 0, 0, 0);
                    }
                    click=-1;
                }
                if(click>3) {
                    click-=3, diymp[click]=seed, diykey[click]=iturns(click, 0);
                    goxy(12, 10), print(pyellow, "设置对应钥匙码(不区分大小写)");
                    goxy(13, 10), mouse(1), cin>>diykey[click], diykey[click]=sdown(diykey[click]), mouse(0);
                    while(spmp[diykey[click]].size()) {
                        goxy(12, 10), print(1, "                            ");
                        goxy(12, 10), print(pred, "重复! 请重新设置");
                        goxy(13, 10), print(1, "                                                                                          ");
                        goxy(13, 10), mouse(1), cin>>diykey[click], diykey[click]=sdown(diykey[click]), mouse(0); 
                    }
                    spmp[diykey[click]]=diymp[click], data_save();
                    system("cls"), print(pyellow, "已保存!"), sleep(2000);
                    return;
                }
            }
        }
    }

    iv play(int p) {
        if(p==1&&opn[0]==0) p=0;
        int scor, bqsiz;
        button bq[1000]={};
        string seed;
        switch(p) {
            case 0: {
                int diecnt=0;
                system("cls"), print(pyellow, "你好!\n"), sleep(1500);
                print(pyellow, "我是ITue, 你在这个世界里的向导!"), sleep(2500);
                retry:;
                MP::load("a01000001000100010000211110000010302000012210013004003"), MP::init();
                system("cls"), scor=MP::main(0);
                system("cls");
                if(scor>=80) {
                    print(pyellow, "如你所见, 这是一个非常简单的游戏!\n"), sleep(1700);
                    print(pyellow, "......"), sleep(800);
                    print(pyellow, "......"), sleep(900);
                    rep(i, 1, 6) print(pyellow, "."), sleep(i*50);
                    system("cls"), print(pyellow, "我好像把你的s键搞丢了......"), sleep(2000);
                    system("cls"), print(pyellow, "没事的! 我还有一个s键!......可能, 有点, 不太适配?"), sleep(600);
                    print(pred, "s"), sleep(2000);
                    system("cls"), print(pyellow, "......"), sleep(1000);
                    print(pyellow, "我刚才..."), sleep(800), print(pyellow, "去看了一下代码, \n"), sleep(1300);
                    print(pyellow, "好像这个按钮不能在"), print(pblue, "蓝色方块"), print(pyellow, "下落的时候点......"), sleep(3000);
                    system("cls"), print(pyellow, "你不会怪我吧? QAQ"), sleep(4000);
                    system("cls"), print(pyellow, "其实, 还是有补救方案的, 可是那对于你来说, 有点...困难..."), sleep(1500);
                    system("cls"), print(pyellow, "我帮你换上了"), print(pred, "红色方块"), print(pyellow, "这样你就能按s键了!"), sleep(3000);
                    p=opn[0]=1, scor=0, data_save();
                    goto start;
                } else {
                    diecnt++;
                    if(diecnt==1) print(pyellow, "是我的不对! 我忘记告诉你, 像==这样的方块是只能踩一次的!");
                    if(diecnt>=2&&diecnt<=5) print(pyellow, "怎么这么不小心呢? 再试一次!");
                    if(diecnt>=6&&diecnt<=12) print(pyellow, "为什么又回来了?");
                    if(diecnt==13) {
                        print(pyellow, "你是不是玩不起?");
                        memset(opn, 0, sizeof(opn)), memset(score, 0, sizeof(score));
                        exit(0);
                    }

                    sleep(1500);
                    goto retry;
                }
                break;
            }
            case 4: {
                if(!opn[5]) {
                    system("cls"), print(pyellow, "哈喽哈, 又见面了~\n"), sleep(1800);
                    print(pyellow, "我这次给你带来了一个好玩的东西!"), sleep(1000);
                    print(pyellow, "那就是跳板!"), sleep(2000);
                    system("cls"), print(pred, "<< "), sleep(300), print(pred, ">> "), sleep(300), print(pred, "/\\ "), sleep(300), print(pred, "\\/\n"), sleep(1000);
                    print(pyellow, "这四个分别是往左、右、上、下跳的跳板!\n"), sleep(2000);
                    print(pyellow, "在踩到跳板的时候, 你可以用"), print(pred, "x"), print(pyellow, "键来触发!"), sleep(2500);
                    system("cls"), print(pyellow, "跳板会让你快速地前进两格, 祝你玩得愉快!"), sleep(3500);
                }
                goto start;
                break;
            }
            case 6: {
                if(!opn[7]) {
                    system("cls"), print(pyellow, "通关速度还挺快, 不愧是你\n"), sleep(2000);
                    print(pyellow, "看来我要给你点更加 有趣 的小东西了呢~"), sleep(3000);
                    system("cls"), print(pred, "LL RR\n"), sleep(1000);
                    print(pyellow, "这是两个旋转方块, 左旋和右旋\n"), sleep(2500);
                    print(pyellow, "站在上面的时候, 分别使用"), print(pred, " Q "), print(pyellow, "和"), print(pred, " E "), print(pyellow, "来使用它们!\n"), sleep(4000); 
                    system("cls"), print(pyellow, "玩得愉快!"), sleep(2000); 
                }
                goto start;
                break;
            }
            default: {
                start:;
                MP::load(mp[p]), MP::init();
                system("cls"), print(pwhite, "tip:"+tips[rand()%tipsiz]), sleep(1000);
                system("cls"), scor=MP::main(p), sleep(1000);
                system("cls");
                if(scor==233) return;
                if(scor==666) goto start;
                if(scor>=60) {
                    opn[p+1]=1;
                    goxy(2, 16), print(pyellow, "过关啦!"), sleep(1000);
                    goxy(3, 16), print(pyellow, "分数 "+iturns(scor, 0));
                    if(p>0)  score[p]=max(score[p], scor), print(pyellow, " 最高 "+iturns(score[p], 0)), data_save();
                    goxy(4, 16), print(pgreen, "重来  返回");
                    bqsiz=0, bq[++bqsiz]=button(4, 4, 16, 19), bq[++bqsiz]=button(4, 4, 22, 25);
                    while(1) if(downL) {
                        int chos;
                        getxy(px, py), chos=button_check(bq, bqsiz, px, py);
                        if(chos==1) goto start;
                        if(chos==2) return;
                    }
                } else {
                    goxy(2, 16), print(pyellow, "失败了!"), sleep(1000);
                    goxy(3, 16), print(pgreen, "重来  返回");
                    bqsiz=0, bq[++bqsiz]=button(3, 3, 16, 19), bq[++bqsiz]=button(3, 3, 22, 25);
                    while(1) if(downL) {
                        int chos;
                        getxy(px, py), chos=button_check(bq, bqsiz, px, py);
                        if(chos==1) goto start;
                        if(chos==2) return;
                    }
                }
                break;
            }
        }

    }

    iv lock() {
        goxy(20, 12), print(pred, "该关卡尚未解锁!"), sleep(1000), print(pwhite, "               ");
    }

    iv map_choser() {
        chosing:;
        memset(wich, 0, sizeof(wich));
        px=4, py=7;
        int p=1;
        //7 15 23 31
        string seed;
        system("cls");

        goxy(2, 10), print(pred, "exit");
        wich[2][10]=wich[2][11]=wich[2][12]=wich[2][13]=-1;
        goxy(2, 16), print(pwhite, "Choose Map");

        while(p<=totL) {
            goxy(px, py), print(pred+(opn[p]? pyellow*16: pgrey*16), iturns(p, 3));
            wich[px][py]=wich[px][py+1]=wich[px][py+2]=(opn[p]? p: -2);
            py+=6, p++;
            if(py>31) py=7, px+=2;
        }
        goxy(px, py), print(pred+pyellow*16, "DIY");
        wich[px][py]=wich[px][py+1]=wich[px][py+2]=totL+1;

        bool flag=1, sptip=0;
        while(flag) if(downL) {
            getxy(px, py), p=wich[px][py];
            if(p>0&&p<=totL) play(p), flag=0;
            else if(p==totL+1) DIY_map(), flag=0;
            else if(p==-1) return;
            else if(p==-2) lock();
        }
        goto chosing;
    }
    iv about() {
        system("cls");
        print(pwhite, "游戏名称       Beat BIT!\n");
        sleep(1000);
        print(pwhite, "作者           atue, ztue\n");
        sleep(1000);
        print(pwhite, "开始制作时间   2021/4/1\n\n");
        sleep(1000);
        print(pyellow, "一些提示:\n");
        sleep(1000);
        print(pyellow, "按P以暂停\n");
        sleep(1000);
        print(pyellow, "事实上, aczbc\n");
        sleep(1000);
        print(pyellow, "几乎所有的等待时间都可以用空格跳过哦~\n");
        sleep(1000);

        print(pred, "\n\n按s以返回");
        while(1) if(keydown('S')) return;
    }
    iv test_main() {
        special_map();
        begin:;
        data_read();
        system("cls"), sleep(200), goxy(2, 16);
        string out[9]={"B", "E", "A", "T", " ", "B", "I", "T", "!"};
        rep(i, 0, 8) print(rand()%2? pred: pblue, out[i]), sleep(20);
        goxy(1, 1), print(pred, "exit");
        goxy(1, 41), print(pgreen, "关于"); 
        int t=clock(), scren=0;
        if(opn[0]==0) goxy(12, 6), print(pred, "请先确保你的快速编辑模式已关闭!");
        while(1) {
            if(downL) {
                getxy(px, py);
                if(px==1&&py>=1&&py<=4) return;
                if(px==1&&py>=41&&py<=44) {
                    about();
                    goto begin;
                }
            }
            if(clock()-t>=700) {
                goxy(4, 16), print(rand()%8+8, scren? "         ": "按S以开始");
                scren^=1, t=clock();
            }
            if(keydown('S')) break;
        }
        map_choser();
        goto begin;
    }
    iv main() {
        //没的很, 甚至比story还要没得很 
    }
}

int main() {
    system("mode con cols=44 lines=22");
    color(pwhite), mouse(0), srand(time(NULL));
    BS::test_main();
    system("mode con cols=82 lines=25");
    color(7), mouse(1);
}