#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
using namespace std;
float X,Y,X0,Y0,dx,dy;int Left=1,Right=20,Up=1,Down=28;
int Clocknum,T,gap,Life,Speed;float Score;
int up,dn,lf,rt,sy;float Vx,Vy;int Walk,Jump;
int Jumplock,Dnlock,Lflock,Rtlock;
const float G=0.038,t0=0.2,t00=0.8,t000=0.5;
int N[100][45],M[100][45];
float Sin(int a) {return sin(3.1416*a/180);}float Cos(int a) {return cos(3.1416*a/180);}
void Color(int a){if(a==0||a==8||a==-8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==-10||a==1||a==-18) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==-1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED|BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);if(a==-2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_GREEN|FOREGROUND_GREEN);if(a==-3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE|FOREGROUND_RED|FOREGROUND_BLUE);if(a==-4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|FOREGROUND_RED);if(a==-5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|FOREGROUND_RED|FOREGROUND_GREEN);if(a==-6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_BLUE);if(a==-7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
if(a==-11) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);if(a==-12) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_GREEN);if(a==-13) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_BLUE);if(a==-14) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_RED);if(a==-15) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN);if(a==-16) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_INTENSITY|BACKGROUND_BLUE);if(a==-17) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
}
int To_int(float a){return int(a+0.5);}float Abs(float a){return (a>=0)?a:-a;}float Min(float a,float b){return (a<=b)?a:b;}
void Setpos(float x,float y){COORD pos;pos.X=To_int(x)*2+1,pos.Y=To_int(y);SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}
void Put_Frame(int x,int y){for(int i=0;i<=x+1;i++)for(int j=0;j<=y+1;j++){if(i==0||j==0||i==x+1||j==y+1) Setpos(i,j),printf("[]");}}
void Clear(float x,float y){int i=To_int(x),j=To_int(y);
if(i<Left||i>Right||j<Up||j>Down) return;
if(N[i][j]==0) Color(0),Setpos(i,j),printf(" ");
else if(N[i][j]==1) Color(-Abs(N[i][j])),Setpos(i,j),printf("<>");
else if(N[i][j]==5) Color(-Abs(N[i][j])),Setpos(i,j),printf("<>");
else if(N[i][j]==7) Color(-Abs(N[i][j])),Setpos(i,j),printf("__");
else if(N[i][j]==2) Color(-Abs(N[i][j])),Setpos(i,j),printf("[]");
else if(N[i][j]==3) Color(-Abs(N[i][j])),Setpos(i,j),printf("[]");
else if(N[i][j]==4) Color(-Abs(N[i][j])),Setpos(i,j),printf("##");
else Color(-Abs(N[i][j])),Setpos(i,j),printf(" ");
}
void Put_Man(float x1,float y1){
int x=To_int(x1);int y=To_int(y1);
if(y<Up||x<Left||x>Right||y>Down) return;
Color(-10-N[x][y]);
Setpos(x1,y1),printf("㊣");
}
void Cir(int s,int c)
{ int x=X,y=Y;
for(int i=x-s;i<=x+s;i++)
for(int j=y-s;j<=y+s;j++)
{
float k=(i-x)*(i-x)+(j-y)*(j-y)-s*s;
if(i<Left||i>Right||j<Up||j>Down) continue;
if(k<=s&&k>=-s) Setpos(i,j),Color(c),cout<<" ";if(N[i][j]==8) N[i][j]=7;if(N[i][j]==4) N[i][j]=0;
}
if(c==-5) Cir(s-1,-1),Cir(s-2,0);
}
void Go(){
int PrintFlag=0,NotMoveFlag=0;
if(Y<=Up) Y=Up;if(X<=Left) X=Left;if(X>=Right) X=Right;
if(Y>=Down){
if(dx!=0||dy!=0) X=dx,Y=dy,Vy=-0.4,Vx=0;
else Life--,Y=Up;
}
int Here=N[To_int(X)][To_int(Y)],Stand=N[To_int(X)][To_int(Y)+1],Head=N[To_int(X)][To_int(Y)-1],Lft=N[To_int(X)-1][To_int(Y)],Rit=N[To_int(X)+1][To_int(Y)];
if(Life<=0) return;
if(Here==3){Score+=5;N[To_int(X)][To_int(Y)]=2,dx=To_int(X),dy=To_int(Y);}
if((Here==1||Here==7)&&((Vy>0&&Walk==0)||(Walk==1))){Vy=0;Y=To_int(Y)-1;Jump=0;Walk=1;PrintFlag=1;}
else if((Stand==1||Stand==7)&&Vy>0&&Walk==0){Vy=0;Y=To_int(Y);Jump=0;Walk=1;PrintFlag=1;}
else if((Here==1||Here==7)&&Walk==0){Vx*=0.8;Vy*=0.8;Y=To_int(Y)-1;Jump=0;Walk=1;PrintFlag=1;}
else if((Stand==1||Stand==7)&&Walk==0){Vx*=0.8;Vy*=0.8;Y=To_int(Y);Jump=0;Walk=1;PrintFlag=1;}
else if(Here==5&&((Vy>0&&Walk==0)||(Walk==1))){Vx*=0.8;Vy=-0.7;Y=To_int(Y)-1;Jump=0;Walk=0;NotMoveFlag=1;PrintFlag=1;}
else if(Stand==5&&((Vy>0&&Walk==0)||(Walk==1))){Vx*=0.8;Vy=-0.7;Y=To_int(Y);Jump=0;Walk=0;NotMoveFlag=1;PrintFlag=1;}
else if(Here==4){
Score-=5;Y=To_int(Y)-1;Walk=0;PrintFlag=1;Cir(1,-5),Sleep(90),Cir(2,-5),Sleep(100),Cir(3,-5),Sleep(110),Cir(4,-5),Sleep(150);Cir(2,0);Cir(3,0);Cir(4,0);
if(dx!=0||dy!=0) X=dx,Y=dy,Vy=-0.4,Vx=0;
else Life--,Vy=-0.6;
}
else if(Here==8&&Vy>0&&Walk==0){Score+=2;
Vy=0;Y=To_int(Y)-1;Jump=0;Walk=1;PrintFlag=1;int xx=To_int(X);while(N[xx][To_int(Y)]==8) N[xx][To_int(Y)]=7,xx++; xx=To_int(X)-1;while(N[xx][To_int(Y)]==8) N[xx][To_int(Y)]=7,xx--;
}
else if(Here==8&&Vy<=0&&Walk==0){Score+=2;
Vy=0;Y=To_int(Y)+1;Walk=0;PrintFlag=1;int xx=To_int(X);while(N[xx][To_int(Y)]==8) N[xx][To_int(Y)]=7,xx++; xx=To_int(X)-1;while(N[xx][To_int(Y)]==8) N[xx][To_int(Y)]=7,xx--;
}
else if(Stand==8&&Vy>0&&Walk==0){Score+=2;
Vy=0;Y=To_int(Y);Jump=0;Walk=1;PrintFlag=1;int xx=To_int(X);while(N[xx][To_int(Y)+1]==8) N[xx][To_int(Y)+1]=7,xx++; xx=To_int(X)-1;while(N[xx][To_int(Y)+1]==8) N[xx][To_int(Y)+1]=7,xx--;
}
else if(Head==8&&Vy<=0&&Walk==0){Score+=2;
Vy=0;Y=To_int(Y);Walk=0;PrintFlag=1;int xx=To_int(X);while(N[xx][To_int(Y)-1]==8) N[xx][To_int(Y)-1]=7,xx++; xx=To_int(X)-1;while(N[xx][To_int(Y)-1]==8) N[xx][To_int(Y)-1]=7,xx--;
}
else if(Stand==1&&Vy==0&&Walk==1) int nil=0;
else if(Stand==7&&Vy==0&&Walk==1) int nil=0;
else Walk=0;
int Num=up+dn+lf+rt;
if(Walk==1&&Jump==0){
if(Num==0) Vx*=0.6;
if(up==1&&Jumplock==0){
Vy=-0.6;Walk=0;Jump=1;Jumplock=1;
}
if(dn==1&&Dnlock==0){
Y+=2;Walk=0;Dnlock=1;
}
}
if(Num==1||(Num==2&&up==1)){
if(lf==1){
if(Jump==0){
if(Vx<=1.5*t0&&Vx>-0.5*t0) Vx-=0.5*t0;
if(Vx<=-0.5*t0&&Vx>-1.5*t0) Vx-=0.3*t0;
else if(Vx<=-1.5*t0) Vx=-1.5*t0;
}
else{
if(Vx<=1.5*t0&&Vx>-1.5*t0) Vx-=0.3*t0;
else if(Vx<=-1.5*t0) Vx=-1.5*t0;
}
}
if(rt==1){
if(Jump==0){
if(Vx>=-1.5*t0&&Vx<0.5*t0) Vx+=0.5*t0;
if(Vx>=0.5*t0&&Vx<1.5*t0) Vx+=0.3*t0;
else if(Vx>=1.5*t0) Vx=1.5*t0;
}
else{
if(Vx<=1.5*t0&&Vx>-1.5*t0) Vx+=0.2*t0;
else if(Vx>=1.5*t0) Vx=1.5*t0;
}
}
}
if(Walk==0){
int num=up+dn;
if(Num==0) Vx*=0.9;
if(num==1&&up==1&&Jump==0&&Jumplock==0){
Vy=-0.6;Walk=0;Jump=1;Jumplock=1;
}
if(num==1&&up==1&&Jump==1&&Jumplock==0){
if(Vy>-0.2) Vy=-0.35;
if(Vy<=-0.2) Vy-=0.2;
Jump=2;Jumplock=1;
}
if(num==1&&dn==1){
Vy+=0.1;
}
Vy+=G;
}
Vy=Min(0.5,Vy);
if(NotMoveFlag==0) X+=Vx,Y+=Vy;
if(Y<=Up) Y=Up;if(X<=Left) X=Left;if(X>=Right) X=Right;if(Y>=Down) Y=Down;
if(PrintFlag==1) Clear(X0,Y0),Put_Man(X,Y),X0=X,Y0=Y;
else if((To_int(X0)==To_int(X)&&To_int(Y0)==To_int(Y))&&Walk==0) Put_Man(X,Y),X0=X,Y0=Y;
else if((To_int(X0)!=To_int(X)||To_int(Y0!=To_int(Y)))&&T%gap==0) Clear(X0,Y0),Put_Man(X,Y),X0=X,Y0=Y;
}
void Move(){
}
int RR;
void Creat(){
if(dx!=0||dy!=0) dy++;if(dy>Down) dx=dy=0;
for(int i=Left;i<=Right;i++){
for(int j=Up;j<=Down;j++) N[i][j]=M[i][j-1];
N[i][Up-1]=0;
}
RR++;
if(RR==4) {int r=rand()%2;if(r==0) RR=0;}
if(RR==5) {int r=rand()%4;if(r<=2) RR=0;}
if(RR==6) RR=0;
if(RR==0) {
int j=Up;
Ax: int Bx=0; for(int i=Left;i<=Right;i++) N[i][j]=N[i][j-1]=0;
for(int i=Left;i<=Right;i+=3){
int R1=rand()%3+2,R2=rand()%4+3,R3=3;
int R=rand()%70+1;
if(R<=10||R==25) {Bx++;int k=1,kk=R2;while(R2>0&&i<=Right) {N[i][j]=1;int R4=rand()%25;if(R4==0&&k!=1&&k!=kk) N[i][j+1]=N[i][j+2]=1;else if(R4<=3&&k!=1&&k!=kk) N[i][j+1]=1; i++,k++,R2--;}}
if(R>21&&R<=24) {Bx++;int k=1,kk=R2;while(R2>0&&i<=Right) {N[i][j-1]=1;if(k==1||k==kk) N[i][j]=1;i++,k++,R2--;}}
if(R>10&&R<=13) {Bx++;while(R2>0&&i<=Right) N[i][j]=5,i++,R2--;}
if(R>13&&R<=16) {while(R1>0&&i<=Right) N[i][j]=4,i++,R1--;}
if(R>16&&R<=19) {Bx++;while(R1>0&&i<=Right) N[i][j]=8,i++,R1--;}
if(R>19&&R<=21) {Bx++;while(R3>0&&i<=Right) {N[i][j]=N[i][j+1]=1;if(R3==2) N[i][j-1]=3,N[i][j+1]=0;i++,R3--;}}
}
if(Bx==0) goto Ax;
}
else if(RR==2){
int j=Up;
for(int i=Left+1;i<=Right-1;i++){
int R=rand()%300+1;
if(R==1) N[i-1][j]=N[i+1][j]=N[i][j-1]=N[i][j+1]=N[i][j]=4,i+=3;
if(R==2) N[i-1][j]=N[i][j]=N[i][j+1]=N[i][j+2]=1,i+=3;
if(R==3) N[i+1][j]=N[i][j]=N[i][j+1]=N[i][j+2]=1,i+=3;
}
}
}
void Print(){
Color(1);Setpos(23,1),cout<<"分数:"<<max(0,(int)Score)<<" ",Setpos(23,3),cout<<"速度:"<<Speed<<" ",Setpos(23,5),cout<<"生命:"<<Life<<" ",Color(0);
for(int i=Left;i<=Right;i++)
for(int j=Up-1;j<=Down;j++){
if(j>=Up&&N[i][j]!=M[i][j]){
if(N[i][j]==0) Color(0),Setpos(i,j),printf(" ");
else if(N[i][j]==1) Color(-Abs(N[i][j])),Setpos(i,j),printf("<>");
else if(N[i][j]==5) Color(-Abs(N[i][j])),Setpos(i,j),printf("<>");
else if(N[i][j]==7) Color(-Abs(N[i][j])),Setpos(i,j),printf("__");
else if(N[i][j]==2) Color(-Abs(N[i][j])),Setpos(i,j),printf("[]");
else if(N[i][j]==3) Color(-Abs(N[i][j])),Setpos(i,j),printf("[]");
else if(N[i][j]==4) Color(-Abs(N[i][j])),Setpos(i,j),printf("##");
else Color(-Abs(N[i][j])),Setpos(i,j),printf(" ");
}
M[i][j]=N[i][j];
}Color(0);
}
void Start(){
for(int j=1;j<=12;j++) Creat(),Print();
for(int i=Left;i<=Right;i++) N[i][14]=N[i][15]=1;Color(0);
Setpos(23,7),cout<<"规则:";
Setpos(23,8),cout<<"←→左右移动";
Setpos(23,9),cout<<"按↑跳跃,可二段跳";
Setpos(23,10),cout<<"空中可用←→控制方向";
Setpos(23,11),cout<<"空气阻力大,远距离大跳需要空中长按←→";
Setpos(23,12),cout<<"白的是正常块。黄的是弹跳块,可借助其三段跳" ;
Setpos(23,13),cout<<"看不见的是隐形块,撞到了可以加分,但要小心!" ;
Setpos(23,14),cout<<"紫色的是复活点,走到那里才能激活它" ;
Setpos(23,15),cout<<"激活复活点有5分加分,这很多" ;
Setpos(23,16),cout<<"红色的是炸弹,碰到会扣分,没复活点时会扣命" ;
Setpos(23,17),cout<<"掉出视线也会没命,一定要飞速向上跳!" ;
Setpos(23,18),cout<<"地图下移速度随时间增加" ;
Setpos(23,19),cout<<"1000分通关!!!" ;
Setpos(23,20),cout<<"程序保证每一行都有块生成" ;
Setpos(23,21),cout<<"如果你看不到哪有,就说明那一行有隐形块" ;
Setpos(23,22),cout<<"空格键可以暂停" ;
Setpos(23,23),cout<<"还有这是随机出的图哦~有时候要看运气" ;
Setpos(23,24),cout<<"死亡后分数并不会全部消失,可以放心玩耍,总会通关的!" ;
Setpos(23,26),cout<<"这是《胎神之路》的 win11 适配流畅版" ;
Setpos(23,27),cout<<"胎神大大还有很多创意准备升级这款游戏哦!敬请期待!" ;
}
void Return(){
system("color 1A");Sleep(10);
system("color 2B");Sleep(10);
system("color 3C");Sleep(10);
system("color 0F");system("cls");
}
int main()
{
Put_Frame(Right,Down);
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
srand((unsigned)time(NULL));
ST:
memset(N,0,sizeof(N));memset(M,0,sizeof(M));
T=0;Clocknum=0;gap=3;Life=5;
X=10;Y=12;X0=X,Y0=Y;Vx=Vy=0;Jump=1;
Start();
Put_Man(X,Y);
while((int)Score<=1000&&Life>0) if(clock()-Clocknum>=25)
{T++;
Clocknum=clock();
up=dn=lf=rt=0;
if(GetAsyncKeyState(VK_UP)&0x8000) up=1;else Jumplock=0;
if(GetAsyncKeyState(VK_DOWN)&0x8000) dn=1;else Dnlock=0;
if(GetAsyncKeyState(VK_LEFT)&0x8000) lf=1;else Lflock=0;
if(GetAsyncKeyState(VK_RIGHT)&0x8000) rt=1;else Rtlock=0;
if(kbhit()) {char g=_getch();if(g==' ') Sleep(100),Setpos(2,3),sy++,Color(0),system("pause");}
if(sy>=1) Setpos(2,3),cout<<" ",sy=0;
Move();
Go();
if(Score<=10) Speed=40;
else if(Score<=30) Speed=30;
else if(Score<=100) Speed=20;
else if(Score<=250) Speed=15;
else if(Score<=400) Speed=10;
else if(Score<=700) Speed=8;
else if(Score<=800) Speed=6;
else if(Score<=900) Speed=5;
else if(Score<=1000) Speed=4;
if(T%gap==0) Print();
if(T%Speed==0){Creat(),Clear(X0,Y0),Y++,X0=X,Y0=Y,Print(),Put_Man(X,Y);
if(Score<=100) Score+=1;
else if(Score<=250) Score+=0.8;
else if(Score<=800) Score+=0.5;
else if(Score<=900) Score+=0.4;
else if(Score<=1000) Score+=0.3;
}
}
if(Life<=0) {Print();Setpos(4,10),system("color 7F"),Color(4),cout<<"You! Die!!!",Sleep(1000);Score=((int)Score/100)*100;if(Score>500&&Score<=700) Score=500;if(Score>700&&Score<=800) Score=600;if(Score>800&&Score<=900) Score=700;if(Score>900) Score=800;}
else {Setpos(4,10),system("color 6E"),Color(3),cout<<"You! Win!!!",Sleep(1000);}
Setpos(1,12),cout<<"Please point 'y' to Play AGain.";Color(0);
A:char e=_getch();if(e=='y') Return();else goto A;goto ST;
return 0;
}