[C++] 小游戏 长路漫漫 0.0.02 未完成版

前言

今天zty带来的是『ThoughtsStarHub』小组的项目,长路漫漫的0.0.02的版本(该游戏尚未完成,无法正常游玩),此版本由zty一人开发完成

此项目联合作者:

FrostedLotus·霜莲-CSDN博客

                                                  先   赞   后   看    养   成   习   惯 

众所不周知,zty的头图换了

(小声嘀咕)宝可梦!!智蛙和智神好帅!!!

目录

前言

此项目联合作者:

演示用编译器

标准

                                                  先   赞   后   看    养   成   习   惯  

正文

更新日志:

But

游戏截图

Code:

后记


 

                                                  先   赞   后   看    养   成   习   惯  

演示用编译器

Dev C++ 6.7.5 Red panda

下载链接:[C++编译器] Dev-C++ 6.7.5 (附下载链接、安装教程)_red panda dev-c++-CSDN博客

标准

    C++14

                                                  先   赞   后   看    养   成   习   惯  

正文

更新日志:

        新增:1,游戏内查看更新日志

        修改:1,角色创建  2,开头剧情  3,部分UI

        删除:无

But

目前还是未完成版,没法正常游玩,缺的几个主要部分:

  1. 战斗函数
  2. 村庄以及道路
  3. 商铺
  4. 黑暗领主和他手底下一批人的结构体
  5. 剧情
  6. 黑暗领主AI
  7. 技能
  8. 美术
游戏截图

Code:
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>

using namespace std;
void No() {
	HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO info;
	info.dwSize = 100;
	info.bVisible = FALSE;
	SetConsoleCursorInfo(consoleHandle, &info);
}
void print(string text) {
	for (int i = 0; i < text.size(); i++) {
		cout << text[i];
		Sleep(20);
	}
}
void Yan(int a) {// 1蓝 2绿 3紫 4红 5黄 6深蓝 7棕 8浅灰 9深灰 10绿绿 11绿紫 12绿黄 13蓝蓝
	if (a == 0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
	if (a == 1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
	if (a == 2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
	if (a == 3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
	if (a == 4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
	if (a == 5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
	if (a == 6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
	if (a == 7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN);
	if (a == 8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
	if (a == 9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
	if (a == 10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | BACKGROUND_GREEN);
	if (a == 11) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE | BACKGROUND_GREEN);
	if (a == 12) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | BACKGROUND_GREEN);
	if (a == 13) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE | BACKGROUND_INTENSITY | BACKGROUND_BLUE);
}
void Bai() {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
enum Job { WAR, ARCH, DEF, MAG, ASN, SUP };

struct Character {
	string name;
	Job job;
	int lv;
	int exp;
	int skills[3];
	bool unlocked[3];
	int hp;
	int atk;
	int def;
	float spd;
	bool owned;
	bool isPlayer;

	int getRequiredExp() {
		return 200 + 50 * (lv - 1);
	}

	bool levelUp() {
		int requiredExp = getRequiredExp();
		if (exp < requiredExp) return false;

		exp -= requiredExp;
		lv++;
		float boost = isPlayer ? 1.2f : 1.0f;

		switch (job) {
			case WAR:
				hp += 15 * boost;
				atk += 8 * boost;
				def += 5 * boost;
				spd += 0.02f * boost;
				break;
			case ARCH:
				hp += 10 * boost;
				atk += 10 * boost;
				def += 3 * boost;
				spd += 0.05f * boost;
				break;
			case DEF:
				hp += 20 * boost;
				atk += 3 * boost;
				def += 8 * boost;
				spd += 0.01f * boost;
				break;
			case MAG:
				hp += 8 * boost;
				atk += 12 * boost;
				def += 2 * boost;
				spd += 0.03f * boost;
				break;
			case ASN:
				hp += 12 * boost;
				atk += 9 * boost;
				def += 4 * boost;
				spd += 0.06f * boost;
				break;
			case SUP:
				hp += 13 * boost;
				atk += 5 * boost;
				def += 6 * boost;
				spd += 0.04f * boost;
				break;
		}

		if (lv == 15) unlocked[1] = true;
		if (lv == 30) unlocked[2] = true;
		return true;
	}

	void showDetail() {
		const char* jobs[] = {"战士", "弓箭手", "防御者", "法师", "刺客", "辅助"};
		cout << "=== 详细信息 ===\n"
		     << "名称: " << name << (isPlayer ? "[玩家]" : "") << "\n"
		     << "等级: " << lv << "\n职业: " << jobs[job]
		     << "\nHP: " << hp << "\n攻击: " << atk
		     << "\n防御: " << def << "\n速度: " << spd
		     << "\n经验: " << exp << "/" << getRequiredExp()
		     << "\n状态: " << (owned ? "已拥有" : "未拥有") << "\n\n";
	}

	void showSimple(bool selected) {
		const char* jobs[] = {"战士", "弓箭手", "防御者", "法师", "刺客", "辅助"};
		cout << (selected ? "> " : "  ")
		     << name << " Lv." << lv
		     << " [" << jobs[job] << "]"
		     << (owned ? "[已拥有]" : "") << endl;
	}
} heroes[12] = {
	{"阿瑞斯", WAR, 1, 0,  {101, 102, 103}, {1, 0, 0}, 350, 45, 60, 1.1f, false, false},
	{"威廉", WAR,   1, 0,  {101, 102, 103}, {1, 0, 0}, 280, 38, 55, 1.05f, false, false},
	{"艾玛", ARCH,  1, 0,  {101, 102, 103}, {1, 0, 0}, 190, 28, 65, 1.3f, false, false},
	{"艾琳", ARCH,  1, 0,  {101, 102, 103}, {1, 0, 0}, 150, 22, 50, 1.25f, false, false},
	{"迈克尔", DEF, 1, 0,  {101, 102, 103}, {1, 0, 0}, 500, 35, 80, 0.8f, false, false},
	{"詹姆斯", DEF, 1, 0,  {101, 102, 103}, {1, 0, 0}, 420, 30, 75, 0.9f, false, false},
	{"索菲亚", MAG, 1, 0,  {101, 102, 103}, {1, 0, 0}, 180, 65, 40, 1.0f, false, false},
	{"莉莉丝", MAG, 1, 0,  {101, 102, 103}, {1, 0, 0}, 160, 55, 35, 1.1f, false, false},
	{"丹尼尔", ASN, 1, 0,  {101, 102, 103}, {1, 0, 0}, 220, 70, 30, 1.5f, false, false},
	{"奥利亚", SUP, 1, 0,  {101, 102, 103}, {1, 0, 0}, 200, 25, 40, 1.2f, false, false},
};
struct Wars {
	int men[114514];
	int SBs[115414];
	int where;
} Wars[111];
Character player;
//Character createPlayer() {
//	system("cls");
//	cout << "输入角色名: ";
//	cin >> player.name;
//	cout << "选择职业 (1-6):\n"
//	     << "1.战士 2.弓箭手 3.防御者\n"
//	     << "4.法师 5.刺客 6.辅助\n";
//	player.job = static_cast<Job>(_getch() - '1');
//
//	player.lv = 1;
//	player.exp = 0;
//	player.skills[0] = 101;
//	player.unlocked[0] = true;
//	player.owned = true;
//	player.isPlayer = true;
//
//	switch (player.job) {
//		case WAR:
//			player.hp = 200;
//			player.atk = 30;
//			player.def = 25;
//			player.spd = 1.0f;
//			break;
//		case ARCH:
//			player.hp = 150;
//			player.atk = 35;
//			player.def = 15;
//			player.spd = 1.3f;
//			break;
//		case DEF:
//			player.hp = 250;
//			player.atk = 20;
//			player.def = 40;
//			player.spd = 0.8f;
//			break;
//		case MAG:
//			player.hp = 120;
//			player.atk = 45;
//			player.def = 10;
//			player.spd = 1.1f;
//			break;
//		case ASN:
//			player.hp = 160;
//			player.atk = 40;
//			player.def = 15;
//			player.spd = 1.5f;
//			break;
//		case SUP:
//			player.hp = 180;
//			player.atk = 25;
//			player.def = 30;
//			player.spd = 1.2f;
//			break;
//	}
//	return player;
//}

void setColor(int color) {
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}
void stri(int i) {
	while (i--) {
		Yan(8);
		cout << "█";
	}
	return;
}
void strin(int i) {
	while (i--) {
		setColor(14); // 黄色标题
		cout << "█";
	}
	return;
}
Character createPlayer() {
	system("cls");
	setColor(14); // 黄色标题
	cout << "\n\n\t================= 角色创建 ==================" << endl;
	cout << "\t输入角色名: ";
	string name;
	cin >> name;

	setColor(7); // 恢复白色

	const int BAR_LENGTH = 20;
	int currentChoice = 1;
	bool confirmed = false;

	while (!confirmed) {
		system("cls");
		setColor(14);
		cout << "\n\n\t================= 角色创建 ==================" << endl;
		cout << "\t输入角色名: " << name << endl;

		cout << "\n\t选择职业 (↑↓选择,空格确认):" << endl;
		cout << "\t1. " << string(10, '=') << " 战士 " << string(10, '=') << endl;
		cout << "\t2. " << string(10, '=') << " 弓箭手 " << string(10, '=') << endl;
		cout << "\t3. " << string(10, '=') << " 防御者 " << string(10, '=') << endl;
		cout << "\t4. " << string(10, '=') << " 法师 " << string(10, '=') << endl;
		cout << "\t5. " << string(10, '=') << " 刺客 " << string(10, '=') << endl;
		cout << "\t6. " << string(10, '=') << " 辅助 " << string(10, '=') << endl;

		cout << "\n\t当前选择: " << currentChoice << endl;

		// 优化选择部分
		if (GetAsyncKeyState(VK_UP) & 0x8000 && currentChoice > 1) {
			currentChoice--;
		}
		if (GetAsyncKeyState(VK_DOWN) & 0x8000 && currentChoice < 6) {
			currentChoice++;
		}
		if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
			confirmed = true;
		}

		// 保留原有属性进度条
		int hp = 0, atk = 0, def = 0, spd = 0;
		switch (currentChoice) {
			case 1:
				hp = 200;
				atk = 30;
				def = 25;
				spd = 10;
				break;
			case 2:
				hp = 150;
				atk = 35;
				def = 15;
				spd = 13;
				break;
			case 3:
				hp = 250;
				atk = 20;
				def = 40;
				spd = 8;
				break;
			case 4:
				hp = 120;
				atk = 45;
				def = 10;
				spd = 11;
				break;
			case 5:
				hp = 160;
				atk = 40;
				def = 15;
				spd = 15;
				break;
			case 6:
				hp = 180;
				atk = 25;
				def = 30;
				spd = 12;
				break;
		}

		cout << "\n\t属性预览:" << endl;
		setColor(14);
		cout << "\t生命值: [" ;
		setColor(14);
		strin(hp * BAR_LENGTH / 250 ) ;
		setColor(14);
		stri(BAR_LENGTH - (hp * BAR_LENGTH) / 250);
		cout << "] " << hp << "/250" << endl << endl;
		setColor(14);
		cout << "\t攻击力: [" ;
		setColor(14);
		strin(atk * BAR_LENGTH / 45 );
		setColor(14);
		stri(BAR_LENGTH - (atk * BAR_LENGTH) / 45);
		cout << "] " << atk << "/45" << endl << endl;
		setColor(14);
		cout << "\t防御力: [" ;
		setColor(14);
		strin(def * BAR_LENGTH / 40);
		setColor(14);
		stri(BAR_LENGTH - (def * BAR_LENGTH) / 40);
		cout << "] " << def << "/40" << endl << endl;
		setColor(14);
		// 新增速度进度条
		setColor(14);
		cout << "\t 速度 : [";
		setColor(14);
		strin(spd * BAR_LENGTH / 15); // 1.5为最大速度值
		setColor(14);
		stri(BAR_LENGTH - (spd * BAR_LENGTH ) / 15);
		cout << "] " << fixed << setprecision(1) << spd << "/15" << endl << endl;
		Sleep(150);
	}
	player.owned = 1;
	player.isPlayer = 1;
	player.name = name;
	player.job = WAR;
	player.hp = 200; // 使用switch初始化实际值
	player.atk = 30;
	player.def = 25;
	player.spd = 1.0f;
	switch (currentChoice) {
		case 2:
			player.job = ARCH;
			player.hp = 150;
			player.atk = 35;
			player.def = 15;
			player.spd = 1.3f;
			break;
		case 3:
			player.job = DEF;
			player.hp = 250;
			player.atk = 20;
			player.def = 40;
			player.spd = 0.8f;
			break;
		case 4:
			player.job = MAG;
			player.hp = 120;
			player.atk = 45;
			player.def = 10;
			player.spd = 1.1f;
			break;
		case 5:
			player.job = ASN;
			player.hp = 160;
			player.atk = 40;
			player.def = 15;
			player.spd = 1.5f;
			break;
		case 6:
			player.job = SUP;
			player.hp = 180;
			player.atk = 25;
			player.def = 30;
			player.spd = 1.2f;
			break;
	}

	return player;
}
void heroDisplay() {
	int select = 0;
	system("cls");
	system("pause");
	while (true) {
		system("cls");
		cout << "==== 英雄列表 (↑/↓选择,空格查看,ESC返回) ====\n\n";

		for (int i = 0; i < 10; i++) {
			cout << "\t";
			heroes[i].showSimple(i == select);
			cout << "\n";
		}
		cout << "\t";
		player.showSimple(10 == select);
		cout << "\n";
		int key = _getch();
		switch (key) {
			case 72: // ↑
				select = (select - 1 + 11) % 11;
				break;
			case 80: // ↓
				select = (select + 1) % 11;
				break;
			case 32:
				system("cls");
				if (select == 10) {
					player.showDetail();
					_getch();
					break;
				}
				heroes[select].showDetail();
				_getch();
				break;
			case 27:
				return;
		}
	}
}
void start() {
	Yan(8);
	cout << "\n";
	cout << "    █      ██  █    █  ██      ███  ██  █  █ ███ █    █ ███ █    █\n";
	cout << "    █     █  █ ██  █ █   █      █   █  █ █  █ █  █ ██  █ █      █  █ \n";
	cout << "    █     █  █ █ █ █ █           █   █  █ █  █ ███ █ █ █ ███   ██   \n";
	cout << "    █     █  █ █  ██ █ ▄█      █   █  █ █  █ █ █  █  ██ █        █   \n";
	cout << "    ███  ██  █    █  █▔█     █     ██   ██  █  █ █    █ ███    █   \n\n";
	print(  "-----------------------------------------");
	Yan(1);
	cout << "长";
	Yan(4);
	cout << "路";
	Yan(1);
	cout << "漫漫";
	Yan(8);
	print("---------------------------------------------");
	print("---------------------------------------long journey-------------------------------------------");
	print("----------------------------------------版本0.0.02--------------------------------------------");
	print("-----------------------------------按下任意键开始游戏-----------------------------------------\n\n\n\n\n\n\n\n\n\n\n");
	cout << "                   联合作者:   CSDN zty郑桐羽呀   CSDN FrostedLotus·霜莲                     ";
	cout << "              所属组别:『ThoughtsStarHub』项目组   所属团队:『ZTY』CSDN创作主团               ";
	cout << "                              版权归属:『ZTY』CSDN创作主团                                   ";
}
void slowsay(string s, int t) {
	for (int i = 0; i < s.size(); i++) {
		cout << s[i];
		Sleep(t);
	}
}
void Intro() {
	Bai();
	Yan(4);
	system("cls");
	slowsay("\n\n\t(以下剧情可按ESC键跳过)\n\n\t很久很久以前,奥诺本大陆曾是一片繁荣祥和的土地\n\n", 20);
	if (_kbhit() && _getch() == 27) return;

	slowsay("\t直到黑暗领主玛尔加斯施展了诅咒——\n\n", 20);
	if (_kbhit() && _getch() == 27) return;

	print("\t他窃取了大陆上所有生灵的战魂,使人们变得软弱无力,怪物横行肆虐……\n\n");
	if (_kbhit() && _getch() == 27) return;

	slowsay("\t而你,是一位未被完全剥夺战魂的觉醒者\n\n", 20);
	if (_kbhit() && _getch() == 27) return;

	slowsay("\t为了破除诅咒,你必须击败盘踞在各处的魔物领主,夺回战魂碎片,让大陆重现光明!\n\n", 20);
	if (_kbhit() && _getch() == 27) return;

	print("\t\t按下任意键继续\n\n\n\t\t");
	if (_getch() == 27) return;
	system("cls");
}

void rizhi() {
	int selection = 0;
	system("cls");
	system("pause");
	bool confirmed = false;
	while (!confirmed) {
		cout << "\n\n\n\t请选择更新日志选项(注:DNF指 Did Not Finish):\n";
		cout << "\t1. " << "0.0.01 DNF版\n";
		cout << "\t2. " << "0.0.02 DNF版\n";
		cout << "\n当前选择: " << selection + 1 << "  回车键确定  " << endl;

		if (GetAsyncKeyState(VK_UP) & 0x8000 && selection > 0) selection = selection - 1 % 3;
		if (GetAsyncKeyState(VK_DOWN) & 0x8000 && selection < 1) selection = selection + 1 % 3;
		if (GetAsyncKeyState(VK_RETURN) & 0x8000) {
			confirmed = true;
		}
		Sleep(150);
		system("cls");
	}
	system("cls");

	switch (selection + 1) {
		case 1:
			cout << "\t完成:\n\n\t1,主干部分	2,图鉴	 3,英雄结构体   4,角色创建   5,剧情   6,第一版封面\n\n";
			cout << "\t修改:\n\n\t  无\n\n";
			cout << "\t删除:\n\n\t  无\n\n";
			system("pause");

			break;
		case 2:
			cout << "\t完成:\n\n\t1,更新日志  \n\n";
			cout << "\t修改:\n\n\t  1,角色创建  2,开头剧情  3,部分UI\n\n";
			cout << "\t删除: \n\n\t  无\n\n";
			system("pause");

			break;
		default:
			break;
	}
	return;
}

void war() { //              未完成

}

void home2(int d) {
A:
	int xuan = 0;
	bool confirmed = false;

	while (!confirmed) {
		system("cls"); // 清屏刷新界面

		cout << "\n\nDay : " << d << " \n\n";
		cout << (xuan == 0 ? "> " : "  ") << "  调动与指挥\n\n";
		cout << (xuan == 1 ? "> " : "  ") << "  英雄图鉴\n\n";
		cout << (xuan == 2 ? "> " : "  ") << "  更新日志\n\n";
		cout << (xuan == 3 ? "> " : "  ") << "  万事俱备,睡个好觉\n\n\n";
		cout << "当前选择: " <<
		     (xuan == 0 ? "调动与指挥" :
		      xuan == 1 ? "英雄图鉴" :
		      xuan == 2 ? "更新日志" : "万事俱备,睡个好觉") << endl;

		// 检测上下键
		if (GetAsyncKeyState(VK_UP) & 0x8000) {
			xuan = (xuan - 1 + 4) % 4; // 循环向上选择
			Sleep(100);
		} else if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
			xuan = (xuan + 1) % 4; // 循环向下选择
			Sleep(100);
		}

		// 检测空格键确认
		if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
			confirmed = true;
			switch (xuan) {
				case 0:
					war();
					break;
				case 1:
					heroDisplay();
					break;
				case 2:
					rizhi(); // 新增更新日志功能
					break;
				case 3:
					return; // 直接返回
			}
		}

		Sleep(50); // 降低CPU占用
	}
	goto A;
}
void home() {
	int d = 1;
	while (1) {
		home2(d);
		d++;
	}
}
signed main() {
	system("mode con cols=94 lines=25");
	No();
	start();
	getch();
	Intro();
	createPlayer();
	home();
	return 0;
}

后记

作者:zty郑桐羽呀

联系方式:(不挂了,有事私信)

注:『ThoughtsStarHub』小组与新加坡公司StarHub没有任何隶属关系,『ThoughtsStarHub』小组是『ZTY』CSDN创作主团下的一个项目小组

兄弟们给个赞呗

                                                  先   赞   后   看    养   成   习   惯  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zty郑桐羽呀 『ZTY』主团团长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值