菜单

gwfate
gwfate
发布于 2026-08-29 / 25 阅读
0
0

跑酷(V4.1帧率25,增加暂停)

#include<bits/stdc++.h>
#include<windows.h>
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#define ku(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 0:1)
#define SC SetConsoleTextAttribute
#define FR FOREGROUND_RED
#define FB FOREGROUND_BLUE
#define FG FOREGROUND_GREEN
#define FI FOREGROUND_INTENSITY
using namespace std;
const double FIXED_FPS = 25.0; // 固定25帧
const double FIXED_DELTA = 1.0 / FIXED_FPS;
LARGE_INTEGER freq, start_time, cur_time;
double delta_time = 0.0, accumulator = 0.0;
/*======================Stated Variablev======================*/
const int N=122,W=100,H=20;
int map_id=1,now_id=1,j_h=5,all_dead=0,dead=0,CNT=8,speed=7;
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
const string ENCRYPTION_KEY="platform_parkour_game_2025";
string CS="                      ";

string encrypt(const string &data,const string &key){
    string result=data;
    int keyLen=key.length();
    for(size_t i=0;i<data.length();++i)
        result[i]=data[i]^key[i%keyLen];
    return result;
}

string decrypt(const string &data,const string &key){
    return encrypt(data,key);
}

struct SaveData{
	int CNT,all_dead,dead,x,y,lx,ly,checksum;
}data;

class monster{
	public:
	int type;//1|0 -> l&r | u&d
	char clo;
	int way,move,x,y,lx,ly;
	int L_x,U_y,R_x,D_y;
	bool death;
}MON;

class organ{
	public:
	int type;//1|0 -> l&r | u&d
	char clo;
	int way,move;
	int l_x,u_y,r_x,d_y;
	int L_x,U_y,R_x,D_y;
}GAN;

class player{
	public:
	char clo='I';
	int x,y,lx,ly,jt,jh;
}p1;

class MAP_{
	public:
	int sx,sy,ex,ey,spl=0;
	vector <monster> mon;
	vector <organ> gan;
	bool vis[N][N];
	string mp[N]={
	" ____________________________________________________________________________________________________",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",
	" |                                                                                                  |",};
}MAP[N];
/*======================Stated Main======================*/
void enter();
void sp();
int read();
void write(int x);
void gotoxy(int x,int y);
void hide();
void InitTimer();
double GetDeltaTime();
void puts_(string s);
void print_main();
void relow_map();
void print_map(int id);
void start_game();
void game();
bool save_game();
bool load_game();
bool kp(int vkCode);
bool pause();
/*======================Function Body======================*/
void enter(){putchar('\n');}
void sp(){putchar(' ');}
void puts_(string s){cout<<s;}

int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x*f;
}

void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}

void gotoxy(int x,int y){
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
    short xx=x,yy=y;
    COORD pos={xx,yy};
    SetConsoleCursorPosition(handle,pos);
}

void hide(){
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

// 初始化高精度计时器
void InitTimer() {
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&start_time);
}
// 获取当前帧时间差
double GetDeltaTime() {
    QueryPerformanceCounter(&cur_time);
    double delta = (cur_time.QuadPart - start_time.QuadPart) * 1.0 / freq.QuadPart;
    start_time = cur_time;
    return delta;
}

bool kp(int vkCode){
    static DWORD cooldown[256] = {0};
    const int CD = 100;
    if(kd(vkCode) && GetTickCount() > cooldown[vkCode]){
        cooldown[vkCode] = GetTickCount() + CD;
        return 1;
    }
    return 0;
}

bool save_game(){
	if(!p1.x && !p1.y) return 0;
    ofstream fout("save.txt",ios::binary);
    if(!fout)return 0;
    data.CNT=now_id;
    data.all_dead=all_dead;
    data.dead=dead;
    data.x=p1.x;
    data.y=p1.y;
    data.lx=p1.lx;
    data.ly=p1.ly;
    data.checksum=data.CNT+data.all_dead+data.dead+data.x+p1.y+p1.lx+p1.ly+0x2A7B;
    string raw_data(reinterpret_cast<char*>(&data),sizeof(data));
    string encrypted_data=encrypt(raw_data,ENCRYPTION_KEY);
    fout.write(encrypted_data.c_str(),encrypted_data.size());
    fout.close();
    return 1;
}

bool load_game(){
    ifstream fin("save.txt",ios::binary|ios::ate);
    if(!fin)return 0;
    streamsize size=fin.tellg();
    fin.seekg(0,ios::beg);
    string encrypted_data(size,' ');
    if(!fin.read(&encrypted_data[0],size))return 0;
    fin.close();
    string raw_data=decrypt(encrypted_data,ENCRYPTION_KEY);
    if(raw_data.size()!=sizeof(SaveData))return 0;
    SaveData* data=reinterpret_cast<SaveData*>(&raw_data[0]);
    int checksum=data->CNT+data->all_dead+data->dead+data->x+data->y+data->lx+data->ly+0x2A7B;
    if(data->checksum!=checksum)return 0;
    if(data->CNT<1  ||  data->CNT>CNT)return 0;
    now_id=data->CNT;
    all_dead=data->all_dead;
    dead=data->dead;
    p1.x=data->x;
    p1.y=data->y;
    p1.lx=data->lx;
    p1.ly=data->ly;
    return 1;
}

void print_main(){
    system("cls");
    while(1)if(ku('1') && ku('2') && ku('3') && ku('4')) break;
    puts("1: 开始新游戏");
    puts("2: 加载存档");
    puts("3: 保存当前进度");
    puts("4: 退出游戏");
    while(1){
        if(kp('1')){now_id=1;all_dead=0;return;}
        else if(kp('2')){
            if(load_game()){
                gotoxy(0,5);
                cout<<"加载成功!当前关卡: "<<now_id<<" 总死亡次数: "<<all_dead;
                system("pause");
                return;
            }else{
                gotoxy(0,5);
                cout<<"加载失败!存档不存在或已损坏。";
                system("pause");
                now_id=1;all_dead=0;
                return;
            }
        }
        else if(kp('3')){
            if(save_game())gotoxy(0,5),cout<<"保存成功";
            else gotoxy(0,5),cout<<"保存失败!";
            system("pause");
            print_main();
            return;
        }
        else if(kp('4'))exit(0);
    }
}

void relow_map(){
	int now=0;
	//======================1======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                                                                                  |";
	MAP[now].mp[2]= " |                                                                                                  |";
	MAP[now].mp[3]= " |                                                                                                  |";
	MAP[now].mp[4]= " |                                                                                                  |";
	MAP[now].mp[5]= " |                                                                                                  |";
	MAP[now].mp[6]= " |                                                                                                  |";
	MAP[now].mp[7]= " |                                                                                                  |";
	MAP[now].mp[8]= " |                                                                                                  |";
	MAP[now].mp[9]= " |                                                                                                  |";
	MAP[now].mp[10]=" |                                                                                                  |";
	MAP[now].mp[11]=" |                                                                                                  |";
	MAP[now].mp[12]=" |                                                                                                  |";
	MAP[now].mp[13]=" |                                                                                                  |";
	MAP[now].mp[14]=" |                                      @                                                           |";
	MAP[now].mp[15]=" |                           ==============                                                         |";
	MAP[now].mp[16]=" |                          =                                                                       |";
	MAP[now].mp[17]=" |                         =                                                                        |";
	MAP[now].mp[18]=" |                        =                                                                         |";
	MAP[now].mp[19]=" |                       =                                                                         #|";
	MAP[now].mp[20]=" |========================================^^^=====^^^=====^^^=====^^^=====^^^=======================|";
	//======================2======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MON={1,'A',1,0,20,18,20,18,20,18,31,18,0};
	MAP[now].mon.push_back(MON);
	MON={1,'A',1,0,40,18,40,18,40,18,57,18,0};
	MAP[now].mon.push_back(MON);
	MON={0,'O',3,0,72,18,72,18,72,12,72,18,0};
	MAP[now].mon.push_back(MON);
	MON={0,'O',3,0,73,16,73,18,73,12,73,18,0};
	MAP[now].mon.push_back(MON);
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                                                                                  |";
	MAP[now].mp[2]= " |                                                                                                  |";
	MAP[now].mp[3]= " |                                                                                                  |";
	MAP[now].mp[4]= " |                                                                                                  |";
	MAP[now].mp[5]= " |                                                                                                  |";
	MAP[now].mp[6]= " |                                                                                                  |";
	MAP[now].mp[7]= " |                                                                                                  |";
	MAP[now].mp[8]= " |                                                                                                  |";
	MAP[now].mp[9]= " |                                                                                                  |";
	MAP[now].mp[10]=" |                                                                                                  |";
	MAP[now].mp[11]=" |                                                                                                  |";
	MAP[now].mp[12]=" |                                                                                                  |";
	MAP[now].mp[13]=" |                                                                                                  |";
	MAP[now].mp[14]=" |                                                                                                  |";
	MAP[now].mp[15]=" |                                                                                                  |";
	MAP[now].mp[16]=" |                                                                                                  |";
	MAP[now].mp[17]=" |                                                                                                  |";
	MAP[now].mp[18]=" |                                                                                                  |";
	MAP[now].mp[19]=" |                  ============        ==================      ===^^^======^^^====                #|";
	MAP[now].mp[20]=" |-=================================================================================================|";
	//======================3======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	GAN={1,'=',1,0,30,15,32,15,30,15,50,15};
	MAP[now].gan.push_back(GAN);
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                                                                                  |";
	MAP[now].mp[2]= " |                                                                                                  |";
	MAP[now].mp[3]= " |                                                                                                  |";
	MAP[now].mp[4]= " |                                                                                                  |";
	MAP[now].mp[5]= " |                                                                                                  |";
	MAP[now].mp[6]= " |                                                                                                  |";
	MAP[now].mp[7]= " |                                                 =====^^^=====^^^====^^^====^^^====^^^===^^^====  |";
	MAP[now].mp[8]= " |                                                ==                                                |";
	MAP[now].mp[9]= " |                                                 =   =============================================|";
	MAP[now].mp[10]=" |                                                 =                                                |";
	MAP[now].mp[11]=" |                                               ===                                                |";
	MAP[now].mp[12]=" |                                                 >                                                |";
	MAP[now].mp[13]=" |                                                 >                                                |";
	MAP[now].mp[14]=" |                                                 =                                                |";
	MAP[now].mp[15]=" |                           =                     =@                                               |";
	MAP[now].mp[16]=" |                          =                      =====^^^===^^^===^^^===   =====   ===^^^=======  |";
	MAP[now].mp[17]=" |                         =                       =                                             >  |";
	MAP[now].mp[18]=" |                        =                        =                                             >  |";
	MAP[now].mp[19]=" |                       =                         =                                             > #|";
	MAP[now].mp[20]=" |=======================^^^^^^^^^^^^^^^^^^^^^^^^^^=                                             > =|";
	//======================4======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                     vvvvvv                                                       |";
	MAP[now].mp[2]= " |                                                              =                                   |";
	MAP[now].mp[3]= " |                                                             = =--------------------------------- |";
	MAP[now].mp[4]= " |                                     =                      =                                   = |";
	MAP[now].mp[5]= " |                                     =                     =                                    = |";
	MAP[now].mp[6]= " |                                    =                     =                                     = |";
	MAP[now].mp[7]= " |                                   =                     =                                      = |";
	MAP[now].mp[8]= " |                                  =                     =                                       = |";
	MAP[now].mp[9]= " |                                 =                     =                                        = |";
	MAP[now].mp[10]=" |                                =                     =                                         = |";
	MAP[now].mp[11]=" |                               =                     =                                          = |";
	MAP[now].mp[12]=" |                              =                       <                                         = |";
	MAP[now].mp[13]=" |                             =                     = ^                                          ==|";
	MAP[now].mp[14]=" |                            =                     =  ^                                            |";
	MAP[now].mp[15]=" |                           =                     =  ^                                             |";
	MAP[now].mp[16]=" |                          =                     =  ^                                              |";
	MAP[now].mp[17]=" |                         =                     =  ^                                               |";
	MAP[now].mp[18]=" |                        =                     =  ^                                                |";
	MAP[now].mp[19]=" |                       =                     =      @                                            #|";
	MAP[now].mp[20]=" |=======================================================^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^|";
	//======================5======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                                                                                 #|";
	MAP[now].mp[2]= " |-- --------------------------------------------------------------------------------------^--------|";
	MAP[now].mp[3]= " |^                                                                                                 |";
	MAP[now].mp[4]= " |#^                                                                                                |";
	MAP[now].mp[5]= " |--------------------------------------------------------------------------------------------- ^---|";
	MAP[now].mp[6]= " |                                                                                                 ^|";
	MAP[now].mp[7]= " |                                                                                                ^#|";
	MAP[now].mp[8]= " |-- ---------------------------------------------------------------------------------------------- |";
	MAP[now].mp[9]= " |^                                                                                                 |";
	MAP[now].mp[10]=" |#^                                                                                                |";
	MAP[now].mp[11]=" |--------------------------------------------------------------------------------------------- ^---|";
	MAP[now].mp[12]=" |                                                                                                 ^|";
	MAP[now].mp[13]=" |                                                                                                ^#|";
	MAP[now].mp[14]=" |-- -----------------------------------------------------------------------------------------------|";
	MAP[now].mp[15]=" |^                                                                                                 |";
	MAP[now].mp[16]=" |#^                                                                                                |";
	MAP[now].mp[17]=" |--------------------------------------------------------------------------------------------- ^---|";
	MAP[now].mp[18]=" |                                                                                                 ^|";
	MAP[now].mp[19]=" |                                                                                                ^#|";
	MAP[now].mp[20]=" |-------------------------------------------------------------------------------------------------=|";
	//======================6======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                                                                                  |";
	MAP[now].mp[2]= " |                                                                                             =    |";
	MAP[now].mp[3]= " |                                                                                            =     |";
	MAP[now].mp[4]= " |                                                                                           =      |";
	MAP[now].mp[5]= " |                                                                                          =  ^ ^  |";
	MAP[now].mp[6]= " |                                                                                         =  >  <  |";
	MAP[now].mp[7]= " |                                                                                        =  >  ^   |";
	MAP[now].mp[8]= " |                                                                                       =  >  ^    |";
	MAP[now].mp[9]= " |                                 =                                                    ^  >  ^     |";
	MAP[now].mp[10]=" |                                = ===  <                                             ^   >  <     |";
	MAP[now].mp[11]=" |                               =^^^^^^^>                                                  ^  <    |";
	MAP[now].mp[12]=" |                              =        >                                           ^v      ^  <   |";
	MAP[now].mp[13]=" |                             =         >                                   =      ^         ^  <  |";
	MAP[now].mp[14]=" |v                           =^^^^^^^^^^>                                   =     ^           ^  < |";
	MAP[now].mp[15]=" |                           =###########>                                   =    ^              <  |";
	MAP[now].mp[16]=" | ==                       =############>                                   =   ^              ^   |";
	MAP[now].mp[17]=" | =                       =#############>                    =@=            =  ^                ^  |";
	MAP[now].mp[18]=" | =                      =##############>                     =             = ^                    |";
	MAP[now].mp[19]=" | =                     =###############>                                   =^#                 #  |";
	MAP[now].mp[20]=" |==^^^^^^^^^^^^^^^^^^^^^=================^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^====^^^^^^^^^^^^^^^^^^^|";
	//======================7======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |#                                                                                                 |";
	MAP[now].mp[2]= " |                                                                                                  |";
	MAP[now].mp[3]= " |================================================================================================  |";
	MAP[now].mp[4]= " |                                                                                                  |";
	MAP[now].mp[5]= " |                                                                                                  |";
	MAP[now].mp[6]= " |                                                                                                  |";
	MAP[now].mp[7]= " |                                                                                                 @|";
	MAP[now].mp[8]= " |   =@===^^==^==^=^==^==^==^=^===^=^===^==^==^==^=^=^=^^=^=^==^=^=^=^==^==^=^==^=^==^==^=^==^==^===|";
	MAP[now].mp[9]= " |                                                                                                  |";
	MAP[now].mp[10]=" |                                                                                                  |";
	MAP[now].mp[11]=" |                                                                                                  |";
	MAP[now].mp[12]=" |---                                            @                                                  |";
	MAP[now].mp[13]=" |   ^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^vv^==  |";
	MAP[now].mp[14]=" |                                                                                                  |";
	MAP[now].mp[15]=" |                                                                                                  |";
	MAP[now].mp[16]=" |                                                                                                  |";
	MAP[now].mp[17]=" |   =        ==        ==       ==                  ==        ==        ==        ==        =====@=|";
	MAP[now].mp[18]=" |  =                                     ^@=                                                       |";
	MAP[now].mp[19]=" | =                                       =                                                        |";
	MAP[now].mp[20]=" |=                                                                                                 |";
	//======================8======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |     =     =     =     =     =     =     =     =     =     =     =     =     =     =     =     =  |";
	MAP[now].mp[2]= " |  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[3]= " |  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[4]= " |  =  <  =  =  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[5]= " |  =  <  =  =  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[6]= " |  =  < ==  =  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[7]= " | ==  =  =  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  = ==  =  |";
	MAP[now].mp[8]= " |  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  |";
	MAP[now].mp[9]= " |  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  |";
	MAP[now].mp[10]=" |  =  >  >  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  |";
	MAP[now].mp[11]=" |  =  <  >  =  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[12]=" |  =  <  =  >  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[13]=" |  =  = =>  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  |";
	MAP[now].mp[14]=" | =>  =  =  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  = =>  =  |";
	MAP[now].mp[15]=" |  >  =  =  <  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  >  =  |";
	MAP[now].mp[16]=" |  =  =  =  <  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  |";
	MAP[now].mp[17]=" |  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[18]=" |  =  <  =  =  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  =  <  |";
	MAP[now].mp[19]=" |  =     =     =     =     =     =     =     =     =     =     =     =     =     =     =     =    #|";
	MAP[now].mp[20]=" |===========@===========@===========@===========@===========@===========@===========@==============|";
	//======================9======================
	now++;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |#>                   <  <#>              <   v#v             <   v#v                    v#v       |";
	MAP[now].mp[2]= " |vv                   <  >v<              <   <v<             <   <v>                    <v>       |";
	MAP[now].mp[3]= " |                  =  <  < >           =  <   < >          =  <   > >          =         < >       |";
	MAP[now].mp[4]= " |                 =  <   v v          =  <    v v         =  <    v v         =          v v       |";
	MAP[now].mp[5]= " |                =  <                =  <                =  <                =                   = |";
	MAP[now].mp[6]= " |               =  <                =  <                =  <                =                   =  |";
	MAP[now].mp[7]= " |              =  <                =  <                =  <                =                   =   |";
	MAP[now].mp[8]= " |             =  <                =  <                =  <                =                   =    |";
	MAP[now].mp[9]= " |            =  <                =  <                =  <                =                   -     |";
	MAP[now].mp[10]=" |           =  <                =  <                =  <                =                   =      |";
	MAP[now].mp[11]=" |          =  <                =  <                =  <                =                   =       |";
	MAP[now].mp[12]=" |         =  <                =  <                =  <                =                   ^        |";
	MAP[now].mp[13]=" |        =  <                =  <                =  <                =                   =         |";
	MAP[now].mp[14]=" |       =                   -                   -                   -                   -          |";
	MAP[now].mp[15]=" |      =                   ^                   ^                   ^                   ^           |";
	MAP[now].mp[16]=" |     =                   ^                   ^                   ^                   ^            |";
	MAP[now].mp[17]=" |    =^ ^ ^ ^ ^ ^ ^ ^^^^^=^ ^ ^ ^ ^ ^ ^ ^^^^^=^ ^ ^ ^ ^ ^ ^ ^^^^^=^ ^ ^ ^ ^ ^ ^ ^^^^^=   ^^^^^^^^^^|";
	MAP[now].mp[18]=" |   = < > < > < > < >   = < > < > < > < >   = < > < > < > < >   = < > < > < > < >   =    ^^^^v^^^^^|";
	MAP[now].mp[19]=" |  =  < > < > < > < >  =  < > < > < > < >  =  < > < > < > < >  =  < > < > < > < >  =              #|";
	MAP[now].mp[20]=" |=^================================================================================================|";
	//======================10======================
	now++;
	MAP[now].spl=1;
	MAP[now].sx=2;
	MAP[now].sy=19;
	MAP[now].mp[0]= " ____________________________________________________________________________________________________";
	MAP[now].mp[1]= " |                                                                                                  |";
	MAP[now].mp[2]= " | ================================================================================================ |";
	MAP[now].mp[3]= " | =                                                                                              = |";
	MAP[now].mp[4]= " | = ============================================================================================ = |";
	MAP[now].mp[5]= " | = =                                                                                          = = |";
	MAP[now].mp[6]= " | = = ======================================================================================== = = |";
	MAP[now].mp[7]= " | = = =                                                                                      = = = |";
	MAP[now].mp[8]= " | = = = ==================================================================================== = = = |";
	MAP[now].mp[9]= " | = = = =#                                                                                 = = = = |";
	MAP[now].mp[10]=" | = = = ================================================================================== = = = = |";
	MAP[now].mp[11]=" | = = =                                                                                    = = = = |";
	MAP[now].mp[12]=" | = = ====================================================================================== = = = |";
	MAP[now].mp[13]=" | = =                                                                                        = = = |";
	MAP[now].mp[14]=" | = ========================================================================================== = = |";
	MAP[now].mp[15]=" | =                                                                                            = = |";
	MAP[now].mp[16]=" | ============================================================================================== = |";
	MAP[now].mp[17]=" |                                                                                                = |";
	MAP[now].mp[18]=" |================================================================================================= |";
	MAP[now].mp[19]=" |                                                                                                  |";
	MAP[now].mp[20]=" |==================================================================================================|";
	CNT=now;
}

void print_map(int id){
    HANDLE hc=GetStdHandle(STD_OUTPUT_HANDLE);
    system("cls");
    gotoxy(0,0);
    for(register int i=0;i<=H;i++){cout<<MAP[id].mp[i];enter();}
    hide();
}

void start_game(){
    HANDLE hc=GetStdHandle(STD_OUTPUT_HANDLE);
    stg:
    system("cls");
    puts("1: 继续游戏");
    puts("2: 保存进度");
    puts("3: 返回主菜单");
    while(1)if(ku('1') && ku('2') && ku('3'))break;
    while(1){
        if(kp('1')){
            game();
		    dead=0;
		    p1.x=p1.lx=MAP[now_id+1].sx;p1.y=p1.ly=MAP[now_id+1].sy;
            system("cls");
            gotoxy(0,0);
			if(now_id>=CNT){
                cout<<"恭喜你通关所有关卡!";enter();
                cout<<"总死亡次数: "<<all_dead;enter();
                system("pause");
                now_id=1;all_dead=0;
                return;
            }else{
                cout<<"你已完成第 "<<now_id<<" 关";
                now_id++;enter();
                puts("1: 下一关");
                puts("2: 保存进度");
                puts("3: 返回主菜单");
            }
        }
        if(kp('2')){
            if(save_game()){system("cls");puts("保存成功!");}
            else{system("cls");puts("保存失败!");}
            system("pause");
            goto stg;
        }
        if(kp('3'))return;
    }
}

// ====================== 修复:正常速度游戏循环 ======================
void game(){
    InitTimer();
    accumulator = 0.0;
    HANDLE hc=GetStdHandle(STD_OUTPUT_HANDLE);
    print_map(now_id);
    p1.jt=0;p1.jh=0;
    int jump_=0;
    if(!p1.x && !p1.y) p1.x=p1.lx=MAP[now_id].sx,p1.y=p1.ly=MAP[now_id].sy;
    gotoxy(p1.x,p1.y);
    SC(hc,FR|FG|FI);
    putchar(p1.clo);
    SC(hc,FR|FG|FB);
    
    vector<monster> mo=MAP[now_id].mon;
    vector<organ> ga=MAP[now_id].gan;
    string now_mp[N]=MAP[now_id].mp;
    short mos[N][N],gas[N][N];
    memset(mos,0,sizeof(mos));
	memset(gas,0,sizeof(gas));
    if(now_id==10) j_h=22;
	else j_h=5;
    
    while(1){
        delta_time = GetDeltaTime();
        accumulator += delta_time;

        // 固定30帧逻辑更新
        while (accumulator >= FIXED_DELTA) {
            accumulator -= FIXED_DELTA;

            SC(hc,FB|FG);
	        gotoxy(0,H+1);cout<<"W/A/D:移动   G:重绘地图   R:回出生点   S:保存游戏   P:暂停游戏";
	        gotoxy(0,H+2);cout<<CS;
	        gotoxy(0,H+2);cout<<"位置: x="<<p1.x<<" y="<<p1.y;
	        gotoxy(0,H+3);cout<<"当前关卡: "<<now_id<<"/"<<CNT<<"   总死亡次数: "<<all_dead;
	        gotoxy(0,H+4);cout<<"本关死亡次数: "<<dead;
	        SC(hc,FR|FG|FB);
	        
	        int yyy=0,xx=p1.x,yy=p1.y;
	        //======================monster_move======================
	        for(register int i=0;i<mo.size();i++){
	            monster &j=mo[i];
	            if(j.death)continue;
	            if(j.x==p1.x && j.y==p1.y+1){
		            j.death=1;
		            gotoxy(j.lx,j.ly);
					mos[j.ly][j.lx]=0;
					p1.jh=j_h*2;
		            SC(hc,FR|FG|FI);
					putchar(now_mp[j.ly][j.lx]);
		            SC(hc,FR|FG|FB);
		            continue;
		        }
		        if(j.x==p1.x && j.y==p1.y){
		        	p1.x=p1.lx,p1.y=p1.ly;
					dead++,all_dead++,yyy=1;
					gotoxy(j.lx,j.ly);
					mos[j.ly][j.lx]=0;
					putchar(now_mp[j.ly][j.lx]);
		            gotoxy(j.x,j.y);
					mos[j.y][j.x]=i;
		            SC(hc,FR);
					putchar(j.clo);
		            SC(hc,FR|FG|FB);
				}
				if(j.move<speed){j.move++;continue;}
	            else j.move=0;
	            if(j.type){
	            	int xx=j.x+dx[j.way],yy=j.y+dy[j.way];
		            if(xx<j.L_x || xx>j.R_x  || yy<j.U_y || yy>j.D_y)j.way=(j.way+1)%2;
		            else j.x=xx,j.y=yy;
		            if(xx==p1.x && yy==p1.y){
			        	p1.x=p1.lx,p1.y=p1.ly;
						dead++,all_dead++,yyy=1;
					}
				}else{
					int xx=j.x+dx[j.way],yy=j.y+dy[j.way];
					if(xx<j.L_x || xx>j.R_x  || yy<j.U_y || yy>j.D_y)j.way=(j.way+1)%2+2;
		            else j.x=xx,j.y=yy;
		            if(xx==p1.x && yy==p1.y){
			        	p1.x=p1.lx,p1.y=p1.ly;
						dead++,all_dead++,yyy=1;
					}
				}
	            
	            gotoxy(j.lx,j.ly);
				mos[j.ly][j.lx]=0;
				putchar(now_mp[j.ly][j.lx]);
	            gotoxy(j.x,j.y);
				mos[j.y][j.x]=i;
	            SC(hc,FR);
				putchar(j.clo);
	            SC(hc,FR|FG|FB);
	            j.lx=j.x,j.ly=j.y;
	        }
	        //======================organ_move======================
	        for(register int i=0;i<ga.size();i++){
	            organ j=ga[i];
	            if(j.move<speed){j.move++;ga[i]=j;continue;}
	            else j.move=0;
	            if(j.type){
	            	int xx1=j.l_x+dx[j.way],yy1=j.u_y+dy[j.way],
						xx2=j.r_x+dx[j.way],yy2=j.d_y+dy[j.way];
		            if(xx1<j.L_x || xx2>j.R_x)j.way=(j.way+1)%2;
		            else j.l_x=xx1,j.u_y=yy1,j.r_x=xx2,j.d_y=yy2;
		            
		            gotoxy(j.L_x,j.U_y);
		            for(register int o=j.L_x;o<=j.R_x;o++)putchar(now_mp[j.U_y][o]),gas[j.U_y][o]=0;
				}else{
					int xx1=j.l_x+dx[j.way],yy1=j.u_y+dy[j.way],
						xx2=j.r_x+dx[j.way],yy2=j.d_y+dy[j.way];
		            if(xx1<j.L_x || xx2>j.R_x)j.way=(j.way+1)%5+2;
		            else j.l_x=xx1,j.u_y=yy1,j.r_x=xx2,j.d_y=yy2;
		            
		            gotoxy(j.L_x,j.U_y);
		            for(register int o=j.L_x;o<=j.R_x;o++)putchar(now_mp[j.U_y][o]),gas[j.U_y][o]=0;
				}
	            
	            gotoxy(j.l_x,j.u_y);
	            SC(hc,FG|FI);
	            for(register int o=j.l_x;o<=j.r_x;o++)gas[j.u_y][o]=1,putchar(j.clo);
	            SC(hc,FR|FG|FB);
	            ga[i]=j;
	        }
	        
	        if(kp('R') || p1.y>=H || 
			now_mp[p1.y+1][p1.x]=='^' || mos[p1.y][p1.x]){
	            p1.x=p1.lx,p1.y=p1.ly,dead++,all_dead++,yyy=1;
	        }
	        
	        if(kd('S')){
	            if(save_game()){
	                gotoxy(0,H+5);
	                SC(hc,FG);
	                cout<<"游戏已加密保存!";
	                SC(hc,FR|FG|FB);
	            }
	            Sleep(500);
	        }
	        
	        if(now_mp[p1.y+1][p1.x]=='@' || now_mp[p1.y][p1.x+1]=='@' || 
	           now_mp[p1.y][p1.x-1]=='@' || now_mp[p1.y-1][p1.x]=='@' || kd('O')){
	            p1.lx=p1.x;p1.ly=p1.y;yyy=1;
	        }
	        
	//        jump V2.0
	//        if((kd('W') && (now_mp[p1.y+1][p1.x]=='=' || now_mp[p1.y+1][p1.x]=='@' || gas[p1.y+1][p1.x]) || 
	//            now_mp[p1.y+1][p1.x]=='-')){
	//            p1.jh=j_h;jump_=0;
	//        }else if(kd('W') && p1.jt<1 && jump_){
	//        	if(now_id!=10) p1.jt++,jump_=0;
	//            p1.jh+=j_h;
	//        }
	        
	        if(kd('W') && (now_mp[p1.y+1][p1.x]=='=' || now_mp[p1.y+1][p1.x]=='@' || gas[p1.y+1][p1.x] || now_mp[p1.y+1][p1.x]=='-')){
			    p1.jh=j_h;
			    jump_=1;
			}else if(kd('W') && p1.jt<1 && jump_){
			    if(now_id!=10) p1.jt++;
			    p1.jh+=j_h;
			    jump_=0;
			}
	        
	        if(p1.jh){
	            p1.jh--;
	            if(now_mp[p1.y-1][p1.x]=='v'){
	                p1.x=p1.lx;p1.y=p1.ly;yyy=1;p1.jh=0;
	            }else{
	                if(now_mp[p1.y-1][p1.x]!=' ' || gas[p1.y-1][p1.x]) p1.jh=0;
	                else p1.y--,yyy=1,gotoxy(xx,yy),putchar(now_mp[yy][xx]);
	            }
	        }
	        
	        if(ku('W')) jump_=1;
	        
	        if(!p1.jh && now_mp[p1.y+1][p1.x]==' ' && !gas[p1.y+1][p1.x]){
	            p1.y++;
	            if(mos[p1.y][p1.x]){mo[mos[p1.y][p1.x]].death=1;mos[p1.y][p1.x]=0;}
	            yyy=1;
	        }
	        
	        if(now_mp[p1.y+1][p1.x]!=' ' || gas[p1.y+1][p1.x]) p1.jt=0;
	        
	        if(kp('Y')) return ;
	        if(kp('P')){
	        	pau:
				system("cls");
				puts("1: 继续游戏");
			    puts("2: 保存进度");
			    puts("3: 返回主菜单");
			    while(1){
			    	if(kp('1')){
			    		print_map(now_id);
			    		break;
					}
			    	else if(kp('2')){
			    		if(load_game()){
			                gotoxy(0,5);
			                cout<<"加载成功!当前关卡: "<<now_id<<" 总死亡次数: "<<all_dead;
			                system("pause");
			            }else{
			                gotoxy(0,5);
			                cout<<"加载失败!存档不存在或已损坏。";
			                system("pause");
			                now_id=1;all_dead=0;
			            }
			            goto pau;
					}else if(kp('3')){
						return ;
					}
				}
			}
	        
	        if(kd('G')){
	            print_map(now_id);
	            gotoxy(p1.x,p1.y);
	            SC(hc,FR|FG|FI);
	            putchar(p1.clo);
	            SC(hc,FR|FG|FB);
	        }
	        
	        if(kd('D')){
	        	if(now_mp[p1.y][p1.x+1]==' ' && !gas[p1.y][p1.x+1]){
					p1.x++,yyy=1;
				}else if(now_mp[p1.y][p1.x+1]=='<'){
					p1.x=p1.lx,p1.y=p1.ly,dead++,all_dead++,yyy=1;
				}
			}
	        if(kd('A')){
	        	if(now_mp[p1.y][p1.x-1]==' ' && !gas[p1.y][p1.x-1]){
					p1.x--,yyy=1;
				}else if(now_mp[p1.y][p1.x-1]=='>'){
					p1.x=p1.lx,p1.y=p1.ly,dead++,all_dead++,yyy=1;
				}
			}
	        
			if(now_mp[p1.y+1][p1.x]=='#' || now_mp[p1.y][p1.x+1]=='#' || now_mp[p1.y][p1.x-1]=='#' || now_mp[p1.y-1][p1.x]=='#') return ;
			
	        if(yyy){
	            gotoxy(xx,yy);putchar(now_mp[yy][xx]);
	            gotoxy(p1.x,p1.y);
	            SC(hc,FR|FG|FI);
	            putchar(p1.clo);
	            SC(hc,FR|FG|FB);
	        }
        }
        Sleep(32);
    }
}

signed main(){
    hide();
    srand(time(NULL));
    relow_map();
    while(1){
		print_main();
		start_game();
	}
}


评论