#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();
}
}