//工作模拟器1.3
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <ctime>
#include <bits/stdc++.h>
#include<windows.h>
// 替换Windows特定功能
#ifdef _WIN32
#include <windows.h>
#else
// 提供Linux/macOS的替代实现
#endif
#include <fstream>
#define ll long long
using namespace std;

int math_ability = 0;
int language_ability = 0;
int science_ability = 0;
int art_ability = 0;
int programming_ability = 0;  
int economics_ability = 0;    

bool can_teach_math = false;
bool can_teach_language = false;
bool can_teach_science = false;
bool can_teach_art = false;
bool can_teach_programming = false;


struct GameData {
	int money;
	int tired;
	int knowledge;
	int work;
	int bank_savings;   
	int bank_loan;         
	int loan_term;           
	int interest_rate;   
	int loan_rate;        
};



namespace gongjv {
	inline void cd(int x) {
		Sleep(x);
		system("cls");
	}
	void ggb() {
		HWND hwnd = GetConsoleWindow();
		LONG style = GetWindowLong(hwnd, GWL_STYLE);
		style &= ~(WS_MINIMIZEBOX | WS_MAXIMIZEBOX  | WS_THICKFRAME);
		SetWindowLong(hwnd, GWL_STYLE, style);
		SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0,
		             SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
	}
	bool SetWindowTopMost(HWND hWnd, bool topmost, bool noActivate = true) {
		if (!IsWindow(hWnd)) return false;
		UINT flags = SWP_NOMOVE | SWP_NOSIZE;
		if (noActivate) flags |= SWP_NOACTIVATE; // 关键:置顶但不抢焦点
		return SetWindowPos(hWnd,
		                    topmost ? HWND_TOPMOST : HWND_NOTOPMOST,
		                    0, 0, 0, 0,
		                    flags);
	}
	bool axj(long long key) {
		return (GetKeyState(key) < 0) ? (true) : (false);
	}
	struct hl {
		long long h,l;
	};
	inline void de(int x) {
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
	}
	int djde1(int x) {
		int y=0;
		switch(x) {
			case 1:
				y=7;
				break;
			case 2:
				y=15;
				break;
			case 3:
				y=2;
				break;
			case 4:
				y=10;
				break;
			case 5:
				y=3;
				break;
			case 6:
				y=11;
				break;
			case 7:
				y=9;
				break;
			case 8:
				y=14;
				break;
			case 9:
				y=12;
				break;
		}
		return y;
	}
	void pzde2(int x) {
		int y=0;
		switch(x) {
			case 1:
				y=15;
				break;
			case 2:
				y=10;
				break;
			case 3:
				y=11;
				break;
			case 4:
				y=14;
				break;
			case 5:
				y=4;
				break;
		}
		de(y);
	}
	int pzde1(int x) {
		int y=0;
		switch(x) {
			case 1:
				y=15;
				break;
			case 2:
				y=10;
				break;
			case 3:
				y=11;
				break;
			case 4:
				y=14;
				break;
			case 5:
				y=4;
				break;
		}
		return y;
	}
	void djde2(int x) {
		int y=0;
		switch(x) {
			case 1:
				y=7;
				break;
			case 2:
				y=15;
				break;
			case 3:
				y=2;
				break;
			case 4:
				y=10;
				break;
			case 5:
				y=3;
				break;
			case 6:
				y=11;
				break;
			case 7:
				y=9;
				break;
			case 8:
				y=14;
				break;
			case 9:
				y=12;
				break;
		}
		de(y);
	}
	bool ax(long long key) {
		return (GetKeyState(key) < 0) ? (true) : (false);
	}
	hl wz(bool x = 1, bool n = 1) {
		HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
		HWND h = GetForegroundWindow();
		CONSOLE_FONT_INFO consoleCurrentFont;
		hl hl;
		POINT p;
		if (x) {
			GetCursorPos(&p);
			ScreenToClient(h, &p);
		} else {
			GetCursorPos(&p);
		}
		if (n) {
			GetCurrentConsoleFont(hOutput, FALSE, &consoleCurrentFont);
			p.x /= consoleCurrentFont.dwFontSize.X;
			p.y /= consoleCurrentFont.dwFontSize.Y;
		}
		hl.h = p.y + 1;
		hl.l = p.x + 1;
		return hl;
	}
	hl GetActiveWindowSize() {
		HWND hwnd = GetForegroundWindow();
		RECT rect;
		if (GetClientRect(hwnd, &rect)) {
			int clientWidth = rect.right - rect.left;
			int clientHeight = rect.bottom - rect.top;
			hl sas= {clientWidth /8,clientHeight /16};
			return sas;
		}
	}
	void ycbj() {
		HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
		DWORD mode;
		GetConsoleMode(hStdin, &mode);
		mode &= ~ENABLE_QUICK_EDIT_MODE;
		SetConsoleMode(hStdin, mode);
		return;
	}
	void ycgb() {
		CONSOLE_CURSOR_INFO cursor;
		cursor.bVisible = FALSE;
		cursor.dwSize = sizeof(cursor);
		HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorInfo(handle, &cursor);
		return;
	}
	inline void ydgb(long long h, long long l) {
		h-=1;
		l-=1;
		COORD pos = { (short)l,(short)h  };
		HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
		SetConsoleCursorPosition(hOut, pos);
		return;
	}
	inline void ydgb_zj_sc(int x,string zt) {
		ll s1=GetActiveWindowSize().h/2;
		ll s2=zt.size()/2;
		ydgb(x,s1-s2);
		cout<<zt;
	}
	inline void ydgb_zj(int x,string zt) {
		ll s1=GetActiveWindowSize().h/2;
		ll s2=zt.size()/2;
		ydgb(x,s1-s2);
	}
	inline void ydgb_zj(int x,int zt) {
		ll s1=GetActiveWindowSize().h/2;
		ll s2=zt/2;
		ydgb(x,s1-s2);
	}
	inline hl ydgb_zj_hl(string zt) {
		ll s1=GetActiveWindowSize().h/2;
		ll s2=zt.size()/2;
		hl z= {s1-s2,s1+s2};
		return z;
	}
	inline bool pdbj(int y,int x,int x1,int x2,int ys,string zt) {
		ycgb();
		ycbj();
		hl z=wz(1,1);
		bool a=0;
		if(z.h==y&&z.l>=x1&&z.l<=x2) {
			ydgb(y,x);
			de(ys*16);
			cout<<zt;
			de(ys);
			if(axj(VK_LBUTTON)) {
				a=1;
			}
		} else {
			ydgb(y,x);
			de(ys);
			cout<<zt;
		}
		de(15);
		return a;
	}
	inline bool pddj_zj(int h,int ys,string zt) {
		int s1=GetActiveWindowSize().h/2;
		int s2=zt.size()/2;
		if(pdbj(h,s1-s2,s1-s2,s2+s1,ys,zt)) {
			return 1;
		} else {
			return 0;
		}
	}
	inline bool pddj_zj_kh(int h,int ys,string zt,string z1="",string z2="") {
		int s1=GetActiveWindowSize().h/2;
		int s2=zt.size()/2;
		ydgb(h,s1-s2-z1.size()-1);
		cout<<z1<<"[";
		ydgb(h,s1+s2);
		cout<<"]"<<z2;
		if(pdbj(h,s1-s2,s1-s2,s2+s1,ys,zt)) {
			return 1;
		} else {
			return 0;
		}
	}
	inline bool pddj_kh(int h,int x,int ys,string zt,string z1="",string z2="") {
		int s2=zt.size();
		ydgb(h,x);
		cout<<z1<<"[";
		ydgb(h,x+z1.size()+s2+1);
		cout<<"]"<<z2;
		if(pdbj(h,x+z1.size()+1,x+z1.size()+1,s2+x+z1.size(),ys,zt)) {
			return 1;
		} else {
			return 0;
		}
	}
	inline string wjcc(string x, string y) {
		std::string full_path = x + "\\" + y;
		// 只创建目录,不创建文件
		std::string command = "if not exist " + x + " mkdir " + x;
		int ret = system(command.c_str());
		return full_path;
	}
	inline string in_str(ll x) {
		string y="";
		const string z[]= {"0","1","2","3","4","5","6","7","8","9"};
		while(x) {
			y+=z[x%10];
			x/=10;
		}
		reverse(y.begin(),y.end());
		return y;
	}
};

using namespace gongjv;


int tired=50,work;
int money=200;
int knowledge = 0;/////////////////////////////////////
int study;


void kaoshi(){
	knowledge+=20;
	return ;
}

int learn() {
	Sleep(100);
	if(knowledge==10||knowledge==30||knowledge==100||knowledge==150){
		kaoshi();
		return 0;
	}
	while(1) {
		if(pdbj(1,1,1,20,3,"图书馆自学:免费")) {
			return 1;
		}
		if(pdbj(2,1,1,20,2,"必修课:50元,专业导师")) {
			return 2;
		}
	}
}


int study_(){
	int man=learn();
	if(man==1&&tired>=30){
		tired-=30;
	} else if(man==2&&tired>=1){
		money-=50;
		tired-=1;
	}
} 

int job() {
    Sleep(100);
    while(1) {
        if(pdbj(1,1,1,33,6,"服徭役,全民皆须")) {
            return 1;
        }
        if(pdbj(2,1,1,33,1,"有人招拉货工人")) {
            return 2;
        }
    }
}




string knowledge_level(int knowledge) {
	string x;
	if(knowledge <= 10) {
		x="初学者";
	} else if(knowledge <= 30) {
		x="中学士";
	} else if(knowledge <= 100) {
		x="大学士";
	} else if(knowledge <= 150) {
		x="状元";
	} else {
		x="以汝才学,可为官";
	}
	return x;
}


void gongchang() {
	int zs=0;
	while(1) {
		ydgb(1,1);
		cout<<"=====拉动横杠"<<endl;
		if(pdbj(1,1,1,1,1,"=")) {
			while(1) {
				system("cls");
				ydgb(1,1);
				cout<<"=====";
				system("cls");
				if(pdbj(1,2,2,2,1,"=")) {
					while(1) {
						system("cls");
						ydgb(1,1);
						cout<<"=====";
						if(pdbj(1,3,3,3,1,"=")) {
							while(1) {
								system("cls");
								ydgb(1,1);
								cout<<"=====";
								if(pdbj(1,4,4,4,1,"=")) {
									while(1) {
										system("cls");
										ydgb(1,1);
										cout<<"=====";
										if(pdbj(1,5,5,5,1,"=")) {
											break;
										}
									}
									break;
								}
							}
							break;
						}
					}
					break;
				}
			}
			zs++;
			tired--;
		}
		cout<<endl;
		cout<<"可得钱"<<zs;
		if(pdbj(3,1,1,4,15,"下工")) {
			break;
		}
		if(tired<=0) {
			cout<<"饿倒了";
			Sleep(1000);
			break;
		}
	}
	system("cls");
	cout<<"本次工资:"<<zs;
	money+=zs;
	Sleep(1000);
	return ;
}

void banzhuan() {
	system("cls");
	bool fl=1;
	int zs=0;
	int h,l;
	while(1) {
		ydgb(1,1);
		cout<<"___________________________________________________"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|                                                 |"<<endl;
		cout<<"|_________________________________________________|"<<endl;
		cout<<"           已运砖数:"<<zs;
		if(fl) {
			h=rand()%30+2;
			l=rand()%10+2;
			fl=0;
		}
		const int h1=h;
		const int l1=l;
		if(pdbj(l1,h1,h1,h1+2,6,"砖")) {
			zs++;
			fl=1;
			tired--;
			system("cls");
			continue;
		}
		if(pdbj(16,1,1,4,15,"下工")) {
			break;
		}
		if(tired==0) {
			system("cls");
			cout<<"你快饿扁了!"<<endl;
			break;
		}
	}
	Sleep(500);
	system("cls");
	cout<<"本次工资:"<<zs;
	money+=zs;
	Sleep(500);
	return ;
}


//民以食为天 

string bdje(int tired) {
	string x;
	if(tired < 10) {
		x="为了你的生命安全,还是吃饭吧!";
	} else if(tired < 30) {
		x="非常饥饿,要吃饭";
	} else if(tired < 50) {
		x="比较饿";
	} else if(tired == 50) {
		x="肚子不算饿";
	} else if(tired < 80) {
		x="饱了";
	} else if(tired < 90) {
		x="很饱";
	} else {
		x="太撑了,吃不下了!";
	}
	return x;
}

void chifan() {
    system("cls");
    Sleep(1000);
    cout << "=== 长安街巷 ===" << endl;
    cout << "当前状态:";
    bdje(tired);
    cout << endl;
    cout << "此街酒楼甚多:" << endl;
    cout << "1. 胡之餐饮 (10钱可买)" << endl;
    cout << "2. 黑面包铺(30钱一斤)" << endl;
    cout << "3. 炙羊 (80钱半只)" << endl;
    cout << "4. 宫廷御宴 (150文钱)" << endl;
    cout << "按ESC返回" << endl;

    int selected_option = 0;

    while(1) {
        // 显示选项按钮
        if(pdbj(4,1,1,20,2,"1. 胡之餐饮 (10钱可买)")) {
            selected_option = 1;
            break;
        }
        if(pdbj(5,1,1,20,3,"2. 黑面包铺(30钱一斤)")) {
            selected_option = 2;
            break;
        }
        if(pdbj(6,1,1,20,4,"3. 炙羊 (80钱半只)")) {
            selected_option = 3;
            break;
        }
        if(pdbj(7,1,1,20,5,"4. 宫廷御宴 (150文钱)")) {
            selected_option = 4;
            break;
        }
        if(axj(VK_ESCAPE)) {
            return;
        }
    }
    Sleep(100);
    system("cls");
    
    // 处理选择的餐饮方式
    switch(selected_option) {
        case 1: // 胡饼与浊酒
            if(money < 10) {
                cout << "囊中羞涩,胡食难购!" << endl;
                Sleep(1000);
                return;
            }
            if(tired > 90) {
                cout << "腹中已满,难以食!" << endl;
                Sleep(1000);
                return;
            }
            money -= 10;
            tired += 20;
            cout << "胡饼香脆,浊酒虽浊,足以果腹。" << endl;
            break;

        case 2: // 汤饼与素菜
            if(money < 30) {
                cout << "银两甚少!" << endl;
                Sleep(1000);
                return;
            }
            if(tired > 80) {
                cout << "腹中尚饱,少食为宜!" << endl;
                Sleep(1000);
                return;
            }
            money -= 30;
            tired += 50;
            cout << "面包虽恶,亦可食" << endl;
            if(tired > 100) {
                tired = 100;
            }
            break;

        case 3: // 炙羊肉与清酒
            if(money < 80) {
                cout << "银钱不足,无法享炙羊之美!" << endl;
                Sleep(1000);
                return;
            }
            if(tired > 50) {
                cout << "腹中充实,不宜再食大餐!" << endl;
                Sleep(1000);
                return;
            }
            money -= 80;
            tired += 80;
            cout << "炙羊肉香气扑鼻,清酒甘醇,快哉!" << endl;
            break;

        case 4: // 宫廷御宴
            if(money < 150) {
                cout << "银钱不足,实在无法享用!" << endl;
                Sleep(1000);
                return;
            }
            if(tired > 20) {
                cout << "腹中尚有食,岂能再享盛宴?" << endl;
                Sleep(1000);
                return;
            }
            money -= 150;
            tired = 100; // 直接恢复满体力
            cout << "驼峰炙、鲤鲙、玉露团... 此乃天子之享!" << endl;
            break;
    }

    // 确保体力不超过上限
    if(tired > 100) {
        cout << "食物没吃完,放行囊中备着吧。" << endl;
    }

    Sleep(2000);
}


// 

void shangban(int wk) {
    if(tired <= 0) {
        cout << "先吃饭吧";
        Sleep(1000);
        return;
    }
    
    if(wk == 1) {
        banzhuan();
    } else if(wk == 2) {
        gongchang();
    }else {
        cout << "你还未有职务";
    }
    Sleep(1000);
    return;
}



string ctjb(int work) {
	string x;
	if(work==1) {
		x="服徭役";
	} else if(work==2) {
		x="拉货工";
	} else {
		x="无业游民";
	}
	return x;
}

int main() {
	system("mode con cols=150 lines=50");
	srand(time(0));
	/*
	cout<<"======================================================================================================================================================"<<endl;
	cout<<"                                                 欢迎来到莫尔德帝国,你要在这里生活下去了"<<endl;
	Sleep(1000);
	cout<<"                                                   我先给你200,等你钱够多了我再来找你哦~"<<endl;
	Sleep(5000);
	system("cls");
	cout<<"那人是谁?算了不管了,这个地方——算了不管了,先解决温饱吧";
	Sleep(5000);
	system("cls");*/
	while(money>=0) {
		// 在工作、学习、吃饭函数结束时调用

		if(money>=100000000) {
			system("cls");
			cout<<"你成为了全帝国数一数二的富翁,资产上亿";
			return 0;
		}
		if(knowledge>=500) {
			system("cls");
			cout<<"你通过努力学习,成为了一名教授!";
			return 0;
		}
		ydgb_zj_sc(1,"行囊中有"+in_str(money)+"钱币,"+bdje(tired));
		ydgb_zj_sc(2,"当前职业:"+ctjb(work)+"    学历:"+knowledge_level(knowledge));
		//ctjb(work);
		//cout<<"    学历:";
		//knowledge_level(knowledge);


		if(pddj_zj_kh(3,15,"选择职业")) {
			system("cls");
			work=job();
			system("cls");
			Sleep(100);
		}
		if(pddj_zj_kh(4,15,"工作")) {
			system("cls");
			shangban(work);
			system("cls");
			Sleep(100);
		}
		if(pddj_zj_kh(5,15,"吃饭")) {
			system("cls");
			chifan();
			system("cls");
			Sleep(100);
		}

	}
	system("cls");
	cout<<"你破产了,流浪街头……";
	return 0;
}