更新内容:优化,夜晚系统完善
操作说明:A,D移动;W跳跃;上,下,右+上,右+下,左+上,左+下撸方块;M开关大地图
#include<bits/stdc++.h>
#include<windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
void move();//玩家移动
void Generate_terrain();//生成地形
int random(int l,int r);//生成l到r的随机数
void Color(int a,int b);//切换字体颜色
void mapcolor(string a);//切换当前字符颜色
void mapdisplay(string s);//输出当前字符对应的形态
void hidden(bool a);//0隐藏光标,1显示光标
void paint(int x,int y,string s);//在x,y地覆盖并输出s
void gotoxy(int x,int y);//移动坐标
string MC_map[2000][2000];//地图
int Scene_color=11;//背景颜色
double the_time=80,sx=0,sy=0;//时间,加速度
int px=100,py=1000,Scene_size_x=7,Scene_size_y=4;//玩家位置x,玩家位置y,屏幕大小x,屏幕大小y
int Falling_objects[1000];
struct theInventory
{
string name;
int number;
};
theInventory Inventory[4][9];
int main()
{
hidden(0);
srand((unsigned)1);
Generate_terrain();//生成地形
for(long long start=0;;start++)
{
the_time+=1;//时间流逝
if(the_time>240) the_time=0;//0点时从头再来
if(70<the_time&&the_time<=180) Scene_color=11;//白天
if(180<the_time&&the_time<=200) Scene_color=3;//傍晚
if(200<the_time||the_time<=50) Scene_color=1;//深夜
if(50<the_time&&the_time<=70) Scene_color=3;//凌晨
for(int x=py-Scene_size_y;x<py+Scene_size_y+1;x++)//输出界面
{
for(int y=px-Scene_size_x;y<px+Scene_size_x+1;y++)
{
gotoxy((y-px+Scene_size_x)*2,x-py+Scene_size_y);
if(x==py-1&&y==px){Color(0,14);cout<<"''";}//输出头
else if(x==py&&y==px){Color(9,9);cout<<" ";}//输出身体
else if(x>=0&&x<2000&&y>=0&&y<2000) gotoxy((y-px+Scene_size_x)*2,x-py+Scene_size_y) ,mapcolor(MC_map[x][y]),mapdisplay(MC_map[x][y]);
int a=int(double(double(int(the_time+40)%240)/90*(Scene_size_x*2)*2)),b=Scene_size_y/2-1;
if((y-px+Scene_size_x)*2==a&&x-py+Scene_size_y==b&&MC_map[x][y]=="空气"&&Scene_color==1)
{
Color(14,14);
gotoxy(a,b);
cout<<"sb";
}
if((y-px+Scene_size_x)*2-1==a&&x-py+Scene_size_y==b&&MC_map[x][y]=="空气"&&Scene_color==1)
{
Color(14,14);
gotoxy(a,b);
cout<<"sb";
}
}
Color(0,0);
cout<<'/'<<endl;
}
Color(7,0);
cout<<px<<" "<<py<<" "<<the_time<<" ";
Sleep(100);//每0.1秒执行一帧
//system("cls");
if(KEY_DOWN('W')&&MC_map[py+1][px]!="空气"&&MC_map[py+1][px][0]!='x') sy=-1;//跳跃
if(KEY_DOWN('D')) sx+=1;//右移动
if(KEY_DOWN('A')) sx-=1;//左移动
if(KEY_DOWN(39)&&KEY_DOWN(38)) MC_map[py-1][px+1]="空气";//右,上
else if(KEY_DOWN(39)&&KEY_DOWN(40)) MC_map[py][px+1]="空气";//右,下
else if(KEY_DOWN(37)&&KEY_DOWN(38)) MC_map[py-1][px-1]="空气";//左,上
else if(KEY_DOWN(37)&&KEY_DOWN(40)) MC_map[py][px-1]="空气";//左,下
else if(KEY_DOWN(38)) MC_map[py-2][px]="空气";//上
else if(KEY_DOWN(40)) MC_map[py+1][px]="空气";//下
if(KEY_DOWN('M'))//展示地形图
{
system("cls");
for(int x=py-100;x<py+100;x++)
{
for(int y=px-100;y<px+100;y++)
{
if(x==py-1&&y==px){Color(0,14);cout<<"''";}
else if(x==py&&y==px){Color(9,9);cout<<" ";}
else if(x>=0&&x<2000&&y>=0&&y<2000) mapcolor(MC_map[x][y]),mapdisplay(MC_map[x][y]);
}
Color(0,0);
cout<<'/'<<endl;
}
while(!KEY_DOWN('M'));//直到按下M关闭地图
}
hidden(0);
for(int s=0;s<abs(int(sx));s++)//x移动
{
if(px>=0&&px<=1999) px+=int(sx)/abs(int(sx));
if(px<0) px=0;
if(px>=2000) px=1999;
if((MC_map[py-1][px]!="空气"&&MC_map[py-1][px][0]!='x')||(MC_map[py][px]!="空气"&&MC_map[py][px][0]!='x')) {px-=int(sx)/abs(int(sx)),sx=0;break;}
}
for(int s=0;s<abs(int(sy));s++)//y移动
{
if(py>=0&&py<2000) py+=int(sy)/abs(int(sy));
if(py<0) py=0;
if(py>=2000) py=1999;
if((MC_map[py][px]!="空气"&&MC_map[py][px][0]!='x')||(MC_map[py-1][px]!="空气"&&MC_map[py-1][px][0]!='x')) {py-=int(sy)/abs(int(sy)),sy=0;break;}
}
sx*=0.5;//摩擦力
sy+=1;//重力
}
return 0;
}
void Game_begins()
{
}
void Generate_terrain()//生成地形
{
int altitude=700;
for(int x=0;x<2000;x++) for(int y=0;y<2000;y++) MC_map[y][x]="空气";
for(int x=0;x<2000;x++)
{
int a=int(2000-double(altitude)/50*49+random(-1,1));
MC_map[1999][x]="基岩";
for(int y=1998;y>a;y--) MC_map[y][x]="石头";
for(int y=a;y>2000-altitude;y--) MC_map[y][x]="泥土";
MC_map[2000-altitude][x]="草块";
int sb=rand();
if(sb%50==5)
{
MC_map[2000-altitude-1][x]="橡木";
MC_map[2000-altitude-2][x]="橡木";
MC_map[2000-altitude-3][x]="橡木";
MC_map[2000-altitude-4][x]="橡木";
MC_map[2000-altitude-4][x-1]="树叶";
MC_map[2000-altitude-4][x-2]="树叶";
MC_map[2000-altitude-4][x+1]="树叶";
MC_map[2000-altitude-4][x+2]="树叶";
MC_map[2000-altitude-5][x]="树叶";
MC_map[2000-altitude-5][x-1]="树叶";
MC_map[2000-altitude-5][x-2]="树叶";
MC_map[2000-altitude-5][x+1]="树叶";
MC_map[2000-altitude-5][x+2]="树叶";
MC_map[2000-altitude-6][x]="树叶";
MC_map[2000-altitude-6][x+1]="树叶";
MC_map[2000-altitude-6][x-1]="树叶";
}
else if(sb%10==2) MC_map[2000-altitude-1][x]="x-草丛";
if(altitude<800) altitude+=random(0,1);
if(altitude>600) altitude+=random(-1,0);
}
}
void make_Falling_objects()
{
}
int random(int l,int r)//生成l到r的随机数
{
return (rand()%(r-l+1))+l;
}
void Color(int a,int b)//切换字体颜色
{
int c;
if(b>=1)c=a+b*16;
else c=a;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void mapcolor(string a)//颜色转化
{
if(a=="空气") Color(Scene_color,Scene_color);
if(a=="基岩") Color(0,8);
if(a=="草块") Color(6,10);
if(a=="泥土") Color(6,6);
if(a=="石头") Color(8,8);
if(a=="橡木") Color(8,6);
if(a=="树叶") Color(10,2);
if(a=="x-草丛") Color(10,Scene_color);//"x-"指没有碰撞箱
}
void mapdisplay(string s)//输出
{
if(s=="空气") cout<<" ";
if(s=="基岩") cout<<"▓▓";
if(s=="草块") cout<<"▅▅";
if(s=="泥土") cout<<"■";
if(s=="石头") cout<<"■";
if(s=="橡木") cout<<"||";
if(s=="树叶") cout<<"▓▓";
if(s=="x-草丛") cout<<"▍▍";
}
void hidden(bool a)//隐藏光标
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut,&cci);
cci.bVisible=a;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut,&cci);
}
void paint(int x,int y,string s)// 在x,y地覆盖并输出s
{
gotoxy(y,x);
cout<<s;
}
void gotoxy(int x, int y)//覆盖清屏 ,从指定行列覆盖
{
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
return ;
}