战斗迷宫 2.0 新鲜出炉

#include <iostream>
#include <bits/stdc++.h>
#ifdef _WIN32
#define WINDOWS
#include <windows.h>
#include <conio.h>
#define in(c) c = getch()
#endif
#ifdef __linux__
#define LINUX
#include <unistd.h>
#include <signal.h>
#endif
using namespace std;
bool HackerMode = 0;//黑客模式
bool Exit;
int logD(int n) {
	if (!n) {
		return 0;
	}
	return logD(n / 10) + 1;
}

const int MAX_DRUG_NUM = 3;
void PAUSE(int s) {
	Sleep(s * 1000);
}
struct WEAPON {		//武器
	string name;	//名字
	int atk;		//攻击
	int more_atk;
	int more_atk_rand;
};
struct ARMOR {		//盔甲
	string name;	//名字
	int dr;			//
	int defense;
	double percent_dr;
	int sb_rand;
};
struct DRUG {		//药物
	string name;
	int hp_add;
};
struct PLAYER {
	string name;
	WEAPON wea;
	ARMOR arm;

	DRUG bag[10];
	int drug_num;

	int exp;		//经验
	int lv;			//等级

	int max_hp;		//血量上限
	int real_hp;	//真正血量

	int base_atk;	//基础攻击力

	int max_es;		//自身防御力上限
	int real_es;	//剩余防御力
};

struct fumo {
	string name;
	bool hanbing;//是否冻结
	int level_huo;
	int level_bin;
	int level_du;
	int level_baohu;
	int level_baoji;
	int huo[10];
	int du[10];
	int bin[10];
	int baohu[10];
	int huo_exp[10];
	int du_exp[10];
	int bin_exp[10];
	int baohu_exp[10];
	int baoji_exp[10];
};

int flag, cnt;

PLAYER _P_, Summ;

WEAPON mood_sword, stone_sword, gold_sword, iron_sword, diamond_sword, end_sword, strange_sword;

ARMOR leather_armor, chain_armor, iron_armor, gold_armor, diamond_armor, happy_armor;

DRUG little_heart, broken_heart;

fumo fire, ice, poi, ptc, cs;

string dengji[10] = {"", "I", "II", "III", "IV", "V"};

PLAYER SummonAIBOSS() {
	int ai_lv = rand() % 3 + 10;	//boss 等级
	PLAYER ret_ai;
	ret_ai.name = "美国总统";
	ret_ai.lv = ai_lv;
	ret_ai.exp = 0;
	ret_ai.max_hp = int((rand() % 3 + 10) * pow(1.25, ai_lv));
	ret_ai.max_es = ret_ai.max_hp / (rand() % 2 + 2);
	ret_ai.base_atk = int(pow((rand() % 5 + 115.0) / 100.0, ai_lv));
	ret_ai.real_hp = ret_ai.max_hp;

	ret_ai.wea = end_sword;

	ret_ai.arm = gold_armor;

	ret_ai.drug_num = 3;
	for (int i = 1; i <= ret_ai.drug_num; i++)ret_ai.bag[i] = little_heart;

	return ret_ai;
}
PLAYER SummonAI(int ai_lv) {
	PLAYER ret_ai;

	if (rand() % 5 == 0)ret_ai.name = "美国大兵";
	else if (rand() % 5 <= 1)ret_ai.name = "美国恶霸";
	else if (rand() % 5 <= 2)ret_ai.name = "美国主任";
	else if (rand() % 5 <= 3)ret_ai.name = "美国牢大";
	else if (rand() % 5 <= 4)ret_ai.name = "美国炮灰";

	ret_ai.lv = ai_lv;
	ret_ai.exp = 0;
	ret_ai.max_hp = int((rand() % 3 + 10) * pow(1.25, ai_lv));
	ret_ai.max_es = ret_ai.max_hp / (rand() % 2 + 2);
	ret_ai.base_atk = int(pow((rand() % 5 + 115.0) / 100.0, ai_lv));
	ret_ai.real_hp = ret_ai.max_hp;

	if (rand() % 10 == 0)ret_ai.wea = mood_sword;
	else if (rand() % 10 <= 2)ret_ai.wea = stone_sword;
	else if (rand() % 10 <= 5)ret_ai.wea = iron_sword;
	else if (rand() % 10 <= 7)ret_ai.wea = gold_sword;
	else if (rand() % 10 <= 9)ret_ai.wea = diamond_sword;


	if (rand() % 10 == 0)ret_ai.arm = leather_armor;
	else if (rand() % 10 <= 2)ret_ai.arm = chain_armor;
	else if (rand() % 10 <= 5)ret_ai.arm = iron_armor;
	else if (rand() % 10 <= 7)ret_ai.arm = gold_armor;
	else if (rand() % 10 <= 9)ret_ai.arm = diamond_armor;


	ret_ai.drug_num = rand() % 3;
	for (int i = 1; i <= ret_ai.drug_num; i++) {
		if (rand() % 2 == 0)
			ret_ai.bag[i] = little_heart;
		else
			ret_ai.bag[i] = broken_heart;
	}

	return ret_ai;
}
void PrintInfo() {//初始画面
	printf("#############################\n");
	printf("#       迷宫探险 v2.0       #\n");
	printf("# 开发者:jinyanshao(洛谷名) #\n");
	printf("#  特别鸣谢:MWL_wma(洛谷名) #\n");
	printf("#     yuyanrong(附魔设计)   #\n");
	printf("#############################\n");
	printf("#     使用 wasd 进行控制    #\n");
	printf("#       画有\"&\"的地点       #\n");
	printf("#        代表一个man        #\n");
	printf("#       画有\"#\"的地点       #\n");
	printf("#         你无法进入        #\n");
	printf("#       画有\"*\"的地点       #\n");
	printf("#        代表一个惊喜       #\n");
	printf("#       画有\"$\"的地点       #\n");
	printf("#         代表附魔台        #\n");
	printf("#   可以给武器增加附魔属性  #\n");
	printf("#       画有\"!\"的地点       #\n");
	printf("#      代表最终的 Boss      #\n");
	printf("#  你的目标是达到右下角的点 #\n");
	printf("#      并且击败 Boss!      #\n");
	printf("#       起航吧探险者!      #\n");
	printf("#############################\n");
	system("pause");
}
void FightItemINIT() {
	mood_sword.name = "木剑 -|-- ", mood_sword.atk = 1, mood_sword.more_atk = 3, mood_sword.more_atk_rand = 2;
	stone_sword.name = "石剑 -|--> ", stone_sword.atk = 2, stone_sword.more_atk = 5, stone_sword.more_atk_rand = 3;
	iron_sword.name = "铁剑 =|==> ", iron_sword.atk = 3, iron_sword.more_atk = 7, iron_sword.more_atk_rand = 4;
	gold_sword.name = "金剑 =|===> ", gold_sword.atk = 4, gold_sword.more_atk = 9, gold_sword.more_atk_rand = 3;
	diamond_sword.name = "钻石剑 ==|====> ", diamond_sword.atk = 5, diamond_sword.more_atk = 10, diamond_sword.more_atk_rand = 3;
	end_sword.name = "下界合金剑 -+====> ", end_sword.atk = 7, end_sword.more_atk = 18, end_sword.more_atk_rand = 3;
	strange_sword.name = "阳寿剑  =:)==>", strange_sword.atk = 1, strange_sword.more_atk = 114514, strange_sword.more_atk_rand = 8;

	leather_armor.name = "皮革甲 (_)", leather_armor.dr = 3, leather_armor.percent_dr = 2.0, leather_armor.sb_rand = 1000, leather_armor.defense = 0;
	chain_armor.name = "锁链甲 (._.)", chain_armor.dr = 3, chain_armor.percent_dr = 1.5, chain_armor.sb_rand = 1000, chain_armor.defense = 0;
	iron_armor.name = "铁甲 (|_|)", iron_armor.dr = 2.5, iron_armor.percent_dr = 1.0, iron_armor.sb_rand = 1000, iron_armor.defense = 0;
	gold_armor.name = "金甲 <|_|>", gold_armor.dr = 2, gold_armor.percent_dr = 0.9, gold_armor.sb_rand = 1000, gold_armor.defense = 10;
	diamond_armor.name = "钻石甲 <.|_|.>", diamond_armor.dr = 1.5, diamond_armor.percent_dr = 0.85, diamond_armor.sb_rand = 1000, diamond_armor.defense = 15;
	happy_armor.name = "下界合金甲 <(|:_:|)>", happy_armor.dr = 1.0, happy_armor.percent_dr = 0.75, happy_armor.sb_rand = 2, happy_armor.defense = 8;
	little_heart.name = "小血瓶 (o)", little_heart.hp_add = 10;
	broken_heart.name = "大血瓶 (0)", broken_heart.hp_add = 20;

	fire.name = "火焰附加(^^^)", fire.huo[1] = 3, fire.huo[2] = 6, fire.huo[3] = 9, fire.huo_exp[1] = 5, fire.huo_exp[2] = 10, fire.huo_exp[3] = 15;
	ice.name = "冰封裂变(|&|)", ice.bin[1] = 10, ice.bin[2] = 8, ice.bin[3] = 5, ice.bin_exp[1] = 5, ice.bin_exp[2] = 10, ice.bin_exp[3] = 15;
	poi.name = "毒影缠绕(~&~)", poi.du[1] = 1, poi.du[2] = 3, poi.du[3] = 5, poi.du_exp[1] = 5, poi.du_exp[2] = 10, poi.du_exp[3] = 15;
	ptc.name = "保护(|@|)", ptc.baohu[1] = 5, ptc.baohu[2] = 8, ptc.baohu[3] = 10, ptc.baohu[4] = 15, ptc.baohu[5] = 20, ptc.baohu_exp[1] = 5, ptc.baohu_exp[2] = 10, ptc.baohu_exp[3] = 15, ptc.baohu_exp[4] = 20, ptc.baohu_exp[5] = 25;
	cs.name = "阳寿暴击(^@^)", cs.baoji_exp[1] = 10, cs.baoji_exp[2] = 15, cs.baoji_exp[3] = 20, cs.baoji_exp[4] = 25, cs.baoji_exp[5] = 30;

	Summ.name = "Summ";
	Summ.drug_num = 0;
	Summ.base_atk = 10000;
	Summ.max_hp = 20;
	Summ.real_hp = 20;
	Summ.max_es = 100000;
	Summ.real_es = 100000;
	Summ.exp = 2;
	Summ.lv = 30;
	Summ.arm = diamond_armor;
	Summ.wea = end_sword;
}
void FightUI(PLAYER plr, PLAYER ai) {
	system("cls");
	// 等级(经验 / 多少经验升级)名字
	cout << "等级:" << plr.lv << "(" << plr.exp << "/" << int(pow(1.5, plr.lv + 1)) << ")   " << plr.name << endl;
	//武器名
	cout << "武器 : " << plr.wea.name << endl;
	//盔甲名
	cout << "盔甲 : " << plr.arm.name << endl;
	//真实血量/最大血量
	cout << "血量 : " << plr.real_hp << "/" << plr.max_hp << endl;
	//剩余防御/ 自身最大防御 + 盔甲防御值
	cout << "防御 : " << plr.real_es << "/" << plr.max_es + plr.arm.defense << endl;

	cout << endl << endl;

	cout << "等级:" << ai.lv << "(" << ai.exp << "/" << int(pow(1.5, ai.lv + 1)) << ")   " << ai.name << endl;
	cout << "武器 : " << ai.wea.name << endl;
	cout << "盔甲 : " << ai.arm.name << endl;
	cout << "血量 : " << ai.real_hp << "/" << ai.max_hp << endl;
	cout << "盔甲血量 : " << ai.real_es << "/" << ai.max_es + ai.arm.defense << endl;

	cout << endl << endl;

	cout << "按 k/K 键攻击,输入 1/2/3 来使用血瓶." << endl;
	cout << "背包" << endl;
	for (int i = 1; i <= plr.drug_num; i++)
		cout << i << "." << plr.bag[i].name << endl;

	cout << endl << endl;
}
void LevelUP(PLAYER &plr) {	//升级
	if (plr.exp < int(pow(1.5, plr.lv + 1)))
		return;
	else {
		system("cls");
		cout << "你升到了 " << plr.lv + 1 << " 级!" << endl;
		plr.exp -= int(pow(1.5, plr.lv + 1));
		plr.lv++;
		plr.max_hp = int((rand() % 3 + 10) * pow(1.25, plr.lv));
		plr.max_es = plr.max_hp / (rand() % 2 + 2);
		plr.base_atk = int(pow((rand() % 5 + 115.0) / 100.0, plr.lv));
		plr.real_hp = plr.max_hp;
	}
	if (HackerMode) {
		plr.base_atk = 10000;
		plr.max_hp = 1919810;
		plr.real_hp = 114514;
	}
}
void FightINIT(PLAYER &plr) {	//战斗前的初始化
	plr.real_es = plr.max_es;	//防御力初始化
}
void Attack(PLAYER &plr, PLAYER &ai) {
	int real_atk = plr.base_atk;
	if (plr.wea.more_atk_rand != 0 && rand() % max(1, plr.wea.more_atk_rand - cs.level_baoji)  == 0) {
		cout << "暴击了!!!" << endl;
		real_atk += plr.wea.more_atk;
	} else
		real_atk += plr.wea.atk;
	if (ai.arm.percent_dr != 0)
		real_atk = real_atk * ai.arm.percent_dr;
#ifdef DEBUG
	cout << "DEBUG : now " << ai.name << " arm's precent_dr is " << ai.arm.percent_dr << endl;
	cout << "DEBUG : now " << plr.name << " real_atk is " << real_atk << endl;
#endif
	real_atk -= ai.arm.dr;
	real_atk = max(real_atk, 1);
	real_atk += fire.huo[fire.level_huo];
	real_atk += poi.du[poi.level_du];
	if (ai.arm.sb_rand != 0  &&  rand() % ai.arm.sb_rand == 0)
		cout << "闪避!" << endl;
	else {
		if (ai.arm.defense >= real_atk)
			ai.arm.defense -= real_atk;
		else if (ai.arm.defense + ai.real_es >= real_atk) {
			ai.arm.defense = 0;
			ai.real_es -= real_atk;
		} else {
			ai.real_hp = ai.real_hp - (real_atk - (ai.arm.defense + ai.real_es));
			ai.arm.defense = 0;
			ai.real_es = 0;
		}
	}
	cout << "铛! " << plr.name << " 造成了 " << real_atk << " 滴血 的伤害!" << endl;
	if (fire.level_huo > 0 || poi.level_du > 0)cout << "( ";
	if (fire.level_huo > 0)cout << "灼烧 + " << fire.huo[fire.level_huo] << " ";
	if (poi.level_du > 0)cout << "腐蚀 + " << poi.du[poi.level_du] << " ";
	if (fire.level_huo > 0 || poi.level_du > 0)cout << ")";
}
void Attack2(PLAYER &plr, PLAYER &ai) {
	int real_atk = plr.base_atk;
	if (plr.wea.more_atk_rand != 0 && rand() % plr.wea.more_atk_rand == 0) {
		cout << "暴击了!!!" << endl;
		real_atk += plr.wea.more_atk;
	} else
		real_atk += plr.wea.atk;
	if (ai.arm.percent_dr != 0)
		real_atk = real_atk * ai.arm.percent_dr;
#ifdef DEBUG
	cout << "DEBUG : now " << ai.name << " arm's precent_dr is " << ai.arm.percent_dr << endl;
	cout << "DEBUG : now " << plr.name << " real_atk is " << real_atk << endl;
#endif
	real_atk -= ai.arm.dr;
	real_atk = max(real_atk, 1);
	real_atk -= ptc.baohu[ptc.level_baohu];
	real_atk = max(real_atk, 0);
	if (ai.arm.sb_rand != 0  &&  rand() % ai.arm.sb_rand == 0)
		cout << "闪避!" << endl;
	else {
		if (ai.arm.defense >= real_atk)
			ai.arm.defense -= real_atk;
		else if (ai.arm.defense + ai.real_es >= real_atk) {
			ai.arm.defense = 0;
			ai.real_es -= real_atk;
		} else {
			ai.real_hp = ai.real_hp - (real_atk - (ai.arm.defense + ai.real_es));
			ai.arm.defense = 0;
			ai.real_es = 0;
		}
	}
	cout << "铛! " << plr.name << " 造成了 " << real_atk << " 滴血 的伤害!" << endl;
}
bool Fight(PLAYER &plr, PLAYER ai) {
	FightINIT(plr);
	FightINIT(ai);
	while (1) {
		FightUI(plr, ai);
		if (plr.real_hp <= 0 && ai.real_hp <= 0) {
			cout << "你和敌人同归于尽了!\n";
			cout << "你将额外获得 1 滴血!\n";
			PAUSE(1.5);
			plr.real_hp = 1;
			return true;
		}
		if (plr.real_hp <= 0) {
			cout << "你输了!" << endl;
			Sleep(1000);
			cout << "你的荣耀将由下一个人传承" << endl;
			Sleep(1000);
			PAUSE(1.5);
			return false;
		}
		if (ai.real_hp <= 0) {
			cout << "恭喜你,在怪物的攻击下活下来了!" << endl;
			plr.exp += max(1, (rand() % 3 + 10) * ai.lv / 10);
			cnt += max(1, (rand() % 3 + 10) * ai.lv / 10);
			LevelUP(plr);
			PAUSE(1.5);
			return true;
		}

		cout << plr.name << " , 轮到你了!" << endl;
atk_again:
		char op;
#ifdef WINDOWS
		in(op);
#endif
		if ('0' <= op && op <= '9') {
			int arr = op - '0';
			if (arr > plr.drug_num)
				cout << "你没有足够的药物了 :(" << endl;
			else {
				cout << plr.bag[arr].name << endl;
				for (int i = 1; i <= 4; i++) {
					cout << "gulu ";
					Sleep(300);
				}
				cout << endl;
				cout << "哎嘛,香!" << endl;
				Sleep(500);
				cout << "哎嘛,真香!" << endl;
				Sleep(500);
				cout << "哎嘛,太香了!" << endl;
				Sleep(500);
				for (int i = arr; i <= plr.drug_num - 1; i++)plr.bag[i] = plr.bag[i + 1];
				plr.drug_num--;
				plr.real_hp = min(plr.max_hp, plr.real_hp + plr.bag[arr].hp_add);
				cout << "铛! 你还有 " << plr.real_hp << "滴血 !" << endl;
			}
		} else if (op == 'K' || op == 'k')Attack(plr, ai);
		else {
			cout << "请按 k/K/1~9 操作" << endl;
			Sleep(500);

			goto atk_again;
		}
		PAUSE(2);
		FightUI(ai, plr);


		cout << ai.name << " , 轮到你了!" << endl;
		if (ice.level_bin > 0 && rand() % ice.bin[ice.level_bin] == 0) cout << endl << ai.name << "被冰冻了" << endl;
		else {
			if (ai.real_hp * 2 < ai.max_hp && ai.drug_num != 0) {
				for (int i = 1; i <= 4; i++) {
					cout << "gulu ";
					Sleep(300);
				}
				int drug_maxx = -1, maxi;
				for (int i = 1; i <= ai.drug_num; i++) {
					if (ai.bag[i].hp_add > drug_maxx) {
						drug_maxx = ai.bag[i].hp_add;
						maxi = i;
					}
				}
				for (int i = maxi; i <= ai.drug_num - 1; i++)
					ai.bag[i] = ai.bag[i + 1];
				ai.drug_num--;
				ai.real_hp = min(ai.max_hp, ai.real_hp + drug_maxx);
				cout << ai.name << "现在血量有 " << ai.real_hp << "了!" << endl;
				if (poi.level_du > 0) {
					cout << "中毒 -" << poi.du[poi.level_du] << " 滴血" << endl;
					ai.real_hp = max(0, ai.real_hp - poi.du[poi.level_du]);
				}

			} else {
				cout << ai.name << " 攻击了你 !" << endl;
				Attack2(ai, plr);
				cout << endl;
				if (poi.level_du > 0) {
					cout << "中毒 -" << poi.du[poi.level_du] << " 滴血" << endl;
					ai.real_hp = max(0, ai.real_hp - poi.du[poi.level_du]);
				}
			}
		}

		PAUSE(2);
	}
}
void Pick() {
	int t = rand() % 3;
#ifdef DEBUG
	cout << "DEBUG:t is " << t << endl;
#endif
	if (t == 0) {
		WEAPON pick_it;
		int tt = rand() % 17;
		if (tt <= 3)pick_it = mood_sword;
		else if (tt <= 7)pick_it = stone_sword;
		else if (tt <= 10)pick_it = iron_sword;
		else if (tt <= 12)pick_it = gold_sword;
		else if (tt <= 14)pick_it = diamond_sword;
		else if (tt <= 15)pick_it = end_sword;
		else if (tt <= 16)pick_it = strange_sword;

		if (_P_.wea.atk) {
			if (flag == 1)cout << "换不换?(换的话附魔会掉哦,嘻嘻)" << endl;
			else cout << "换不换?" << endl;
			cout << _P_.wea.name << endl << pick_it.name << endl;
			cout << "(yes / no)" << endl;
			string ins;
			cin >> ins;
			if (ins == "yes") {
				_P_.wea = pick_it;
				if (flag == 1) {
					fire.level_huo = 0;
					ice.level_bin = 0;
					poi.level_du = 0;
				}
				cout << "你得到了 " << pick_it.name << " !" << endl;
			}
		} else {
			_P_.wea = pick_it;
			cout << "你得到了 " << pick_it.name << " !" << endl;
		}
	} else if (t == 1) {
		ARMOR pick_it_2;
		int tt2 = rand() % 16;
		if (tt2 <= 3)pick_it_2 = leather_armor;
		else if (tt2 <= 7)pick_it_2 = chain_armor;
		else if (tt2 <= 10)pick_it_2 = iron_armor;
		else if (tt2 <= 12)pick_it_2 = gold_armor;
		else if (tt2 <= 14)pick_it_2 = diamond_armor;
		else if (tt2 <= 15)pick_it_2 = happy_armor;

		if (_P_.arm.dr ) {
			if (flag == 1)cout << "换不换?(换的话附魔会掉哦,嘻嘻)" << endl;
			else cout << "换不换?" << endl;
			cout << _P_.arm.name << endl << pick_it_2.name << endl;
			cout << "(yes / no)" << endl;
			string ins_2;
			cin >> ins_2;
			if (ins_2 == "yes") {
				_P_.arm = pick_it_2;
				if (flag == 1)ptc.level_baohu = 0;
				cout << "你得到了 " << pick_it_2.name << " !" << endl;
			}
		} else {
			_P_.arm = pick_it_2;
			cout << "你得到了 " << pick_it_2.name << " !" << endl;
		}
	} else {
		if (_P_.drug_num > MAX_DRUG_NUM) {
			cout << "你没有足够的空间了 :(" << endl;
			PAUSE(1);
			return;
		}
		int tt3 = rand() % 3;
#ifdef DEBUG
		cout << "DEBUG : _P_.drug_num is " << _P_.drug_num << endl;
#endif
		if (tt3 <= 1) {
			_P_.bag[++_P_.drug_num] = little_heart;
			cout << "你得到了 " << little_heart.name << " !" << endl;
		} else {
			_P_.bag[++_P_.drug_num] = broken_heart;
			cout << "你得到了 " << broken_heart.name << " !" << endl;
		}
	}
	PAUSE(1);
}

void fu_mo() {
again:
	bool f;
	system("cls");
	cout << "附魔台" << endl << endl;
	cout << "金币数:" << cnt << endl << endl;
	cout << "你的附魔: " << endl;
	if (fire.level_huo > 0)cout << "    " << fire.name << dengji[fire.level_huo] << endl;
	if (ice.level_bin > 0)cout << "    " << ice.name << dengji[ice.level_bin] << endl;
	if (poi.level_du > 0)cout << "    " << poi.name << dengji[poi.level_du] << endl;
	if (ptc.level_baohu > 0)cout << "    " << ptc.name << dengji[ptc.level_baohu] << endl;
	if (cs.level_baoji > 0)cout << "    " << cs.name << dengji[cs.level_baoji] << endl;
	cout << endl;
	cout << "购买:" << endl;
	if (fire.level_huo + 1 <= 3)cout << "1. 火焰附加    " << fire.huo_exp[fire.level_huo + 1] << endl;
	if (ice.level_bin + 1 <= 3)cout << "2. 冰封裂变    " << ice.bin_exp[ice.level_bin + 1] << endl;
	if (poi.level_du + 1 <= 3)cout << "3. 毒影缠绕    " << poi.du_exp[poi.level_du + 1] << endl;
	if (ptc.level_baohu + 1 <= 3)cout << "4.    保护     " << ptc.baohu_exp[ptc.level_baohu + 1] << endl;
	if (cs.level_baoji + 1 <= 3)cout << "5. 阳寿暴击    " << cs.baoji_exp[cs.level_baoji + 1] << endl;
	cout << endl << "输出 8 退出" << endl;;
	char ch;
	int x;
cinn:
	ch = getch();
	x = ch - '0';
	if (x == 8)return;
	while (x != 1 && x != 2 && x != 3 && x != 4 && x != 5) {
		cout << "输入不合法!!!" << endl;
		ch = getch();
		x = ch - '0';
		if (x == 8)return;
	}
	if (x == 1) {
		if (cnt < fire.huo_exp[fire.level_huo + 1] || fire.level_huo + 1 > 3) {
			cout << "输入不合法!!!" << endl;
			goto cinn;
		}
		cnt -= fire.huo_exp[fire.level_huo + 1];
		fire.level_huo ++;
		cout << "购买成功!!!";
		PAUSE(1);
		goto again;
	}
	if (x == 2) {
		if (cnt < ice.bin_exp[ice.level_bin + 1] || ice.level_bin + 1 > 3) {
			cout << "输入不合法!!!" << endl;
			goto cinn;
		}
		cnt -= ice.bin_exp[ice.level_bin + 1];
		ice.level_bin ++;
		cout << "购买成功!!!";
		PAUSE(1);
		goto again;
	}
	if (x == 3) {
		if (cnt < poi.du_exp[poi.level_du + 1] || poi.level_du + 1 > 3) {
			cout << "输入不合法!!!" << endl;
			goto cinn;
		}
		cnt -= poi.du_exp[poi.level_du + 1];
		poi.level_du ++;
		cout << "购买成功!!!";
		PAUSE(1);
		goto again;
	}
	if (x == 4) {
		if (cnt < ptc.baohu_exp[ptc.level_baohu + 1] || ptc.level_baohu + 1 > 5) {
			cout << "输入不合法!!!" << endl;
			goto cinn;
		}
		cnt -= ptc.baohu_exp[ptc.level_baohu + 1] ;
		ptc.level_baohu ++;
		cout << "购买成功!!!";
		PAUSE(1);
		goto again;
	}
	if (x == 5) {
		if (cnt < cs.baoji_exp[cs.level_baoji + 1] || cs.level_baoji + 1 > 5) {
			cout << "输入不合法!!!" << endl;
			goto cinn;
		}
		cnt -= cs.baoji_exp[cs.level_baoji + 1];
		cs.level_baoji ++;
		cout << "购买成功!!!";
		PAUSE(1);
		goto again;
	}
}

//begin makemap
int Sx = 2, Sy = 2;
struct side {
	int from, to;
} edges[14405];
const int I = 17, J = 31;
int indplan = 0, p[125];
char maze[20][40];
vector<int> g[125];
long long seed = time(0);
void print(int x, int y);

int find(int x) {
	if (p[x] != x) {
		p[x] = find(p[x]);
	}
	return p[x];
}
void init() {
	memset(&edges, 0, sizeof(struct side));
	for (int i = 1; i <= 120; i++) {
		g[i].clear();
	}
	for (int i = 1; i <= 120; i++) {
		if (i + 15 >= 1 && i + 15 <= 120) {
			edges[++indplan].from = i;
			edges[indplan].to = i + 15;
		}
		if (i + 1 >= 1 && i + 1 <= 120 && i % 15 != 0) {
			edges[++indplan].from = i;
			edges[indplan].to = i + 1;
		}
	}
}

void kruskal() {
	memset(maze, '#', sizeof(maze));
	init();
	for (int i = 1; i <= 120; i++) {
		p[i] = i;
	}
	for (int j = 1; j <= indplan; j++) {
		int beyond = rand() % indplan + 1;
		swap(edges[j], edges[beyond]);
	}
	int endcnt = 0;
	for (int i = 1; i <= indplan; i++) {
		if (endcnt == 119) {
			break;
		}
		if (i + 1 == indplan && endcnt < 119) {
			i = 1;
		}
		if (rand() % 2) {
			if (find(edges[i].from) != find(edges[i].to)) {
				endcnt++;
				// cout << edges[i].from << ' ' << edges[i].to << endl;
				p[find(p[edges[i].from])] = find(edges[i].to);
				g[edges[i].from].push_back(edges[i].to - edges[i].from);
			}
		}
	}
	int id = 1;
	for (int i = 2; i <= I; i += 2) {
		for (int j = 2; j <= J; j += 2) {
			maze[i][j] = ' ';
			for (int k = 0; k < g[id].size(); k++) {
				if (g[id][k] == 1) {
					//->
					maze[i][j + 1] = ' ';
				}
				if (g[id][k] == 15) {
					//down
					maze[i + 1][j] = ' ';
				}
			}
#ifdef dev
			print(seed);
			clear();
#endif
			id++;
		}
	}
	for (int i = 1; i <= I; i++) {
		for (int j = 1; j <= J; j++) {
			if (maze[i][j] != '#') {
				int x = rand();
				maze[i][j] = (x % 8 == 0 ? '*' : (x % 8 == 1 ? '&' : ' '));
			}
		}
	}
	int x, y;
	x = rand() % 17 + 1;
	y = rand() % 31 + 1;
	while ((x == 17 && y == 31) || (x == 1 && y == 1) || (maze[x + 1][y] == '#' && maze[x][y + 1] == '#' && maze[x - 1][y] == '#' && maze[x][y - 1] == '#')) {
		x = rand() % 17;
		y = rand() % 31;
	}
	maze[x][y] = '$';
	maze[I - 1][J - 1] = '!';
}

void print(int x, int y) {
	for (int i = 1; i <= I; i++) {
		for (int j = 1; j <= J; j++) {
			if (i == x && j == y) cout << "@";
			else cout << maze[i][j];
		}
		cout << endl;
	}
	cout << endl;
	cout << "等级 :" << _P_.lv << "(" << _P_.exp << "/" << int(pow(1.5, _P_.lv + 1)) << ")   " << _P_.name << endl;
	cout << "金币 :" << cnt << endl;
	cout << "武器 : " << _P_.wea.name << "    ";
	if (fire.level_huo > 0)cout << fire.name << dengji[fire.level_huo] << "  ";
	if (ice.level_bin > 0)cout << ice.name << dengji[ice.level_bin] << "  ";
	if (poi.level_du > 0)cout << poi.name << dengji[poi.level_du] << "  ";
	if (cs.level_baoji > 0)cout << cs.name << dengji[cs.level_baoji] << "  ";
	cout << endl;
	cout << "盔甲 : " << _P_.arm.name << "    ";
	if (ptc.level_baohu > 0)cout << ptc.name << " " << dengji[ptc.level_baohu] << "  ";
	cout << endl;
	cout << "血量 : " << _P_.real_hp << "/" << _P_.max_hp << endl;
	cout << "盔甲血量 : " << _P_.real_es << "/" << _P_.max_es + _P_.arm.defense << endl;
	cout << "输入 1/2/3 来使用血瓶." << endl;
	cout << "背包" << endl;
	for (int i = 1; i <= _P_.drug_num; i++)
		cout << i << "." << _P_.bag[i].name << endl;

	cout << endl << endl;
}
//end makemap
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void Operation(char ch, int &x, int &y, bool &dead) {
	if (!dead)return;
	int op;
	if (ch == 'w')op = 3;
	else if (ch == 'a')op = 1;
	else if (ch == 's')op = 2;
	else op = 0;
	if (ch >= '1' && ch <= '9') {
		int arr = ch - '0';
		if (arr > _P_.drug_num)
			cout << "你没有足够的药物了 :(" << endl;
		else {
			cout << _P_.bag[arr].name << endl;
			for (int i = 1; i <= 4; i++) {
				cout << "gulu ";
				Sleep(300);
			}
			cout << endl;
			cout << "哎嘛,香!" << endl;
			Sleep(500);
			cout << "哎嘛,真香!" << endl;
			Sleep(500);
			cout << "哎嘛,太香了!" << endl;
			Sleep(500);
			for (int i = arr; i <= _P_.drug_num - 1; i++)_P_.bag[i] = _P_.bag[i + 1];
			_P_.drug_num--;
			_P_.real_hp = min(_P_.max_hp, _P_.real_hp + _P_.bag[arr].hp_add);
		}
	}
	int nx = x + dx[op], ny = y + dy[op];
	if (nx < 1 || nx > I || ny < 1 || ny > J)return;
	if (maze[nx][ny] == '#')return;
	if (maze[nx][ny] == '*') {
		Pick();
		maze[nx][ny] = ' ';
	}
	if (maze[nx][ny] == '&') {
		dead = Fight(_P_, SummonAI(max(1, min(9, _P_.lv + rand() % 4 - 2))));
		if (dead)
			maze[nx][ny] = ' ';
	}
	if (maze[nx][ny] == '$') {
		fu_mo();
	}
	if (maze[nx][ny] == '!') {
		if (!HackerMode)
			dead = Fight(_P_, SummonAIBOSS());
		else {
			cout << endl << "不 " << _P_.name << "!!! 这是BOSS !!!" << endl;
			PAUSE(1);
			dead = Fight(_P_, Summ);
		}
		if (dead) {
			maze[nx][ny] = ' ';
			cout << " 你通关了!!! 你可以 退出 或者 继续探索 !!!\n";
			PAUSE(2);
			system("cls");
			printf("#############################\n");
			printf("#       迷宫探险 v1.1       #\n");
			printf("# 开发者:jinyanshao(洛谷名) #\n");
			printf("#  特别鸣谢:MWL_wma(洛谷名) #\n");
			printf("#     yuyanrong(附魔设计)   #\n");
			printf("#############################\n");
			printf("#                           #\n");
			printf("#                           #\n");
			printf("#     You win the game!     #\n");
			printf("#                           #\n");
			printf("#                           #\n");
			printf("#                           #\n");
			printf("#      按 y 以继续探索      #\n");
			printf("#                           #\n");
			printf("#                           #\n");
			printf("#        按 n 以退出        #\n");
			printf("#                           #\n");
			printf("#                           #\n");
			printf("#############################\n");
			char ch;
			ch = getch();
			if (ch == 'n') {
				Exit = 1;
			}
		}
	}
	x = nx, y = ny;
}
void Game(int x, int y) {
back_and_agian:
	kruskal();
	cout << "注意看!@是你" << endl;
	print(x, y);
	cout << endl << "请使用 wasd 控制 @ 行走" << endl << endl;
	cout << "如果这个地图错误了,你可以按下 Esc 重开.";
	cout << endl;
	char ch;
	ch = getch();
	if (ch == 27) {
		system("cls");
		goto back_and_agian;
	}
	while (1) {
		ch = getch();
		bool dead = true;
		Operation(ch, x, y, dead);
		if (!dead || Exit)return;
		system("cls");
		print(x, y);
	}
}
int main() {
	MessageBox(NULL, "抵制不良游戏,拒绝盗版游戏 注意自我保护,谨防受骗上当 适度游戏益脑,过度游戏伤身 合理安排时间,享受健康生活", "温馨提示", MB_OKCANCEL);
	int x;
//	fire.level_huo = 3;
//	ice.level_bin = 3;
//	ptc.level_baohu = 5;
//	poi.level_du = 3;
//	cs.level_baoji = 3;
	cnt = 10;

	PrintInfo();
	system("cls");
	_P_ = SummonAI(1);
	cout << "请输入名字:";
	cin >> _P_.name;
	if (_P_.name == "经验")
		_P_.exp += 10000;
	if (_P_.name == "创造") {
		_P_.base_atk = 10000;
		_P_.max_hp = 1919810;
		_P_.real_hp = 114514;
		HackerMode = true;
	}
	cout << "请选择难度\n";
	cout << "1. 简单(帮你撑过一级)\n";
	cout << "2. 困难\n";
	cout << "3. 地狱模式\n";
	cin >> x;
	if (x == 1) {
		_P_.base_atk = 5;
		_P_.max_hp = 66;
		_P_.real_hp = 55;
	}
	if (x == 3)flag = 1;
	Sleep(500);
	system("cls");
	seed = time(NULL);
	srand(seed);
	FightItemINIT();
	Game(Sx, Sy);
	return 0;
}

此次改动增加了附魔功能,特别鸣谢 yuyanrong 给出的思路!!!

4 个赞

玩法不懂私聊

2 个赞

bits/stdc++.h就不要有iostream了,除非是windows.hconio.h等没有在bits/stdc++.h里面的头文件

2 个赞

巨佬%%%
良作无人%%%

2 个赞

好玩,我1.0也玩了

2 个赞

好奇的问一下,如果把HackerMode变成1会是什么样?
而且有个致命的问题:敌人攻击时直接RE

1 个赞

今天修复了,对不起啊

2 个赞

1.0

2 个赞

我爬楼半天找到的

2 个赞

很简单




1 个赞

玩的时候又双叒叕发现一个问题:背包初始时物品数为2,使用完物品后背包内有物品数不变,求改进

可以升到2.1了.

我这个项目先停一会,我要去做其他的项目,不过3.0已经构思好了

1 个赞