C++:自治我的世界2D.V0.0.3

更新内容:增加草,优化草方块材质,按M开启大地图,再按M关闭大地图

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 the_time=80;//时间 
double sx=0,sy=0;//加速度 
int px=100,py=1000;//玩家位置 
int Falling_objects[1000];
struct theInventory
{
	string name;
	int number;
};
theInventory Inventory[4][9];


int main()
{
	hidden(0); 
	srand((unsigned)10);
	Generate_terrain();//生成地形
	for(long long start=0;;start++)
	{
		for(int x=py-4;x<py+5;x++)//输出界面 
		{
			for(int y=px-7;y<px+8;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;
		}
		Color(7,0);
		cout<<px<<" "<<py;
		
		
		
		
		
		
		Sleep(50);//每0.05秒执行一帧 
		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关闭地图 
		}
		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(11,11);
	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,11);//"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 coord;
	coord.X=x;
	coord.Y=y;
	SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值