C++2D城建小游戏<<城市之光3>>

@保护建国同志 - 游戏编程 🕹️ (233tw.com)请不要抄袭

1.0.3.1564 (更新:2021.11.17)

 

新增水力网和电力网查看

#include<bits/stdc++.h>
#include<ctime>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<cstdio>
#include<time.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
CONSOLE_FONT_INFO consoleCurrentFont;
using namespace std;
long long money=100000,people=0,light=3;
int l_x=100,l_y=100,xx=100,yy=100;
string b_n[11]={};
int b_n_t[11]={},b_num[11]={},b_p[11]={},b_where[11][3]={},b_work=0; 
struct
{
	void color(int all){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),all);}
	void wait(int all){Sleep(all);}
	void cls(){system("cls");}
	void b(short hz,double time){Beep(hz,time);}
	void gt(int x,int y)
	{
		COORD coord;
		coord.X=y;//Here, the order is reversed, otherwise, the output pointer is moved to Y row and X column
		coord.Y=x;
		HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorPosition(a,coord);
	}
}basic;
struct
{
	struct
	{
		short m[5][200][200]={};
		bool a[5][200][200]={};
		double p[200][200]={};
	}map;
	struct
	{
		string photo[50][5]={
		{"金","金","金","金","金"}, //0 
		{"│ ","--","□","◎"/*信号灯-绿*/,"◎"/*信号灯-红*/},
		{"■","■","■","■","错"},
		{"工","工","工","工","错"},
		{"◆","◆","◆","◆","错"},
		{"●","●","●","●","错"},//5 
		{"●","●","●","●","错"},
		};
		short color[50][5]={
		{170,170,170,170,170}, //0
		{143,143,143,130,132},
		{167,165,164,166,79},
		{143,143,143,143,79}, 
		{167,165,164,166,79},
		{161,161,161,161,79},//5 
		{175,175,175,175,79},
		{175,175,175,175,79},
		};
	}library;
	struct
	{
		string building_name[100]={};
		short building_in_people[100]={};
		short need_money[100]={};
		short need_time[100]={};//秒 
		int new_building(int number,string building_name_,short many_people,short need_money_,short build_need_time)
		{
			building_in_people[number]=many_people,building_name[number]=building_name_,need_money[number]=need_money_,need_time[number]=build_need_time;
		} 
		int start_game()
		{
			new_building(0,"荒地",0,0,0); 
			new_building(1,"公路",0,0,0); 
			new_building(2,"住宅",10,5000,20); 
			new_building(3,"工地",0,0,0); 
			new_building(4,"公寓",20,9000,40); 
			new_building(5,"供水站",0,1000,60); 
			new_building(6,"发电站",0,1000,60); 
		}
		std::string get_name(int number)
		{
			string a=building_name[number]+" 价格:"+to_string(need_money[number]) +" 所需时间:"+to_string(need_time[number])+"秒";
			if(building_in_people[number]!=0)a=a+" 增加人口:"+to_string(building_in_people[number])+" 需要一些基础设施,如:供水站,发电站";
			return a;
		}
	}building;
}m;
int o_check(int number,int x,int y)
{
	basic.cls();
	b_work=1;
	basic.color(15) ;
	printf("正在联系光城建设五局.\n"); 
	basic.wait(100) ;
	printf("正在询问对方能否承包%s项目.\n",m.building.building_name[number].c_str()); 
	basic.wait(100) ;
	printf("对方正在研讨承包%s项目的问题.\n",m.building.building_name[number].c_str()); 
	basic.wait(100) ;
	if(money<=m.building.need_money[number]+1)
	{
		printf("对方拒绝承包%s项目\n原因:市财政局无法支付其承包费用\n",m.building.building_name[number].c_str() ); 
		system("pause") ;
	}
	else
	{
		bool ok=true;
		for(int i=0;i<=10;i++) 
		{
			if(b_n[i]=="") 
			{
				ok=false;
				m.map.m [1][xx][yy]=3;
				printf("对方接受承包%s项目\n市财政局已经对光城建设五局支付了此项目的费用%i元\n",m.building.building_name[number].c_str(),m.building.need_money[number]); 
				system("pause") ;
				b_n[i]=m.building.building_name[number],b_where[i][1]=x,b_where[i][2]=y,b_n_t[i]=m.building.need_time[number],b_num[i]=number,money=money-m.building.need_money[number],b_p[i]=m.building.building_in_people[number];
				break;
			}
		}
		if(ok)
		{
			printf("对方拒绝承包%s项目\n原因:对方工程设施不足,无法承包此项目\n",m.building.building_name[number].c_str()); 
			system("pause") ;
		}
	}
	b_work=0;
	basic.cls();
}//*/
DWORD WINAPI making_building(LPVOID lpParamter)
{
	while(1)
	{
		if(light==3)light=4;
		else light=3;
		for(int c=0;c<=5;c++) 
		{
			if(b_work!=0)continue;
			Sleep(1000);
			for(int i=0;i<=10;i++)
			{
				if(b_n[i]!="")
				{
					if(b_n_t[i]<=0)
					{
						b_n[i]="",b_n_t[i]=0;
						m.map.m[1][b_where[i][1]][b_where[i][2]]=b_num[i],m.map.m[2][b_where[i][1]][b_where[i][2]]=rand()%3,people=people+b_p[i];
						b_where[i][1]=0,b_where[i][2]=0,b_num[i]=0,b_p[i]=0;
					}
					else b_n_t[i]--;
				}
			}
		}
	}
}
//bool find start
	bool find_street(int wich,int x,int y,bool t_f) //电力,水...扩散函数 
	{
		short i=wich,arrow=0;
		if(m.map.m[1][x+1][y]==1)m.map.a[i][x+1][y]=t_f,arrow++;
		if(m.map.m[1][x-1][y]==1)m.map.a[i][x-1][y]=t_f,arrow++;
		if(m.map.m[1][x][y+1]==1)m.map.a[i][x][y+1]=t_f,arrow++;
		if(m.map.m[1][x][y-1]==1)m.map.a[i][x][y-1]=t_f,arrow++;
		bool z=false;
		if(arrow>=1)z=true;//附近有公路返回真,反之返回假 
		return z;
	}
	bool home_check(int wich,int x,int y)// 居民获取水力电力...函数 
	{
		bool z=false;
		short i=wich,arrow=0;
		if(m.map.m[1][x+1][y]==1&&m.map.a[i][x+1][y]) arrow++;
		if(m.map.m[1][x-1][y]==1&&m.map.a[i][x-1][y]) arrow++;
		if(m.map.m[1][x][y+1]==1&&m.map.a[i][x][y+1]) arrow++;
		if(m.map.m[1][x][y-1]==1&&m.map.a[i][x][y-1]) arrow++;
		if(arrow>=1)z=true;//附近的公路链接水利电力...则返回真,反之返回假 
		return z;
	} 
//bool find end
DWORD WINAPI trafic_working(LPVOID lpParamter)
{
	while(1)
	{
		int p_=0;
		for(int x=1;x<=199;x++)
		{
			for(int y=1;y<=199;y++)
			{
				p_=p_+m.building.building_in_people[m.map.m[1][x][y]];
				if(m.map.m[1][x][y]==1)
				{
					for(int i=0;i<=4;i++)
					{
						if(m.map.a[i][x][y]) find_street(i,x,y,true);
					}
					if((m.map.m[1][x+1][y]==1||m.map.m[1][x-1][y]==1)&&(m.map.m[1][x][y+1]!=1&&m.map.m[1][x][y-1]!=1))m.map.m[2][x][y]=0;
					else if((m.map.m[1][x][y+1]==1||m.map.m[1][x][y-1]==1)&&(m.map.m[1][x+1][y]!=1&&m.map.m[1][x-1][y]!=1))m.map.m[2][x][y]=1;//else if((m.map.m[1][x][y+1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y+1]==1&&m.map.m[1][x-1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x-1][y]==1))m.map.m[2][x][y]=2;
					else 
					{
						int arror=0;
						if(m.map.m[1][x+1][y]==1)arror++;
						if(m.map.m[1][x-1][y]==1)arror++;
						if(m.map.m[1][x][y+1]==1)arror++;
						if(m.map.m[1][x][y-1]==1)arror++;
						if(arror>=3)m.map.m[2][x][y]=light;
						else m.map.m[2][x][y]=2;
					}
				}
				else if(m.map.m[1][x][y]==2||m.map.m[1][x][y]==4)
				{
					if(home_check(1,x,y)&&home_check(2,x,y)) 
					{
						m.map.m[2][x][y]=1;
					}
					else
					{
						m.map.m[2][x][y]=4;
					}
				} 
				else if(m.map.m[1][x][y]==5||m.map.m[1][x][y]==6)
				{
					if(find_street(m.map.m[1][x][y]-4,x,y,true))m.map.m[2][x][y]=1;
					else m.map.m[2][x][y]=4;
				}
			}
		}
		people=p_;
	}
}
struct
{
	LONG x=-1,y=-1,lest_x=-1,lest_y=-1;
	double real_x,real_y;
	POINT pt= {0,0};
	CONSOLE_FONT_INFO l_z;
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFO x_z;
	int do_=1;
	void get_real_mouse()
    {
    	basic.cls();printf("鼠标校正,请用鼠标点击右下角的\"Hi\"");
		int x=rand()%10+35,y=rand()%10+75;
		basic.gt(x,y);printf("Hi");
		while(1)
		{
			GetCursorPos(&pt);    //获取鼠标当前位置
			ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
			if(KEY_DOWN(VK_LBUTTON)&&MessageBox(0,"您确定您点击了\"Hi\"吗?\n如果您没有点击此点可能会导致程序错乱.","鼠标校正",4)==IDYES)
			{
				real_x=pt.x/y,real_y=pt.y/x;
				break;
			}
		}
		basic.wait(500); basic.cls();
	}
	void mouse()
	{
		GetCurrentConsoleFont(hOutput, FALSE, &x_z);
		if(do_==1)do_=0;
		else if((do_==0)&&(l_z.dwFontSize.X!=x_z.dwFontSize.X||l_z.dwFontSize.Y!=x_z.dwFontSize.Y))
		{
			do_=1;
			basic.color(15) ;
			basic.cls();
			printf("检测到您在修改字体!\n请您修改完字体后按任意键/点击进行强制鼠标校正");
			while(1) 
			{
				if(_kbhit()||KEY_DOWN(VK_LBUTTON)||KEY_DOWN(VK_RBUTTON))break;
			}
			basic.cls(); 
			get_real_mouse();
		}
		l_z.dwFontSize.X=x_z.dwFontSize.X,l_z.dwFontSize.Y=x_z.dwFontSize.Y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
		GetCursorPos(&pt);    //获取鼠标当前位置 
		ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
		pt.y=pt.y/real_y,pt.x=(pt.x/real_x);
		lest_y=y,lest_x=x;
		x=pt.x,y=pt.y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
	} 
}mouse;
struct
{//移动库
	int num_get()
	{
		int num=0,ans=1,fu=0;
		int life[10]={};
		short now_key,key,lk;
		for(int i=1;i<=5;i++)
		{
			now_key=(int)getch()-48;
			key=now_key+48;
			if(key==13)break;
			else if(now_key==-40)
			{
				if(lk!=49)
				{
					i=0,ans=0,num=0,fu=0;
					for(int q=0;q<=9;q++)life[q]=0;
					printf("(重新输入)");
				}
			}
			else if(key==45){ fu=1,i--;printf("(此数已经设定为负数)");}
			else if(now_key>9||now_key<0)i--;
			else printf("%i",now_key);
			lk=now_key;
			life[i]=now_key,ans++;
		}
		int d=1;
		//for(int i=1;i<=ans;i++)d=d*10;
		for(int i=ans;i>=1;i--)
		{
			num=num+life[i]*d;
			d=d*10;
		}
		if(fu==1)num=num*-1;
		return num/10;
	}
	string whats[10]={},title="",about_things="null";
	int ai_choose(void)
	{
		basic.cls();
		short how_long=0,wait_=1;
		for(int i=1;i<=9;i++)
		{
			if(whats[i]!="")how_long++;
			else break;
		}
		int choose;
		while(1)
		{
			choose=-1;
			basic.gt(1,0);
			mouse.mouse();
			if(mouse.y==1)choose=1;
			printf("%s",title.c_str());
			if(choose==1){basic.color(16+7);printf("(?)\n");}
			else {basic.color(7);printf("     \n");}
			short x=1;
			for(int i=1;i<=how_long;i++)
			{
				x++;
				if(mouse.y==x)choose=x;
				if(choose==i+1)basic.color(16*15);
				else basic.color(7);
				printf("%s\n",whats[i].c_str());
			}
			basic.color(0)  ;
			printf("\n金鹏游戏") ; 
			if(wait_==1){basic.wait(500);wait_=0;}
			if(KEY_DOWN(VK_LBUTTON)&&choose>1)break;
			else if(KEY_DOWN(VK_LBUTTON)&&choose==1)
			{
				string about="关于"+title;
				if(about!="null")MessageBox(0,about_things.c_str(),about.c_str(),MB_OK);
			}
		}
		for(int i=1;i<=9;i++)whats[i]="";
		title="",about_things="null";
		basic.cls();
		return choose-1;
	}
}choose;
int make_do() 
{
	basic.cls();
	while(1) 
	{
		choose.about_things="null",choose.title="建造建筑物",choose.whats[1]="取消", choose.whats[2]="住房", choose.whats[3]="基础建设"; 
		short c=choose.ai_choose(); 
		basic.cls();
		if(c==1)break;
		else if(c==2)
		{
			choose.about_things="null",choose.title="住房",choose.whats[1]="取消", choose.whats[2]=m.building.get_name(2) , choose.whats[3]=m.building.get_name(4); 
			c=choose.ai_choose(); 
			if(c==2) o_check(2,xx,yy); 
			else if(c==3) o_check(4,xx,yy);  
			if(c!=1)break;
		}
		else if(c==3)
		{
			choose.about_things="null",choose.title="基础建设",choose.whats[1]="取消", choose.whats[2]=m.building.get_name(5), choose.whats[3]=m.building.get_name(6); 
			c=choose.ai_choose(); 
			if(c==2) o_check(5,xx,yy); 
			else if(c==3) o_check(6,xx,yy);  
			if(c!=1)break;//*/ 
		}
		basic.cls();
	}
	basic.cls();
}
int look_do() 
{
	basic.cls();
	while(1)
	{
		basic.gt(0,0)  ;
		printf("工程进度 E 返回主界面\n");
		for(int i=0,w=0;i<=10;i++) 
		{
			if(b_n[i]!="")
			{
				w++;
				printf("第%i个工程:%s 坐标(%i,%i)剩余完工时间%i秒               \n",w,b_n[i].c_str(),b_where[i][1],b_where[i][2],b_n_t[i]);
			}
		}
		for(int i=0;i<=4;i++) printf("                                                \n") ;
		
		if(GetAsyncKeyState((int)'E'))break;
	}
	basic.cls(); 
}
int out_m()
{
	basic.gt(0,0) ;
	short color=0;
	for(int m_x=l_x-10,x=0;m_x<=l_x+10;m_x++,x++) 
	{
		for(int m_y=l_y-10,y=0;m_y<=l_y+10;m_y++,y++) 
		{
			if(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]!=color)
			{
				basic.color(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]);
				color=m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]];
			}
			printf("%s",m.library.photo[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]].c_str() );
		}
		printf("\n"); 
	}
	basic.color(15) ;
	printf("x-%i,y-%i,see_x-%i,see_y-%i      \n城市人口:%lld 市财政局还有%lld元                   \n提示:AWSD 移动视角 Q 取消当前操作 U 查看电/水等网络\nP 放置公路 L 摧毁建筑物/公路 O 查看建造进度\nI 在当前光标处修建建筑物",yy,xx,l_x,l_y,people,money);
}
int mover()
{
	if(GetAsyncKeyState((int)'D')&&l_y<189)l_y++;
	else if(GetAsyncKeyState((int)'A')&&l_y>11)l_y--;
	else if(GetAsyncKeyState((int)'S')&&l_x<189)l_x++;
	else if(GetAsyncKeyState((int)'W')&&l_x>11)l_x--;
}
int monator(int see)
{
	while(1)
	{
		basic.gt(0,0);
		for(int m_x=l_x-10,x=0;m_x<=l_x+10;m_x++,x++) 
		{
			for(int m_y=l_y-10,y=0;m_y<=l_y+10;m_y++,y++) 
			{
				if(m.map.m[1][m_x][m_y]==1)
				{
					if(m.map.a[see][m_x][m_y]) basic.color(170);
					else basic.color(79);
				}
				else basic.color(0);
				printf(" ");
			}
			printf("\n"); 
		}	
		basic.color(7) ; 
		printf("x-%i y-%i E 退出        ",yy,xx); 
		mover();
		if(GetAsyncKeyState((int)'E'))break; 
	}
}
int message_clean()
{
	for(int x=1;x<=199;x++)
	{
		for(int y=1;y<=199;y++)
		{
			for(int z=0;z<=5;z++)
				m.map.a[z][x][y]=false;
		}
	}
}
int game()
{
	CreateThread(NULL,0,trafic_working,NULL,0,NULL);
	CreateThread(NULL,0,making_building,NULL,0,NULL);
	int doing=0;//0无操作 1放置公路 2摧毁建筑物 
	while(1)
	{
		out_m();
		mouse.mouse();
		if(mouse.y<=21&&mouse.x<=21*2)yy=(mouse.x/2)+l_y-10,xx=mouse.y+l_x-10;
		mover();
		if(GetAsyncKeyState((int)'P')) doing=1;
		else if(GetAsyncKeyState((int)'L')) doing=2;
		else if(GetAsyncKeyState((int)'Q')) doing=0;
		else if(GetAsyncKeyState((int)'O')) look_do();
		else if(GetAsyncKeyState((int)'U')) 
		{
			while(1) 
			{
				basic.cls();
				choose.about_things="null",choose.title="查看网",choose.whats[1]="取消",choose.whats[2]="电力网",choose.whats[3]="水力网";
				int a=choose.ai_choose();
				a--;
				if(a>=1) monator(a);
				else break;
				basic.cls();
			}
		} 
		else if(GetAsyncKeyState((int)'I')) 
		{
			
			if(m.map.m[1][xx][yy]==0)
			{
				int arror=0;
				if(m.map.m[1][xx+1][yy]==1)arror++;
				if(m.map.m[1][xx-1][yy]==1)arror++;
				if(m.map.m[1][xx][yy+1]==1)arror++;
				if(m.map.m[1][xx][yy-1]==1)arror++;
				if(arror>=1)make_do();
				else MessageBox(0,"请在公路旁建造建筑物","提示",MB_OK);
			}
			else MessageBox(0,"您不能在其它建筑物/公路上建造建筑物","提示",MB_OK);
		}
		if(KEY_DOWN(VK_LBUTTON))
		{
			if(doing==1&&m.map.m[1][xx][yy]==0)m.map.m[1][xx][yy]=1;
			else if(doing==2&&m.map.m[1][xx][yy]!=0)
			{
				m.map.m[1][xx][yy]=0;
				message_clean();
			}
			else
			{
				string what="这个建筑物缺少:\n",why="废弃的建筑物-"+m.building.building_name[m.map.m[1][xx][yy]]+"-废弃原因";
				if(m.map.m[1][xx][yy]<=2&&m.map.m[2][xx][yy]==4)
				{
					if(!find_street(1,xx,yy,false))what=what+"·没有公路网连接\n";
					else
					{
						if(!home_check(1,xx,yy)) what=what+"·没有电力网连接\n";
						if(!home_check(2,xx,yy)) what=what+"·没有水力网连接\n";
					}	
					MessageBox(0,what.c_str(),why.c_str(),MB_OK);
				}
			}
		}
	}
}
int main()
{
	system("mode con cols=150 lines=40");
	printf("loading...");
	m.building.start_game();
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;  //移除快速编辑模式
	mode &= ~ENABLE_INSERT_MODE;      //移除插入模式
    mode &= ~ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, mode);
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
	basic.cls() ;
	system("title 城市之光3"); basic.color(15); basic.gt(3,6);printf("made by heveral(白.)");basic.wait(500);basic.cls();mouse.get_real_mouse();
	while(1)
	{
		choose.about_things="开始界面选择",choose.title="城市之光3",choose.whats[1]="开始游戏", choose.whats[2]="打开金鹏游戏官网", choose.whats[3]="关闭游戏";
		short a=choose.ai_choose();
		if(a==1)game();
		else if(a==2)system("start http://jinpeng-game.ys168.com/");
		else if(a==3) break;
	}
}

  V1.0.2.1092(更新:2021.11.14)

更新内容:新增电力和水力系统.

#include<bits/stdc++.h>
#include<ctime>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<cstdio>
#include<time.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
CONSOLE_FONT_INFO consoleCurrentFont;
using namespace std;
long long money=100000,people=0,light=3;
int l_x=100,l_y=100,xx=100,yy=100;
string b_n[11]={};
int b_n_t[11]={},b_num[11]={},b_p[11]={},b_where[11][3]={},b_work=0; 
struct
{
	void color(int all){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),all);}
	void wait(int all){Sleep(all);}
	void cls(){system("cls");}
	void b(short hz,double time){Beep(hz,time);}
	void gt(int x,int y)
	{
		COORD coord;
		coord.X=y;//Here, the order is reversed, otherwise, the output pointer is moved to Y row and X column
		coord.Y=x;
		HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorPosition(a,coord);
	}
}basic;
struct
{
	struct
	{
		short m[5][200][200]={};
		bool a[5][200][200]={};
		double p[200][200]={};
	}map;
	struct
	{
		string photo[50][5]={
		{"金","金","金","金","金"}, //0 
		{"│ ","--","□","◎"/*信号灯-绿*/,"◎"/*信号灯-红*/},
		{"■","■","■","■","错"},
		{"工","工","工","工","错"},
		{"◆","◆","◆","◆","错"},
		{"●","●","●","●","错"},//5 
		{"●","●","●","●","错"},
		};
		short color[50][5]={
		{170,170,170,170,170}, //0
		{143,143,143,130,132},
		{167,165,164,166,79},
		{143,143,143,143,79}, 
		{167,165,164,166,79},
		{161,161,161,161,79},//5 
		{175,175,175,175,79},
		{175,175,175,175,79},
		};
	}library;
	struct
	{
		string building_name[100]={};
		short building_in_people[100]={};
		short need_money[100]={};
		short need_time[100]={};//秒 
		int new_building(int number,string building_name_,short many_people,short need_money_,short build_need_time)
		{
			building_in_people[number]=many_people,building_name[number]=building_name_,need_money[number]=need_money_,need_time[number]=build_need_time;
		} 
		int start_game()
		{
			new_building(0,"荒地",0,0,0); 
			new_building(1,"公路",0,0,0); 
			new_building(2,"住宅",10,5000,20); 
			new_building(3,"工地",0,0,0); 
			new_building(4,"公寓",20,9000,40); 
			new_building(5,"供水站",0,1000,60); 
			new_building(6,"发电站",0,1000,60); 
		}
		std::string get_name(int number)
		{
			string a=building_name[number]+" 价格:"+to_string(need_money[number]) +" 所需时间:"+to_string(need_time[number])+"秒";
			if(building_in_people[number]!=0)a=a+" 增加人口:"+to_string(building_in_people[number])+" 需要一些基础设施,如:供水站,发电站";
			return a;
		}
	}building;
}m;
int o_check(int number,int x,int y)
{
	basic.cls();
	b_work=1;
	basic.color(15) ;
	printf("正在联系光城建设五局.\n"); 
	basic.wait(100) ;
	printf("正在询问对方能否承包%s项目.\n",m.building.building_name[number].c_str()); 
	basic.wait(100) ;
	printf("对方正在研讨承包%s项目的问题.\n",m.building.building_name[number].c_str()); 
	basic.wait(100) ;
	if(money<=m.building.need_money[number]+1)
	{
		printf("对方拒绝承包%s项目\n原因:市财政局无法支付其承包费用\n",m.building.building_name[number].c_str() ); 
		system("pause") ;
	}
	else
	{
		bool ok=true;
		for(int i=0;i<=10;i++) 
		{
			if(b_n[i]=="") 
			{
				ok=false;
				m.map.m [1][xx][yy]=3;
				printf("对方接受承包%s项目\n市财政局已经对光城建设五局支付了此项目的费用%i元\n",m.building.building_name[number].c_str(),m.building.need_money[number]); 
				system("pause") ;
				b_n[i]=m.building.building_name[number],b_where[i][1]=x,b_where[i][2]=y,b_n_t[i]=m.building.need_time[number],b_num[i]=number,money=money-m.building.need_money[number],b_p[i]=m.building.building_in_people[number];
				break;
			}
		}
		if(ok)
		{
			printf("对方拒绝承包%s项目\n原因:对方工程设施不足,无法承包此项目\n",m.building.building_name[number].c_str()); 
			system("pause") ;
		}
	}
	b_work=0;
	basic.cls();
}//*/
DWORD WINAPI making_building(LPVOID lpParamter)
{
	while(1)
	{
		if(light==3)light=4;
		else light=3;
		for(int c=0;c<=5;c++) 
		{
			if(b_work!=0)continue;
			Sleep(1000);
			for(int i=0;i<=10;i++)
			{
				if(b_n[i]!="")
				{
					if(b_n_t[i]<=0)
					{
						b_n[i]="",b_n_t[i]=0;
						m.map.m[1][b_where[i][1]][b_where[i][2]]=b_num[i],m.map.m[2][b_where[i][1]][b_where[i][2]]=rand()%3,people=people+b_p[i];
						b_where[i][1]=0,b_where[i][2]=0,b_num[i]=0,b_p[i]=0;
					}
					else b_n_t[i]--;
				}
			}
		}
	}
}
//bool find start
	bool find_street(int wich,int x,int y,bool t_f) //电力,水...扩散函数 
	{
		short i=wich,arrow=0;
		if(m.map.m[1][x+1][y]==1)m.map.a[i][x+1][y]=t_f,arrow++;
		if(m.map.m[1][x-1][y]==1)m.map.a[i][x-1][y]=t_f,arrow++;
		if(m.map.m[1][x][y+1]==1)m.map.a[i][x][y+1]=t_f,arrow++;
		if(m.map.m[1][x][y-1]==1)m.map.a[i][x][y-1]=t_f,arrow++;
		bool z=false;
		if(arrow>=1)z=true;//附近有公路返回真,反之返回假 
		return z;
	}
	bool home_check(int wich,int x,int y)// 居民获取水力电力...函数 
	{
		bool z=false;
		short i=wich,arrow=0;
		if(m.map.m[1][x+1][y]==1&&m.map.a[i][x+1][y]) arrow++;
		if(m.map.m[1][x-1][y]==1&&m.map.a[i][x-1][y]) arrow++;
		if(m.map.m[1][x][y+1]==1&&m.map.a[i][x][y+1]) arrow++;
		if(m.map.m[1][x][y-1]==1&&m.map.a[i][x][y-1]) arrow++;
		if(arrow>=1)z=true;//附近的公路链接水利电力...则返回真,反之返回假 
		return z;
	} 
//bool find end
DWORD WINAPI trafic_working(LPVOID lpParamter)
{
	while(1)
	{
		for(int x=1;x<=199;x++)
		{
			for(int y=1;y<=199;y++)
			{
				if(m.map.m[1][x][y]==1)
				{
					for(int i=0;i<=4;i++)
					{
						if(m.map.a[i][x][y]) find_street(i,x,y,true);
					}
					if((m.map.m[1][x+1][y]==1||m.map.m[1][x-1][y]==1)&&(m.map.m[1][x][y+1]!=1&&m.map.m[1][x][y-1]!=1))m.map.m[2][x][y]=0;
					else if((m.map.m[1][x][y+1]==1||m.map.m[1][x][y-1]==1)&&(m.map.m[1][x+1][y]!=1&&m.map.m[1][x-1][y]!=1))m.map.m[2][x][y]=1;//else if((m.map.m[1][x][y+1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y+1]==1&&m.map.m[1][x-1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x-1][y]==1))m.map.m[2][x][y]=2;
					else 
					{
						int arror=0;
						if(m.map.m[1][x+1][y]==1)arror++;
						if(m.map.m[1][x-1][y]==1)arror++;
						if(m.map.m[1][x][y+1]==1)arror++;
						if(m.map.m[1][x][y-1]==1)arror++;
						if(arror>=3)m.map.m[2][x][y]=light;
						else m.map.m[2][x][y]=2;
					}
				}
				else if(m.map.m[1][x][y]==2||m.map.m[1][x][y]==4)
				{
					if(home_check(1,x,y)&&home_check(2,x,y)) 
					{
						m.map.m[2][x][y]=1;
					}
					else
					{
						m.map.m[2][x][y]=4;
					}
				} 
				else if(m.map.m[1][x][y]==5||m.map.m[1][x][y]==6)
				{
					if(find_street(m.map.m[1][x][y]-4,x,y,true))m.map.m[2][x][y]=1;
					else m.map.m[2][x][y]=4;
				}
			}
		}
	}
}
struct
{
	LONG x=-1,y=-1,lest_x=-1,lest_y=-1;
	double real_x,real_y;
	POINT pt= {0,0};
	CONSOLE_FONT_INFO l_z;
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFO x_z;
	int do_=1;
	void get_real_mouse()
    {
    	basic.cls();printf("鼠标校正,请用鼠标点击右下角的\"Hi\"");
		int x=rand()%10+35,y=rand()%10+75;
		basic.gt(x,y);printf("Hi");
		while(1)
		{
			GetCursorPos(&pt);    //获取鼠标当前位置
			ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
			if(KEY_DOWN(VK_LBUTTON)&&MessageBox(0,"您确定您点击了\"Hi\"吗?\n如果您没有点击此点可能会导致程序错乱.","鼠标校正",4)==IDYES)
			{
				real_x=pt.x/y,real_y=pt.y/x;
				break;
			}
		}
		basic.wait(500); basic.cls();
	}
	void mouse()
	{
		GetCurrentConsoleFont(hOutput, FALSE, &x_z);
		if(do_==1)do_=0;
		else if((do_==0)&&(l_z.dwFontSize.X!=x_z.dwFontSize.X||l_z.dwFontSize.Y!=x_z.dwFontSize.Y))
		{
			do_=1;
			basic.color(15) ;
			basic.cls();
			printf("检测到您在修改字体!\n请您修改完字体后按任意键/点击进行强制鼠标校正");
			while(1) 
			{
				if(_kbhit()||KEY_DOWN(VK_LBUTTON)||KEY_DOWN(VK_RBUTTON))break;
			}
			basic.cls(); 
			get_real_mouse();
		}
		l_z.dwFontSize.X=x_z.dwFontSize.X,l_z.dwFontSize.Y=x_z.dwFontSize.Y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
		GetCursorPos(&pt);    //获取鼠标当前位置 
		ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
		pt.y=pt.y/real_y,pt.x=(pt.x/real_x);
		lest_y=y,lest_x=x;
		x=pt.x,y=pt.y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
	} 
}mouse;
struct
{//移动库
	int num_get()
	{
		int num=0,ans=1,fu=0;
		int life[10]={};
		short now_key,key,lk;
		for(int i=1;i<=5;i++)
		{
			now_key=(int)getch()-48;
			key=now_key+48;
			if(key==13)break;
			else if(now_key==-40)
			{
				if(lk!=49)
				{
					i=0,ans=0,num=0,fu=0;
					for(int q=0;q<=9;q++)life[q]=0;
					printf("(重新输入)");
				}
			}
			else if(key==45){ fu=1,i--;printf("(此数已经设定为负数)");}
			else if(now_key>9||now_key<0)i--;
			else printf("%i",now_key);
			lk=now_key;
			life[i]=now_key,ans++;
		}
		int d=1;
		//for(int i=1;i<=ans;i++)d=d*10;
		for(int i=ans;i>=1;i--)
		{
			num=num+life[i]*d;
			d=d*10;
		}
		if(fu==1)num=num*-1;
		return num/10;
	}
	string whats[10]={},title="",about_things="null";
	int ai_choose(void)
	{
		basic.cls();
		short how_long=0,wait_=1;
		for(int i=1;i<=9;i++)
		{
			if(whats[i]!="")how_long++;
			else break;
		}
		int choose;
		while(1)
		{
			choose=-1;
			basic.gt(1,0);
			mouse.mouse();
			if(mouse.y==1)choose=1;
			printf("%s",title.c_str());
			if(choose==1){basic.color(16+7);printf("(?)\n");}
			else {basic.color(7);printf("     \n");}
			short x=1;
			for(int i=1;i<=how_long;i++)
			{
				x++;
				if(mouse.y==x)choose=x;
				if(choose==i+1)basic.color(16*15);
				else basic.color(7);
				printf("%s\n",whats[i].c_str());
			}
			basic.color(0)  ;
			printf("\n金鹏游戏") ; 
			if(wait_==1){basic.wait(500);wait_=0;}
			if(KEY_DOWN(VK_LBUTTON)&&choose>1)break;
			else if(KEY_DOWN(VK_LBUTTON)&&choose==1)
			{
				string about="关于"+title;
				if(about!="null")MessageBox(0,about_things.c_str(),about.c_str(),MB_OK);
			}
		}
		for(int i=1;i<=9;i++)whats[i]="";
		title="",about_things="null";
		basic.cls();
		return choose-1;
	}
}choose;
int make_do() 
{
	basic.cls();
	while(1) 
	{
		choose.about_things="null",choose.title="建造建筑物",choose.whats[1]="取消", choose.whats[2]="住房", choose.whats[3]="基础建设"; 
		short c=choose.ai_choose(); 
		basic.cls();
		if(c==1)break;
		else if(c==2)
		{
			choose.about_things="null",choose.title="住房",choose.whats[1]="取消", choose.whats[2]=m.building.get_name(2) , choose.whats[3]=m.building.get_name(4); 
			c=choose.ai_choose(); 
			if(c==2) o_check(2,xx,yy); 
			else if(c==3) o_check(4,xx,yy);  
			if(c!=1)break;
		}
		else if(c==3)
		{
			choose.about_things="null",choose.title="基础建设",choose.whats[1]="取消", choose.whats[2]=m.building.get_name(5), choose.whats[3]=m.building.get_name(6); 
			c=choose.ai_choose(); 
			if(c==2) o_check(5,xx,yy); 
			else if(c==3) o_check(6,xx,yy);  
			if(c!=1)break;//*/ 
		}
		basic.cls();
	}
	basic.cls();
}
int look_do() 
{
	basic.cls();
	while(1)
	{
		basic.gt(0,0)  ;
		printf("工程进度 E 返回主界面\n");
		for(int i=0,w=0;i<=10;i++) 
		{
			if(b_n[i]!="")
			{
				w++;
				printf("第%i个工程:%s 坐标(%i,%i)剩余完工时间%i秒               \n",w,b_n[i].c_str(),b_where[i][1],b_where[i][2],b_n_t[i]);
			}
		}
		for(int i=0;i<=4;i++) printf("                                                \n") ;
		
		if(GetAsyncKeyState((int)'E'))break;
	}
	basic.cls(); 
}
int out_m()
{
	basic.gt(0,0) ;
	short color=0;
	for(int m_x=l_x-10,x=0;m_x<=l_x+10;m_x++,x++) 
	{
		for(int m_y=l_y-10,y=0;m_y<=l_y+10;m_y++,y++) 
		{
			if(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]!=color)
			{
				basic.color(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]);
				color=m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]];
			}
			printf("%s",m.library.photo[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]].c_str() );
		}
		printf("\n"); 
	}
	basic.color(15) ;
	printf("x-%i,y-%i,see_x-%i,see_y-%i      \n城市人口:%lld 市财政局还有%lld元                   \n提示:AWSD 移动视角 Q 取消当前操作\nP 放置公路 L 摧毁建筑物/公路 O 查看建造进度\nI 在当前光标处修建建筑物",yy,xx,l_x,l_y,people,money);
}
int message_clean()
{
	for(int x=1;x<=199;x++)
	{
		for(int y=1;y<=199;y++)
		{
			for(int z=0;z<=5;z++)
				m.map.a[z][x][y]=false;
		}
	}
}
int game()
{
	CreateThread(NULL,0,trafic_working,NULL,0,NULL);
	CreateThread(NULL,0,making_building,NULL,0,NULL);
	int doing=0;//0无操作 1放置公路 2摧毁建筑物 
	while(1)
	{
		out_m();
		mouse.mouse();
		if(mouse.y<=21&&mouse.x<=21*2)yy=(mouse.x/2)+l_y-10,xx=mouse.y+l_x-10;
		if(GetAsyncKeyState((int)'D')&&l_y<189)l_y++;
		else if(GetAsyncKeyState((int)'A')&&l_y>11)l_y--;
		else if(GetAsyncKeyState((int)'S')&&l_x<189)l_x++;
		else if(GetAsyncKeyState((int)'W')&&l_x>11)l_x--;
		else if(GetAsyncKeyState((int)'P')) doing=1;
		else if(GetAsyncKeyState((int)'L')) doing=2;
		else if(GetAsyncKeyState((int)'Q')) doing=0;
		else if(GetAsyncKeyState((int)'O')) look_do();
		else if(GetAsyncKeyState((int)'I')) 
		{
			
			if(m.map.m[1][xx][yy]==0)
			{
				int arror=0;
				if(m.map.m[1][xx+1][yy]==1)arror++;
				if(m.map.m[1][xx-1][yy]==1)arror++;
				if(m.map.m[1][xx][yy+1]==1)arror++;
				if(m.map.m[1][xx][yy-1]==1)arror++;
				if(arror>=1)make_do();
				else MessageBox(0,"请在公路旁建造建筑物","提示",MB_OK);
			}
			else MessageBox(0,"您不能在其它建筑物/公路上建造建筑物","提示",MB_OK);
		}
		if(KEY_DOWN(VK_LBUTTON))
		{
			if(doing==1&&m.map.m[1][xx][yy]==0)m.map.m[1][xx][yy]=1;
			else if(doing==2&&m.map.m[1][xx][yy]!=0)
			{
				m.map.m[1][xx][yy]=0;
				message_clean();
			}
			else
			{
				string what="这个建筑物缺少:\n",why="废弃的建筑物-"+m.building.building_name[m.map.m[1][xx][yy]]+"-废弃原因";
				if(m.map.m[1][xx][yy]<=2&&m.map.m[2][xx][yy]==4)
				{
					if(!find_street(1,xx,yy,false))what=what+"·没有公路网连接\n";
					else
					{
						if(!home_check(1,xx,yy)) what=what+"·没有电力网连接\n";
						if(!home_check(2,xx,yy)) what=what+"·没有水力网连接\n";
					}	
					MessageBox(0,what.c_str(),why.c_str(),MB_OK);
				}
			}
		}
	}
}
int main()
{
	system("mode con cols=150 lines=40");
	printf("loading...");
	m.building.start_game();
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;  //移除快速编辑模式
	mode &= ~ENABLE_INSERT_MODE;      //移除插入模式
    mode &= ~ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, mode);
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
	basic.cls() ;
	system("title 城市之光3"); basic.color(15); basic.gt(3,6);printf("made by heveral(白.)");basic.wait(500);basic.cls();mouse.get_real_mouse();
	while(1)
	{
		choose.about_things="开始界面选择",choose.title="城市之光3",choose.whats[1]="开始游戏", choose.whats[2]="打开金鹏游戏官网", choose.whats[3]="关闭游戏";
		short a=choose.ai_choose();
		if(a==1)game();
		else if(a==2)system("start http://jinpeng-game.ys168.com/");
		else if(a==3) break;
	}
}

  V1.0.1.890  (更新:2021.11.10)

#include<bits/stdc++.h>
#include<ctime>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<cstdio>
#include<time.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
CONSOLE_FONT_INFO consoleCurrentFont;
using namespace std;
long long money=100000,people=0,light=3;
int l_x=100,l_y=100,xx=100,yy=100;
string b_n[11]={};
int b_n_t[11]={},b_num[11]={},b_p[11]={},b_where[11][3]={},b_work=0; 
struct
{
	void color(int all){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),all);}
	void wait(int all){Sleep(all);}
	void cls(){system("cls");}
	void b(short hz,double time){Beep(hz,time);}
	void gt(int x,int y)
	{
		COORD coord;
		coord.X=y;//Here, the order is reversed, otherwise, the output pointer is moved to Y row and X column
		coord.Y=x;
		HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorPosition(a,coord);
	}
}basic;
struct
{
	struct
	{
		short m[5][200][200]={};
		bool a[5][200][200]={};
		double p[200][200]={};
	}map;
	struct
	{
		string photo[50][5]={
		{"金","金","金","金","金"}, //0 
		{"│ ","--","□","◎"/*信号灯-绿*/,"◎"/*信号灯-红*/},
		{"■","■","■","■","错"},
		{"工","工","工","工","错"},
		{"◆","◆","◆","◆","错"},
		{"●","●","●","●","错"},//5 
		{"●","●","●","●","错"},
		};
		short color[50][5]={
		{170,170,170,170,170}, //0
		{143,143,143,130,132},
		{167,165,164,166,79},
		{143,143,143,143,79}, 
		{167,165,164,166,79},
		{161,161,161,161,79},//5 
		{175,175,175,175,79},
		{175,175,175,175,79},
		};
	}library;
	struct
	{
	}tools;
}m;
int o_check(int need_money,int out,int x,int y,int need_time,int need_people,string name)
{
	basic.cls();
	b_work=1;
	basic.color(15) ;
	printf("正在联系光城建设五局.\n"); 
	basic.wait(100) ;
	printf("正在询问对方能否承包%s项目.\n",name.c_str()); 
	basic.wait(100) ;
	printf("对方正在研讨承包%s项目的问题.\n",name.c_str()); 
	basic.wait(100) ;
	if(money<=need_money+1)
	{
		printf("对方拒绝承包%s项目\n原因:市财政局无法支付其承包费用\n",name.c_str()); 
		system("pause") ;
	}
	else
	{
		bool ok=true;
		for(int i=0;i<=10;i++) 
		{
			if(b_n[i]=="") 
			{
				ok=false;
				m.map.m [1][xx][yy]=3;
				printf("对方接受承包%s项目\n市财政局已经对光城建设五局支付了此项目的费用%i元\n",name.c_str(),need_money); 
				system("pause") ;
				b_n[i]=name,b_where[i][1]=x,b_where[i][2]=y,b_n_t[i]=need_time,b_num[i]=out,money=money-need_money,b_p[i]=need_people;
				break;
			}
		}
		if(ok)
		{
			printf("对方拒绝承包%s项目\n原因:对方工程设施不足,无法承包此项目\n",name.c_str()); 
			system("pause") ;
		}
	}
	b_work=0;
	basic.cls();
}//*/
DWORD WINAPI making_building(LPVOID lpParamter)
{
	while(1)
	{
		if(light==3)light=4;
		else light=3;
		for(int c=0;c<=5;c++) 
		{
			if(b_work!=0)continue;
			Sleep(1000);
			for(int i=0;i<=10;i++)
			{
				if(b_n[i]!="")
				{
					if(b_n_t[i]<=0)
					{
						b_n[i]="",b_n_t[i]=0;
						m.map.m[1][b_where[i][1]][b_where[i][2]]=b_num[i],m.map.m[2][b_where[i][1]][b_where[i][2]]=rand()%3,people=people+b_p[i];
						b_where[i][1]=0,b_where[i][2]=0,b_num[i]=0,b_p[i]=0;
					}
					else b_n_t[i]--;
				}
			}
		}
	}
}
bool find_street(int wich,int x,int y,bool t_f) //扩散函数 
{
	short i=wich,arrow=0;
	if(m.map.m[1][x+1][y]==1)m.map.a[i][x+1][y]=t_f,arrow++;
	if(m.map.m[1][x-1][y]==1)m.map.a[i][x-1][y]=t_f,arrow++;
	if(m.map.m[1][x][y+1]==1)m.map.a[i][x][y+1]=t_f,arrow++;
	if(m.map.m[1][x][y-1]==1)m.map.a[i][x][y-1]=t_f,arrow++;
	bool z=false;
	if(arrow>=1)z=true;//附近有公路返回真,反之返回假 
	return z;
}
DWORD WINAPI trafic_working(LPVOID lpParamter)
{
	while(1)
	{
		for(int x=1;x<=198;x++)
		{
			for(int y=1;y<=198;y++)
			{
				if(m.map.m[1][x][y]==1)
				{
					for(int i=0;i<=4;i++)
					{
						if(m.map.a[i][x][y]) find_street(i,x,y,true);
					}
					if((m.map.m[1][x+1][y]==1||m.map.m[1][x-1][y]==1)&&(m.map.m[1][x][y+1]!=1&&m.map.m[1][x][y-1]!=1))m.map.m[2][x][y]=0;
					else if((m.map.m[1][x][y+1]==1||m.map.m[1][x][y-1]==1)&&(m.map.m[1][x+1][y]!=1&&m.map.m[1][x-1][y]!=1))m.map.m[2][x][y]=1;//else if((m.map.m[1][x][y+1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y+1]==1&&m.map.m[1][x-1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x-1][y]==1))m.map.m[2][x][y]=2;
					else 
					{
						int arror=0;
						if(m.map.m[1][x+1][y]==1)arror++;
						if(m.map.m[1][x-1][y]==1)arror++;
						if(m.map.m[1][x][y+1]==1)arror++;
						if(m.map.m[1][x][y-1]==1)arror++;
						if(arror>=3)m.map.m[2][x][y]=light;
						else m.map.m[2][x][y]=2;
					}
				}
				else if(m.map.m[1][x][y]==5||m.map.m[1][x][y]==6)
				{
					if(find_street(m.map.m[1][x][y]-4,x,y,true))m.map.m[2][x][y]=1;
					else m.map.m[2][x][y]=4;
				}
			}
		}
	}
}
struct
{
	LONG x=-1,y=-1,lest_x=-1,lest_y=-1;
	double real_x,real_y;
	POINT pt= {0,0};
	CONSOLE_FONT_INFO l_z;
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFO x_z;
	int do_=1;
	void get_real_mouse()
    {
    	basic.cls();printf("鼠标校正,请用鼠标点击右下角的\"Hi\"");
		int x=rand()%10+35,y=rand()%10+75;
		basic.gt(x,y);printf("Hi");
		while(1)
		{
			GetCursorPos(&pt);    //获取鼠标当前位置
			ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
			if(KEY_DOWN(VK_LBUTTON)&&MessageBox(0,"您确定您点击了\"Hi\"吗?\n如果您没有点击此点可能会导致程序错乱.","鼠标校正",4)==IDYES)
			{
				real_x=pt.x/y,real_y=pt.y/x;
				break;
			}
		}
		basic.wait(500); basic.cls();
	}
	void mouse()
	{
		GetCurrentConsoleFont(hOutput, FALSE, &x_z);
		if(do_==1)do_=0;
		else if((do_==0)&&(l_z.dwFontSize.X!=x_z.dwFontSize.X||l_z.dwFontSize.Y!=x_z.dwFontSize.Y))
		{
			do_=1;
			basic.color(15) ;
			basic.cls();
			printf("检测到您在修改字体!\n请您修改完字体后按任意键进行强制鼠标校正");getch();
			basic.cls(); 
			get_real_mouse();
		}
		l_z.dwFontSize.X=x_z.dwFontSize.X,l_z.dwFontSize.Y=x_z.dwFontSize.Y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
		GetCursorPos(&pt);    //获取鼠标当前位置 
		ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
		pt.y=pt.y/real_y,pt.x=(pt.x/real_x);
		lest_y=y,lest_x=x;
		x=pt.x,y=pt.y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
	} 
}mouse;
struct
{//移动库
	int num_get()
	{
		int num=0,ans=1,fu=0;
		int life[10]={};
		short now_key,key,lk;
		for(int i=1;i<=5;i++)
		{
			now_key=(int)getch()-48;
			key=now_key+48;
			if(key==13)break;
			else if(now_key==-40)
			{
				if(lk!=49)
				{
					i=0,ans=0,num=0,fu=0;
					for(int q=0;q<=9;q++)life[q]=0;
					printf("(重新输入)");
				}
			}
			else if(key==45){ fu=1,i--;printf("(此数已经设定为负数)");}
			else if(now_key>9||now_key<0)i--;
			else printf("%i",now_key);
			lk=now_key;
			life[i]=now_key,ans++;
		}
		int d=1;
		//for(int i=1;i<=ans;i++)d=d*10;
		for(int i=ans;i>=1;i--)
		{
			num=num+life[i]*d;
			d=d*10;
		}
		if(fu==1)num=num*-1;
		return num/10;
	}
	string whats[10]={},title="",about_things="null";
	int ai_choose(void)
	{
		basic.cls();
		short how_long=0,wait_=1;
		for(int i=1;i<=9;i++)
		{
			if(whats[i]!="")how_long++;
			else break;
		}
		int choose;
		while(1)
		{
			choose=-1;
			basic.gt(1,0);
			mouse.mouse();
			if(mouse.y==1)choose=1;
			printf("%s",title.c_str());
			if(choose==1){basic.color(16+7);printf("(?)\n");}
			else {basic.color(7);printf("     \n");}
			short x=1;
			for(int i=1;i<=how_long;i++)
			{
				x++;
				if(mouse.y==x)choose=x;
				if(choose==i+1)basic.color(16*15);
				else basic.color(7);
				printf("%s\n",whats[i].c_str());
			}
			basic.color(0)  ;
			printf("\n金鹏游戏") ; 
			if(wait_==1){basic.wait(500);wait_=0;}
			if(KEY_DOWN(VK_LBUTTON)&&choose>1)break;
			else if(KEY_DOWN(VK_LBUTTON)&&choose==1)
			{
				string about="关于"+title;
				if(about!="null")MessageBox(0,about_things.c_str(),about.c_str(),MB_OK);
			}
		}
		for(int i=1;i<=9;i++)whats[i]="";
		title="",about_things="null";
		basic.cls();
		return choose-1;
	}
}choose;
int make_do() 
{
	basic.cls();
	while(1) 
	{
		choose.about_things="null",choose.title="建造建筑物",choose.whats[1]="取消", choose.whats[2]="住房", choose.whats[3]="基础建设"; 
		short c=choose.ai_choose(); 
		basic.cls();
		if(c==1)break;
		else if(c==2)
		{
			choose.about_things="null",choose.title="住房",choose.whats[1]="取消", choose.whats[2]="住宅 1000元 30秒 10人", choose.whats[3]="公寓 5000元 60秒 50人"; 
			c=choose.ai_choose(); 
			if(c==2) o_check(1000,2,xx,yy,63,10,"住宅"); 
			else if(c==3) o_check(5000,4,xx,yy,60,50,"公寓");  
			if(c!=1)break;
		}
		else if(c==3)
		{
			choose.about_things="null",choose.title="基础建设",choose.whats[1]="取消", choose.whats[2]="供水站 1000元 65秒 水力+10", choose.whats[3]="发电站 1000元 65秒 电力+10"; 
			c=choose.ai_choose(); 
			if(c==2) o_check(1000,5,xx,yy,65,0,"供水站"); 
			else if(c==3) o_check(2000,6,xx,yy,65,0,"发电站");  
			if(c!=1)break;//*/ 
		}
		basic.cls();
	}
	basic.cls();
}
int look_do() 
{
	basic.cls();
	while(1)
	{
		basic.gt(0,0)  ;
		printf("工程进度 E 返回主界面\n");
		for(int i=0,w=0;i<=10;i++) 
		{
			if(b_n[i]!="")
			{
				w++;
				printf("第%i个工程:%s 坐标(%i,%i)剩余完工时间%i秒               \n",w,b_n[i].c_str(),b_where[i][1],b_where[i][2],b_n_t[i]);
			}
		}
		for(int i=0;i<=4;i++) printf("                                                \n") ;
		
		if(GetAsyncKeyState((int)'E'))break;
	}
	basic.cls(); 
}
int out_m()
{
	basic.gt(0,0) ;
	short color=0;
	for(int m_x=l_x-10,x=0;m_x<=l_x+10;m_x++,x++) 
	{
		for(int m_y=l_y-10,y=0;m_y<=l_y+10;m_y++,y++) 
		{
			if(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]!=color)
			{
				basic.color(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]);
				color=m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]];
			}
			printf("%s",m.library.photo[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]].c_str() );
		}
		printf("\n"); 
	}
	basic.color(15) ;
	printf("x-%i,y-%i,see_x-%i,see_y-%i      \n城市人口:%lld 市财政局还有%lld元                   \n提示:AWSD 移动视角 Q 取消当前操作\nP 放置公路 L 摧毁建筑物/公路 O 查看建造进度\nI 在当前光标处修建建筑物",yy,xx,l_x,l_y,people,money);
}
int game()
{
	CreateThread(NULL,0,trafic_working,NULL,0,NULL);
	CreateThread(NULL,0,making_building,NULL,0,NULL);
	int doing=0;//0无操作 1放置公路 2摧毁建筑物 
	while(1)
	{
		out_m();
		mouse.mouse();
		if(mouse.y<=21&&mouse.x<=21*2)yy=(mouse.x/2)+l_y-10,xx=mouse.y+l_x-10;
		if(GetAsyncKeyState((int)'D')&&l_y<189)l_y++;
		else if(GetAsyncKeyState((int)'A')&&l_y>11)l_y--;
		else if(GetAsyncKeyState((int)'S')&&l_x<189)l_x++;
		else if(GetAsyncKeyState((int)'W')&&l_x>11)l_x--;
		else if(GetAsyncKeyState((int)'P')) doing=1;
		else if(GetAsyncKeyState((int)'L')) doing=2;
		else if(GetAsyncKeyState((int)'Q')) doing=0;
		else if(GetAsyncKeyState((int)'O')) look_do();
		else if(GetAsyncKeyState((int)'I')) 
		{
			
			if(m.map.m[1][xx][yy]==0)
			{
				int arror=0;
				if(m.map.m[1][xx+1][yy]==1)arror++;
				if(m.map.m[1][xx-1][yy]==1)arror++;
				if(m.map.m[1][xx][yy+1]==1)arror++;
				if(m.map.m[1][xx][yy-1]==1)arror++;
				if(arror>=1)make_do();
				else MessageBox(0,"请在公路旁建造建筑物","提示",MB_OK);
			}
			else MessageBox(0,"您不能在其它建筑物/公路上建造建筑物","提示",MB_OK);
		}
		if(KEY_DOWN(VK_LBUTTON))
		{
			if(doing==1&&m.map.m[1][xx][yy]==0)m.map.m[1][xx][yy]=1;
			else if(doing==2)m.map.m[1][xx][yy]=0;
		}
	}
}
int main()
{
	system("mode con cols=150 lines=40");
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;  //移除快速编辑模式
	mode &= ~ENABLE_INSERT_MODE;      //移除插入模式
    mode &= ~ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, mode);
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
	system("title 城市之光3"); basic.color(15); basic.gt(3,6);printf("made by heveral(白.)");basic.wait(500);basic.cls();mouse.get_real_mouse();
	while(1)
	{
		choose.about_things="开始界面选择",choose.title="城市之光3",choose.whats[1]="开始游戏", choose.whats[2]="打开金鹏游戏官网", choose.whats[3]="关闭游戏";
		short a=choose.ai_choose();
		if(a==1)game();
		else if(a==2)system("start http://jinpeng-game.ys168.com/");
		else if(a==3) break;
	}
}

V1.0.0.883 

原创游戏-版权所有,侵权必究

免编译下载网址

www.jinpeng-game.ys168.com

//游戏仍在更新!
#include<bits/stdc++.h>
#include<ctime>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<cstdio>
#include<time.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
CONSOLE_FONT_INFO consoleCurrentFont;
using namespace std;
long long money=100000,people=0,light=3;
int l_x=100,l_y=100,xx=100,yy=100;
string b_n[11]={};
int b_n_t[11]={},b_num[11]={},b_p[11]={},b_where[11][3]={},b_work=0; 
struct
{
	void color(int all){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),all);}
	void wait(int all){Sleep(all);}
	void cls(){system("cls");}
	void b(short hz,double time){Beep(hz,time);}
	void gt(int x,int y)
	{
		COORD coord;
		coord.X=y;//Here, the order is reversed, otherwise, the output pointer is moved to Y row and X column
		coord.Y=x;
		HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorPosition(a,coord);
	}
}basic;
struct
{
	struct
	{
		short m[5][200][200]={};
		bool a[5][200][200]={};
		double p[200][200]={};
	}map;
	struct
	{
		string photo[50][5]={
		{"金","金","金","金","金"}, 
		{"│ ","--","□","◎"/*信号灯-绿*/,"◎"/*信号灯-红*/},
		{"■","■","■","■","■"},
		{"工","工","工","工","工"},
		{"◆","◆","◆","◆","◆"},
		};
		short color[50][5]={
		{170,170,170,170,170}, 
		{143,143,143,130,132},
		{167,165,164,166,169},
		{143,143,143,143,143}, 
		{167,165,164,166,169},
		};
	}library;
	struct
	{
	}tools;
}m;
int o_check(int need_money,int out,int x,int y,int need_time,int need_people,string name)
{
	basic.cls();
	b_work=1;
	basic.color(15) ;
	printf("正在联系光城建设五局.\n"); 
	basic.wait(100) ;
	printf("正在询问对方能否承包%s项目.\n",name.c_str()); 
	basic.wait(100) ;
	printf("对方正在研讨承包%s项目的问题.\n",name.c_str()); 
	basic.wait(100) ;
	if(money<=need_money+1)
	{
		printf("对方拒绝承包%s项目\n原因:市财政局无法支付其承包费用\n",name.c_str()); 
		system("pause") ;
	}
	else
	{
		bool ok=true;
		for(int i=0;i<=10;i++) 
		{
			if(b_n[i]=="") 
			{
				ok=false;
				m.map.m [1][xx][yy]=3;
				printf("对方接受承包%s项目\n市财政局已经对光城建设五局支付了此项目的费用%i元\n",name.c_str(),need_money); 
				system("pause") ;
				b_n[i]=name,b_where[i][1]=x,b_where[i][2]=y,b_n_t[i]=need_time,b_num[i]=out,money=money-need_money,b_p[i]=need_people;
				break;
			}
		}
		if(ok)
		{
			printf("对方拒绝承包%s项目\n原因:对方工程设施不足,无法承包此项目\n",name.c_str()); 
			system("pause") ;
		}
	}
	b_work=0;
	basic.cls();
}//*/
DWORD WINAPI making_building(LPVOID lpParamter)
{
	while(1)
	{
		if(light==3)light=4;
		else light=3;
		for(int c=0;c<=5;c++) 
		{
			if(b_work!=0)continue;
			Sleep(1000);
			for(int i=0;i<=10;i++)
			{
				if(b_n[i]!="")
				{
					if(b_n_t[i]<=0)
					{
						b_n[i]="",b_n_t[i]=0;
						m.map.m[1][b_where[i][1]][b_where[i][2]]=b_num[i],m.map.m[2][b_where[i][1]][b_where[i][2]]=rand()%4+1,people=people+b_p[i];
						b_where[i][1]=0,b_where[i][2]=0,b_num[i]=0,b_p[i]=0;
					}
					else b_n_t[i]--;
				}
			}
		}
	}
}
DWORD WINAPI trafic_working(LPVOID lpParamter)
{
	while(1)
	{
		for(int x=1;x<=198;x++)
		{
			for(int y=1;y<=198;y++)
			{
				if(m.map.m[1][x][y]==1)
				{
					for(int i=0;i<=4;i++)
					{
						if(m.map.a[i][x][y]) 
						{
							if(m.map.m[i][x+1][y]==1)m.map.a[i][x+1][y]=true;
							if(m.map.m[i][x-1][y]==1)m.map.a[i][x-1][y]=true;
							if(m.map.m[i][x][y+1]==1)m.map.a[i][x][y+1]=true;
							if(m.map.m[i][x][y-1]==1)m.map.a[i][x][y-1]=true;
						}
					}
					if((m.map.m[1][x+1][y]==1||m.map.m[1][x-1][y]==1)&&(m.map.m[1][x][y+1]!=1&&m.map.m[1][x][y-1]!=1))m.map.m[2][x][y]=0;
					else if((m.map.m[1][x][y+1]==1||m.map.m[1][x][y-1]==1)&&(m.map.m[1][x+1][y]!=1&&m.map.m[1][x-1][y]!=1))m.map.m[2][x][y]=1;//else if((m.map.m[1][x][y+1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y+1]==1&&m.map.m[1][x-1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x+1][y]==1)||(m.map.m[1][x][y-1]==1&&m.map.m[1][x-1][y]==1))m.map.m[2][x][y]=2;
					else 
					{
						int arror=0;
						if(m.map.m[1][x+1][y]==1)arror++;
						if(m.map.m[1][x-1][y]==1)arror++;
						if(m.map.m[1][x][y+1]==1)arror++;
						if(m.map.m[1][x][y-1]==1)arror++;
						if(arror>=3)m.map.m[2][x][y]=light;
						else m.map.m[2][x][y]=2;
					}
				}
			}
		}
	}
}
struct
{
	LONG x=-1,y=-1,lest_x=-1,lest_y=-1;
	double real_x,real_y;
	POINT pt= {0,0};
	CONSOLE_FONT_INFO l_z;
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFO x_z;
	int do_=1;
	void get_real_mouse()
    {
    	basic.cls();printf("鼠标校正,请用鼠标点击右下角的\"Hi\"");
		int x=rand()%10+35,y=rand()%10+75;
		basic.gt(x,y);printf("Hi");
		while(1)
		{
			GetCursorPos(&pt);    //获取鼠标当前位置
			ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
			if(KEY_DOWN(VK_LBUTTON)&&MessageBox(0,"您确定您点击了\"Hi\"吗?\n如果您没有点击此点可能会导致程序错乱.","鼠标校正",4)==IDYES)
			{
				real_x=pt.x/y,real_y=pt.y/x;
				break;
			}
		}
		basic.wait(500); basic.cls();
	}
	void mouse()
	{
		GetCurrentConsoleFont(hOutput, FALSE, &x_z);
		if(do_==1)do_=0;
		else if((do_==0)&&(l_z.dwFontSize.X!=x_z.dwFontSize.X||l_z.dwFontSize.Y!=x_z.dwFontSize.Y))
		{
			do_=1;
			basic.color(15) ;
			basic.cls();
			printf("检测到您在修改字体!\n请您修改完字体后按任意键进行强制鼠标校正");getch();
			basic.cls(); 
			get_real_mouse();
		}
		l_z.dwFontSize.X=x_z.dwFontSize.X,l_z.dwFontSize.Y=x_z.dwFontSize.Y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
		GetCursorPos(&pt);    //获取鼠标当前位置 
		ScreenToClient(FindWindow("ConsoleWindowClass", NULL), &pt); 
		pt.y=pt.y/real_y,pt.x=(pt.x/real_x);
		lest_y=y,lest_x=x;
		x=pt.x,y=pt.y;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
	} 
}mouse;
struct
{//移动库
	int num_get()
	{
		int num=0,ans=1,fu=0;
		int life[10]={};
		short now_key,key,lk;
		for(int i=1;i<=5;i++)
		{
			now_key=(int)getch()-48;
			key=now_key+48;
			if(key==13)break;
			else if(now_key==-40)
			{
				if(lk!=49)
				{
					i=0,ans=0,num=0,fu=0;
					for(int q=0;q<=9;q++)life[q]=0;
					printf("(重新输入)");
				}
			}
			else if(key==45){ fu=1,i--;printf("(此数已经设定为负数)");}
			else if(now_key>9||now_key<0)i--;
			else printf("%i",now_key);
			lk=now_key;
			life[i]=now_key,ans++;
		}
		int d=1;
		//for(int i=1;i<=ans;i++)d=d*10;
		for(int i=ans;i>=1;i--)
		{
			num=num+life[i]*d;
			d=d*10;
		}
		if(fu==1)num=num*-1;
		return num/10;
	}
	string whats[10]={},title="",about_things="null";
	int ai_choose(void)
	{
		basic.cls();
		short how_long=0,wait_=1;
		for(int i=1;i<=9;i++)
		{
			if(whats[i]!="")how_long++;
			else break;
		}
		int choose;
		while(1)
		{
			choose=-1;
			basic.gt(1,0);
			mouse.mouse();
			if(mouse.y==1)choose=1;
			printf("%s",title.c_str());
			if(choose==1){basic.color(16+7);printf("(?)\n");}
			else {basic.color(7);printf("     \n");}
			short x=1;
			for(int i=1;i<=how_long;i++)
			{
				x++;
				if(mouse.y==x)choose=x;
				if(choose==i+1)basic.color(16*15);
				else basic.color(7);
				printf("%s\n",whats[i].c_str());
			}
			basic.color(0)  ;
			printf("\n金鹏游戏") ; 
			if(wait_==1){basic.wait(500);wait_=0;}
			if(KEY_DOWN(VK_LBUTTON)&&choose>1)break;
			else if(KEY_DOWN(VK_LBUTTON)&&choose==1)
			{
				string about="关于"+title;
				if(about!="null")MessageBox(0,about_things.c_str(),about.c_str(),MB_OK);
			}
		}
		for(int i=1;i<=9;i++)whats[i]="";
		title="",about_things="null";
		basic.cls();
		return choose-1;
	}
}choose;
int make_do() 
{
	basic.cls();
	while(1) 
	{
		choose.about_things="null",choose.title="建造建筑物",choose.whats[1]="取消", choose.whats[2]="住房", choose.whats[3]="基础建设"; 
		short c=choose.ai_choose(); 
		basic.cls();
		if(c==1)break;
		else if(c==2)
		{
			choose.about_things="null",choose.title="住房",choose.whats[1]="取消", choose.whats[2]="住宅 1000元 60秒 10人", choose.whats[3]="公寓 5000元 200秒 50人"; 
			c=choose.ai_choose(); 
			if(c==2) o_check(1000,2,xx,yy,60,10,"住宅"); 
			else if(c==3) o_check(5000,4,xx,yy,200,50,"公寓");  
			if(c!=1)break;
		}
		else if(c==3)
		{
			/*choose.about_things="null",choose.title="基础建设",choose.whats[1]="取消", choose.whats[2]="住宅 1000元 60秒 10人", choose.whats[3]="公寓 5000元 200秒 50人"; 
			c=choose.ai_choose(); 
			if(c==2) o_check(1000,2,xx,yy,60,10,"住宅"); 
			else if(c==2) o_check(5000,2,xx,yy,60,50,"住宅");  
			if(c!=1)break;*/ 
		}
		basic.cls();
	}
	basic.cls();
}
int look_do() 
{
	basic.cls();
	while(1)
	{
		basic.gt(0,0)  ;
		printf("工程进度 E 返回主界面\n");
		for(int i=0,w=0;i<=10;i++) 
		{
			if(b_n[i]!="")
			{
				w++;
				printf("第%i个工程:%s 坐标(%i,%i)剩余完工时间%i秒               \n",w,b_n[i].c_str(),b_where[i][1],b_where[i][2],b_n_t[i]);
			}
		}
		for(int i=0;i<=4;i++) printf("                                                \n") ;
		
		if(GetAsyncKeyState((int)'E'))break;
	}
	basic.cls(); 
}
int out_m()
{
	basic.gt(0,0) ;
	short color=0;
	for(int m_x=l_x-10,x=0;m_x<=l_x+10;m_x++,x++) 
	{
		for(int m_y=l_y-10,y=0;m_y<=l_y+10;m_y++,y++) 
		{
			if(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]!=color)
			{
				basic.color(m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]]);
				color=m.library.color[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]];
			}
			printf("%s",m.library.photo[m.map.m[1][m_x][m_y]][m.map.m[2][m_x][m_y]].c_str() );
		}
		printf("\n"); 
	}
	basic.color(15) ;
	printf("x-%i,y-%i,see_x-%i,see_y-%i      \n城市人口:%lld 市财政局还有%lld元                   \n提示:AWSD 移动视角 Q 取消当前操作\nP 放置公路 L 摧毁建筑物/公路 O 查看建造进度\nI 在当前光标处修建建筑物",yy,xx,l_x,l_y,people,money);
}
int game()
{
	CreateThread(NULL,0,trafic_working,NULL,0,NULL);
	CreateThread(NULL,0,making_building,NULL,0,NULL);
	int doing=0;//0无操作 1放置公路 2摧毁建筑物 
	while(1)
	{
		out_m();
		mouse.mouse();
		if(mouse.y<=21&&mouse.x<=21*2)yy=(mouse.x/2)+l_y-10,xx=mouse.y+l_x-10;
		if(GetAsyncKeyState((int)'D')&&l_y<189)l_y++;
		else if(GetAsyncKeyState((int)'A')&&l_y>11)l_y--;
		else if(GetAsyncKeyState((int)'S')&&l_x<189)l_x++;
		else if(GetAsyncKeyState((int)'W')&&l_x>11)l_x--;
		else if(GetAsyncKeyState((int)'P')) doing=1;
		else if(GetAsyncKeyState((int)'L')) doing=2;
		else if(GetAsyncKeyState((int)'Q')) doing=0;
		else if(GetAsyncKeyState((int)'O')) look_do();
		else if(GetAsyncKeyState((int)'I')) 
		{
			
			if(m.map.m[1][xx][yy]==0)
			{
				int arror=0;
				if(m.map.m[1][xx+1][yy]==1)arror++;
				if(m.map.m[1][xx-1][yy]==1)arror++;
				if(m.map.m[1][xx][yy+1]==1)arror++;
				if(m.map.m[1][xx][yy-1]==1)arror++;
				if(arror>=1)make_do();
				else MessageBox(0,"请在公路旁建造建筑物","提示",MB_OK);
			}
			else MessageBox(0,"您不能在其它建筑物/公路上建造建筑物","提示",MB_OK);
		}
		if(KEY_DOWN(VK_LBUTTON))
		{
			if(doing==1&&m.map.m[1][xx][yy]==0)m.map.m[1][xx][yy]=1;
			else if(doing==2)m.map.m[1][xx][yy]=0;
		}
	}
}
int main()
{
	system("mode con cols=150 lines=40");
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;  //移除快速编辑模式
	mode &= ~ENABLE_INSERT_MODE;      //移除插入模式
    mode &= ~ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, mode);
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
	system("title 城市之光3"); basic.color(15); basic.gt(3,6);printf("made by heveral(白.)");basic.wait(500);basic.cls();mouse.get_real_mouse();
	while(1)
	{
		choose.about_things="开始界面选择",choose.title="城市之光3",choose.whats[1]="开始游戏", choose.whats[2]="打开金鹏游戏官网", choose.whats[3]="关闭游戏";
		short a=choose.ai_choose();
		if(a==1)game();
		else if(a==2)system("start http://jinpeng-game.ys168.com/");
		else if(a==3) break;
	}
}

 原创游戏-版权所有,侵权必究

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值