C++实践课作业-----三国游戏开发

作业要求如下: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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Rikka_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值