作业要求如下:ps(名字虽说比较夸张,但实际要求却易于实现)
三国游戏开发
假设你将负责一款三国游戏武将系统的设计。三国中有名有姓的武将大概1000人。你需要为这些武将设计一定的属性值(如,武力、智力等,可以参考游戏《三国志13》),然后能给予一个文字浏览界面,在该界面下能够按照任意属性为主键进行升序或者降序排列,可用Excel来验证排序结果。
具体要求:
(1)从键盘输入若干武将信息(要求支持不低于1000个),每个武将信息至少包括姓名(姓名为拼音)、年龄、武力值、智力值和体力值(可根据自己设计予以增加,由自己设计文档决定)。以#作为结束标记。输入格式参考如下:
//姓名 年龄 体力 智力 武力
LB 35 84 85 85
GY 34 95 88 95
LS 46 84 85 85
ZL 27 90 85 92
ZF 31 95 85 85
ZY 39 90 90 92
(2)给予一个合适的格式化交互界面,能够方便浏览武将信息(请思考,如何才能方便浏览,格式化输出仅仅是基础,你的设计体现方便才能高分)。
(3)能够按照条件,达成依照某个属性作为主键进行升序或者降序排列,其中,姓名为字典序(条件请自行设计,比如,大多数类似下图的三国游戏中,你只需要点击一次武力,就能按武力升序排列,再点击一次,则可按照武力进行降序排列,这里的条件就是点击武力次数。当然,你只需要给用户一个合理的条件交互方式,然后输出一个字符界面)。
(4)支持自定义武将(即,具备插入/删除新武将到系统的能力)
(5)支持武将查找功能。至少支持根据姓名查找武将的功能。
(6)附加加分项:完成以下项目可以酌情加分。
设计并实现合适文字交互界面的浏览方式(思考,多于屏幕显示内容时,如何方便浏览)
设计并实现更多的模糊查找功能,比如根据武力值区间查找等(思考你所玩过的游戏,他们都有什么查找功能)。
效果如下
完整程序代码如下
#include<iostream>
#include<vector>
#include<string>
#include<fstream>
#include<sstream>
#include<iomanip>
#include<algorithm>
using namespace std;
struct hero//定义人物属性表
{
string name;
int age;
int strength;
int intelligence;
int force;
int sum;//能力值总和(除年龄)
};
void interface();//界面显示函数
void sortAge(const vector<hero> lst);//显示年龄排序
void sortStrength(const vector<hero> lst);//显示体力排序
void sortIntelligence(const vector<hero> lst);//显示智力排序
void sortForce(const vector<hero> lst);//显示武力排序
void sortSum(const vector<hero> lst);//显示能力值总量排序
void sortName(const vector<hero> lst);//显示名字排序(增序,其他为降序)
void readData(const string filename, vector<hero>& lst);//读入文件数据
void addHero(vector<hero>& lst);//增加武将
void deleHero(vector<hero>& lst);//删除武将
void showHero(const vector<hero>& lst);//查看初始未排序整体武将属性
void search(const vector<hero>& lst);//搜索特定武将
void searchRange(const vector<hero>& lst);//按属性进行范围搜索
void sec(string filename,vector<hero> &lst);//与玩家交互的选择设置
int main()
{
vector<hero> lst;
readData("data.txt", lst);
interface();
sec("data.txt",lst);
}
void readData(const string filename, vector<hero>& lst)
{
ifstream fin(filename);
if (fin.good())
{
string attribute,st;
getline(fin,attribute);//略过数据文档的第一行(属性表)
while (!fin.eof())//读入文档数据
{
hero ac;
fin >> ac.name >> ac.age >> ac.strength >> ac.intelligence >> ac.force;
ac.sum = ac.force + ac.intelligence + ac.strength;
lst.push_back(ac);
}
}
fin.close();
}
void interface()
{
system("CLS");//每次显示主界面前清空当前界面
cout << "**********欢迎来到三国游戏开发**********" << endl << endl;
cout << "选择1:查看人物整体属性" << endl;
cout << "选择2:以人物年龄排序(降序)" << endl;
cout << "选择3:以人物体力排序(降序)" << endl;
cout << "选择4:以人物智力排序(降序)" << endl;
cout << "选择5:以人物武力排序(降序)" << endl;
cout << "选择6:以人物能力值总和排序(降序)" << endl;
cout << "选择7:以人物姓名排序(增序)" << endl;
cout << "选择8:查找人物" << endl;
cout << "选择9:按区间查找人物" << endl;
cout << "选择10:增加人物" << endl;
cout << "选择11:删除人物" << endl;
cout << "选择12:退出游戏开发" << endl;
}
void sec(string filename,vector<hero>& lst)
{
while (1)
{
cout << endl;
cout << "*******请输入选择*******" << endl;
int sec;
int flag = 0;
cin >> sec;
switch (sec)
{
case 1:
showHero(lst);
break;
case 2:
sortAge(lst);
break;
case 3:
sortStrength(lst);
break;
case 4:
sortIntelligence(lst);
break;
case 5:
sortForce(lst);
break;
case 6:
sortSum(lst);
break;
case 7:
sortName(lst);
break;
case 8:
search(lst);
break;
case 9:
searchRange(lst);
break;
case 10:
addHero(lst);
break;
case 11:
deleHero(lst);
break;
case 12:
flag = 1;
}
if (flag) break;//选择12退出游戏
int i;
cin >> i;
switch (i)//函数返回后根据所选选项选择继续游戏(1)或退出(0)
{
case 0:
flag = 1;
break;
case 1:
interface();
}
if (flag) break;
}
}
void addHero(vector<hero>& lst)
{
system("CLS");//每次显示界面前清空当前界面
hero ac;
cout <<endl<<endl<< "******请按顺序输入武将的名字(按大写字母开头 如:刘邦 LB)年龄,体力,智力,武力值******"
<< endl;
cin >> ac.name >>ac.age>> ac.strength >> ac.intelligence >> ac.force;
ac.sum = ac.force + ac.intelligence + ac.strength;
lst.push_back(ac);
cout << endl << "已增加此武将";
cout << endl << endl << "******退出游戏请输入0,返回主界面请输入1******" << endl;
}
void deleHero(vector<hero>& lst)
{
system("CLS");
cout << endl<<endl << "******请输入要删除武将的姓名(如刘邦 输入 LB)******" << endl;
string dename;
cin >> dename;
int flag = 0;
for (int i = 0; i < lst.size(); i++)
{
if (lst[i].name == dename)
{
lst.erase(lst.begin() + i);
flag = 1;
break;
}
}
if (flag)//判定是否删除成功
{
cout << "已删除";
}
else
{
cout << "无此武将";
}
cout << endl << endl << "******退出游戏请输入0,返回主界面请输入1******" << endl;
}
void printEntry()//输出属性表的函数
{
cout << setw(5) << left << "姓名";
cout << setw(5) << left << "年龄";
cout << setw(5) << left << "体力";
cout << setw(5) << left << "智力";
cout << setw(5) << left << "武力";
cout << setw(5) << left << "能力值总和" << endl;
}
void showHero(const vector<hero>& lst)
{
system("CLS");
cout << "*******退出游戏请输入0,返回主界面请输入1******" << endl << endl;
printEntry();
for (int i = 0; i < lst.size(); i++)
{
cout << setw(5) << left << lst[i].name;
cout << setw(5) << left << lst[i].age;
cout << setw(5) << left << lst[i].strength;
cout << setw(5) << left << lst[i].intelligence;
cout << setw(5) << left << lst[i].force;
cout << setw(5) << left << lst[i].sum<<endl<<endl;
}
}
void sortAge(const vector<hero> lst)
{
vector<hero> lst1=lst;
bool ss3(hero a, hero b);//先声明ss3函数
sort(lst1.begin(), lst1.end(), ss3);
showHero(lst1);
}
bool ss3(hero a, hero b)//实现age的降序排序sort里的函数参数
{
return a.age > b.age;
}
void sortStrength(const vector<hero> lst)
{
vector<hero> lst1=lst;
bool ss1(hero a, hero b);
sort(lst1.begin(), lst1.end(), ss1);
showHero(lst1);
}
bool ss1(hero a, hero b)
{
return a.strength > b.strength;
}
void sortIntelligence(const vector<hero> lst)
{
vector<hero> lst1=lst;
bool ss2(hero a, hero b);
sort(lst1.begin(), lst1.end(), ss2);
showHero(lst1);
}
bool ss2(hero a, hero b)
{
return a.intelligence > b.intelligence;
}
void sortForce(const vector<hero> lst)
{
vector<hero> lst1=lst;
bool ss4(hero a, hero b);
sort(lst1.begin(), lst1.end(), ss4);
showHero(lst1);
}
bool ss4(hero a, hero b)
{
return a.force > b.force;
}
void sortSum(const vector<hero> lst)
{
vector<hero> lst1=lst;
bool ss5(hero a, hero b);
sort(lst1.begin(), lst1.end(), ss5);
showHero(lst1);
}
bool ss5(hero a, hero b)
{
return a.sum > b.sum;
}
void sortName(const vector<hero> lst)
{
vector<hero> lst1=lst;
bool ss6(hero a, hero b);
sort(lst1.begin(), lst1.end(), ss6);
showHero(lst1);
}
bool ss6(hero a, hero b)
{
return a.name < b.name;
}
void search(const vector<hero>& lst)
{
system("CLS");
cout <<endl<<endl<< "*******请输入所要搜索的武将姓名*******"<<endl<<endl;
string heroName;
cin >> heroName;
int i,flag = 0;
for (i = 0; i < lst.size(); i++)
{
if (lst[i].name == heroName)
{
flag = 1;
break;
}
}
if (flag)
{
cout << endl;
printEntry();
cout << setw(5) << left << lst[i].name;
cout << setw(5) << left << lst[i].age;
cout << setw(5) << left << lst[i].strength;
cout << setw(5) << left << lst[i].intelligence;
cout << setw(5) << left << lst[i].force;
cout << setw(5) << left << lst[i].sum << endl;
}
else
{
cout << endl << "无此武将" << endl;
}
cout <<endl<< "******退出游戏请输入0,返回主界面请输入1******" << endl;
}
void print(hero z)//实现单一武将输出代码复用
{
cout << setw(5) << left << z.name;
cout << setw(5) << left << z.age;
cout << setw(5) << left << z.strength;
cout << setw(5) << left << z.intelligence;
cout << setw(5) << left << z.force;
cout << setw(5) << left << z.sum << endl;
}
void searchRange(const vector<hero>& lst)
{
system("CLS");
void print(hero z);
cout <<endl<<endl<< "********输入查找的属性(如:age strength intelligence force 其中的一个)********"<<endl;
string section;
cin >> section;
cout <<endl<< "输入属性的范围" << endl;
int l, r;
cin >> l >> r;
char op = section[0];
cout<<endl<<endl << "(若为空则表示无此范围内武将)" << endl;
printEntry();
if (section == "sum")
{
for (int i = 0; i < lst.size(); i++)
{
if (lst[i].sum >= l && lst[i].sum <= r) print(lst[i]);
}
}
else
{
switch (op)
{
case 'a':
for (int i = 0; i < lst.size(); i++)
{
if (lst[i].age >= l && lst[i].age <= r) print(lst[i]);
}
break;
case 's':
for (int i = 0; i < lst.size(); i++)
{
if (lst[i].strength >= l && lst[i].strength <= r) print(lst[i]);
}
break;
case 'i':
for (int i = 0; i < lst.size(); i++)
{
if (lst[i].intelligence >= l && lst[i].intelligence <= r) print(lst[i]);
}
break;
case 'f':
for (int i = 0; i < lst.size(); i++)
{
if (lst[i].force >= l && lst[i].force <= r) print(lst[i]);
}
break;
}
}
cout <<endl<< endl << "******退出游戏请输入0,返回主界面请输入1******" << endl;
}