前言
今天zty带来的是『ThoughtsStarHub』小组的项目,长路漫漫的0.0.02的版本(该游戏尚未完成,无法正常游玩),此版本由zty一人开发完成
此项目联合作者:
先 赞 后 看 养 成 习 惯
众所不周知,zty的头图换了
(小声嘀咕)宝可梦!!智蛙和智神好帅!!!
目录
先 赞 后 看 养 成 习 惯
演示用编译器
下载链接:[C++编译器] Dev-C++ 6.7.5 (附下载链接、安装教程)_red panda dev-c++-CSDN博客
标准
C++14
先 赞 后 看 养 成 习 惯
正文
更新日志:
新增:1,游戏内查看更新日志
修改:1,角色创建 2,开头剧情 3,部分UI
删除:无
But
目前还是未完成版,没法正常游玩,缺的几个主要部分:
- 战斗函数
- 村庄以及道路
- 商铺
- 黑暗领主和他手底下一批人的结构体
- 剧情
- 黑暗领主AI
- 技能
- 美术
游戏截图
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创作主团下的一个项目小组
兄弟们给个赞呗
先 赞 后 看 养 成 习 惯