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):游戏需要的设备: 1:需要的配置:必须安装DiectX8.1以上。 2:最少2台机器可以进行互联通讯。 (2):游戏的安装: 1:只要把exe程序和几个图片放在同一目录下就行了。 二:进行游戏: (1):游戏进入的步骤: 首先两个玩家谁先创建服务器都可以。在建立完后,游戏会报告本机的IP地址。然后你可以通过QQ,或是其它方式将IP告诉你的朋友,让他在连接服务器选项上输入这个IP地址。完毕后双方的游戏界面会弹出“吴,蜀,魏,阀”四图片,这是这个游戏的可选势力(目前还没有作用),任选其一,双方操作完毕后进入实质的游戏状态。 (2):游戏: 1:游戏之初 在游戏中创建主机的为蓝方,连接的副机为绿方。识别的方式也很容易,你只能看到自己城池的情报。地图上除主机和副机各自占领的一个城市(许昌,汉中),其它的8个都为空城,并且双方没有将领。 2:游戏指令 指令在游戏的右下方,只有6个“攻击,调动,招募,征兵,任命,解职”。 1攻击:可以攻击一个非自己的城市,要占领空城自己的本城的兵力需要5000以上,占领后将会把进攻城兵力的5000分配给被占领城市。而如果要进攻对方的城则根据计算,整体攻击力为本城兵力的1/10,但大于10000以上都只有1000的攻击力,任命太守可以提高攻击力, 如果一个太守“统领能力为99的曹操“去进攻一个没有太守的敌城时就会有如下计算。 (0~99)*30 + 1000 这是攻击力, 1000- (0~99)*30,这是被攻击力。(0~99)是个随机数。当取值为99的时候攻击力就是3970 ,而被攻击值为 – 1970, 大概意思就是我可以杀掉对方3970的兵力,而自己却还可以增加1970的兵力。但对方如果太守为一个统领96的姜维那随机数的取值范围就只有(0~3)了。 另一个武将的作用,在进攻或守备时武将可以对城中的所有将领进行体力上的攻击,双方武将每相差1点武力可以造成2点HP的伤害,但最大只能造成30HP,相当于武力相差15。武将主要影响对方全城将领的体力负担,从而使对方将领的生命受到更大的威胁。 攻击和守备时必须损失的体力:(攻守)太守20HP,(攻守)武将20HP,双方武力差*2,并将这个差值扣到武力差的那方全城将领身上。 占领敌方城池后,自动拥有2500兵力,这部分兵力是免费给予的。 2调动:将本城的兵力调往指定城,主要用于占领新城后兵力不足,可以分担新城的指令,但本城兵力在1000以下则无法再使用本命令。 3招募:招募将领,每个城中,都有5个可以招募的将领。将领是随机分配的,当招募完一个后他会再换上新的5个将领,将领目前有84个。 4征兵:可提高本城的兵力,如果有侍中的话效果会更显著,注意侍中的政治能力有等级划分,0~79,80~89, 90~94,95~99, 100。共5个等级,级别越高,能力越好,具体算法如下。 (0~79)*4+500,(0~89)*5+500,~以此类推(同上面一样()内的数据为随机数)。无侍中下只有550。 征兵需要侍中20点的HP。 5任命:任命4个职位的官员,太守,武将,侍中已经介绍,参军的作用是缩短指令的执行时间,执行完一个指令后都需要一段时间的等待,任免参军可以缩短这个等待。具体如下:命令时间/3/100*参军智力*10/(等级划分0~79 =6,80~89=7,~以此类推)。大概意思象诸葛亮那样智力100的可以减少1/3的命令时间。任命已经有职位的将领将会执行替换。 6解职:解除职位,将领的HP只有在没有任职的情况下才可以恢复。因此将领快死而又没有可替换时可执行此命令。 7最下方灰色的标名称:命令的下放有一个城市名称,这是你指当前正在使用的城市。 8城池边上的白星:白星表示是否可以执行本城的命令,只有拥有白星才可以下达命令。 9将领生命的恢复:将领只有在非任命状态下可以恢复生命,每30秒/本将领的生命上限值的10分之1 3:游戏的胜利: 占领所有的城市,你就赢了。 无显示数据: #define TimeAttack 15000 //攻击15秒 #define TimeConscripy 15000 ////增兵15秒 #define TimeEnrol 8000 ////招将8秒 #define TimeTAppoint 4000 ///任命4秒 #define TimeAbsolve
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Rikka_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值