一.实验目的及内容
目的:
1.掌握面向对象程序设计的方法,明确类与对象的概念,掌握面向对象设计七大原则;
2.掌握常见的设计模式以及类图的描述。
内容:
1.功能描述
2.游戏角色应有的属性
3.职业限制
4.初始属性
5.显示信息
注:具体实验内容见《第四章上机》
二.实验分析
本游戏为一个面向对象的游戏,函数部分分为三个部分:
1.输入姓名和性别并对其进行判断,看是否合理;
2.选择种族和职业并对其进行判断,看是否合理;
3.利用随机函数生成属性(力量,敏捷,体力,智力,智慧),由此计算出生命值和魔法值
三.类图
四.运行结果
五.个人总结
这次的上机作业目的是让我们学会使用UML的类图结构设计,面向对象设计的7大原则,使用适合的设计模式。我之前写C++程序的时候都是把所有的东西放在一个类中,然后在主函数中调用类里面的函数等。其实我这次刚,开始也是这样写的,写到一半我发现破坏了规则,即对于一个类而言,应该仅有一个引起它变化的原因,如果一个类承担的职责过多,就会容易遭到破坏。
另外这次的题目就主要用到了随机数的生成,这个在前几次的作业中涉及到了,唯一改变的就是随机数的生成是有条件的,所以也不是很难。
说到底,这次的程序写起来也不难,但是要注意的就是要遵循面向对象设计的7大原则。
六.源代码
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
int getSex(); //输入性别
int getRace(); //输入种族
int getOccupation(int); //输入职业
void Attribute(int occupation); //输出属性
char Isex[2][50]={"男","女"};
char Irace[5][50]={"人类","精灵","兽人","矮人","元素"};
char Ioccupation[6][50]={"狂战士","圣骑士","刺客","猎手","祭司","巫师"};
//类1:姓名和角色
class Base
{
protected:
char name[50]; //限制姓名的长度
int sex; //性别
int sex_choice;
public:
void getBase();
friend class Output; //友元类,输出角色信息
//输入姓名及其处理
void judge_name(string name){
int length=name.size();
if(length>50)
{
cout<<"请输入合理长度的姓名!"<<endl;
exit(1);
}
}
};
//角色的种族、职业
class Race
{
protected:
char name[50];
int sex;
int sex_choice;
int race;
int occupation;
int race_choice;
public:
void getBase();
friend class Output; //友元类,输出角色信息
void getRace();
};
//输入性别并对其处理
int getSex()
{
int sex;
cout<<"请选择您游戏角色的性别(0男性,1女性):";
cin>>sex;
while(1)
{
if (sex==0||sex==1)
break;
else
cout<<"输入错误,请重新输入!\n";
break;
}
return sex;
}
//种族
int getRace()
{
int race;
cout<<"请选择您游戏角色的种族(0人类,1精灵,2兽人,3矮人,4元素):";
cin>>race;
while(1)
{
if (race>=0&&race<=4)
break;
else
cout<<"输入错误,请重新输入!";
break;
}
return race;
}
//职业
int getOccupation(int race)
{
int occupation;
switch (race)
{
case 0:
while (1)
{
cout<<"请选择您的职业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师)";
cin>>occupation;
if (occupation>=0&&occupation<=5)
break;
else
cout<<"输入错误,请重新输入!\n";
}break;
case 1:
while (1)
{
cout<<"请选择您的职业(2刺客,3猎手,4祭司,5巫师)";
cin>>occupation;
if (occupation>=2&&occupation<=5)
break;
else
cout<<"输入错误,请重新输入!\n";
}break;
case 2:
while (1)
{
cout<<"请选择您的职业(0狂战士,3猎手,4祭司,)";
cin>>occupation;
if (occupation==0||occupation==3||occupation==4)
break;
else
cout<<"输入错误,请重新输入!\n";
}break;
case 3:
while (1)
{
cout<<"请选择您的职业(0狂战士,1圣骑士,4祭司,)";
cin>>occupation;
if (occupation==0||occupation==1||occupation==4)
break;
else
cout<<"输入错误,请重新输入!\n";
}break;
case 4:while (1)
{
cout<<"请选择您的职业(4祭司,5巫师)";
cin>>occupation;
if (occupation>=4&&occupation<=5)
break;
else
cout<<"输入错误,请重新输入!\n";
}break;
default: ;
}
return occupation;
}
//属性
void Attribute(int occupation)
{
int rand1=rand()%11+25;//生成一个25到35的随机数
int rand2=rand()%11+0;//生成一个0到10的随机数
int rand3=rand()%11+15;//生成一个15到25的随机数
int rand4=rand()%11+5;//生成一个5到15的随机数
int rand5=rand()%11+10;//生成一个10到20的随机数
int rand6=rand()%11+30;//生成一个30到40的随机数
int rand7=rand()%11+35;//生成一个35到45的随机数
switch (occupation)
{
case 0:cout<<"力量:"<<" "<<rand()%11+35<<endl;//生成一个35到45的随机数
cout<<"===================================="<<endl;
cout<<"敏捷:"<<" "<<rand()%11+15<<endl;
cout<<"===================================="<<endl;
cout<<"体力:"<<" "<<rand1<<endl;
cout<<"===================================="<<endl;
cout<<"智力:"<<" "<<rand2<<endl;
cout<<"===================================="<<endl;
cout<<"智慧:"<<" "<<rand4<<endl;
cout<<"===================================="<<endl;
cout<<"生命值:"<<" "<<20*rand1<<endl;//生命值=体力*20。
cout<<"===================================="<<endl;
cout<<"魔法值:"<<" "<<10*(rand2+rand2)<<endl;//魔法值=(智力+智慧)*10。
cout<<"===================================="<<endl;
break;
case 1:cout<<"力量"<<" "<<rand()%11+20<<endl;
cout<<"===================================="<<endl;
cout<<"敏捷"<<" "<<rand()%11+10<<endl;
cout<<"===================================="<<endl;
cout<<"体力"<<" "<<rand1<<endl<<endl;
cout<<"===================================="<<endl;
cout<<"智力"<<" "<<rand3<<endl<<endl;
cout<<"===================================="<<endl;
cout<<"智慧"<<" "<<rand4<<endl<<endl;
cout<<"===================================="<<endl;
cout<<"生命值"<<" "<<20*rand1<<endl;
cout<<"===================================="<<endl;
cout<<"魔法值"<<" "<<10*(rand3+rand4)<<endl;
cout<<"===================================="<<endl;
break;
case 2:cout<<"力量"<<" "<<rand1<<endl;
cout<<"===================================="<<endl;
cout<<"敏捷"<<" "<<rand()%11+30<<endl;
cout<<"===================================="<<endl;
cout<<"体力"<<" "<<rand3<<endl;
cout<<"===================================="<<endl;
cout<<"智力"<<" "<<rand5<<endl;
cout<<"===================================="<<endl;
cout<<"智慧"<<" "<<rand4<<endl;
cout<<"===================================="<<endl;
cout<<"生命值"<<" "<<20*rand3<<endl;
cout<<"===================================="<<endl;
cout<<"魔法值"<<" "<<10*(rand5+rand4)<<endl;
cout<<"===================================="<<endl;
break;
case 3:cout<<"力量"<<rand5<endl;
cout<<"===================================="<<endl;
cout<<"敏捷"<<rand()%11+35<<endl;
cout<<"===================================="<<endl;
cout<<"体力"<<rand5<<endl;
cout<<"===================================="<<endl;
cout<<"智力"<<rand4<<endl;
cout<<"===================================="<<endl;
cout<<"智慧"<<rand3<<endl;
cout<<"===================================="<<endl;
cout<<"生命值"<<20*rand5<<endl;
cout<<"===================================="<<endl;
cout<<"魔法值"<<10*(rand4+rand3)<<endl;
cout<<"===================================="<<endl;
break;
case 4:cout<<"力量"<<rand5<<endl;
cout<<"===================================="<<endl;
cout<<"敏捷"<<rand3<<endl;
cout<<"===================================="<<endl;
cout<<"体力"<<rand5<<endl;
cout<<"===================================="<<endl;
cout<<"智力"<<rand6<<endl;
cout<<"===================================="<<endl;
cout<<"智慧"<<rand5<<endl;
cout<<"===================================="<<endl;
cout<<"生命值"<<20*rand5<<endl;
cout<<"===================================="<<endl;
cout<<"魔法值"<<10*(rand5+rand6)<<endl;
cout<<"===================================="<<endl;
break;
case 5:cout<<"力量"<<" "<<rand4<<endl;
cout<<"===================================="<<endl;
cout<<"敏捷"<<" "<<rand()%11+15<<endl;
cout<<"===================================="<<endl;
cout<<"体力"<<" "rand4<<endl;
cout<<"===================================="<<endl;
cout<<"智力"<<" "<<rand3<<endl;
cout<<"===================================="<<endl;
cout<<"智慧"<<" "<<rand7<<endl;
cout<<"===================================="<<endl;
cout<<"生命值"<<" "<<20*rand4<<endl;
cout<<"===================================="<<endl;
cout<<"魔法值"<<" "<<10*(rand3+rand7)<<endl;
cout<<"===================================="<<endl;
break;
default:;
}
}
//主函数,输入角色姓名和性别
void main()
{
while(1)
{
Base b;
char name[50];
cout<<"请输入您游戏角色的姓名:";
cin>>name;
b.judge_name(name);
int sex;
sex=getSex();
int race;
race=getRace();
int occupation;
srand((unsigned)time(NULL)); //随机数
occupation=getOccupation(race); //职业
cout << "===================================" << endl;
cout<<"姓名"<<" "<<name<<endl;
cout<<"===================================="<<endl;
cout<<"性别"<<" "<<Isex[sex]<<endl;
cout<<"===================================="<<endl;
cout<<"种族"<<" "<<Irace[race]<<endl;
cout<<"===================================="<<endl;
cout<<"职业"<<" "<<Ioccupation[occupation]<<endl;
cout<<"===================================="<<endl;
Attribute(occupation); //输出属性
int a;
cout<<"如您对此次生成角色满意,请输入0,不满意请输入1重新选择:";
cin>>a;
if (a==0)
break;
}
}