目录
1.需求分析
2.设计思路
3.成果展示
4.代码设计
5.项目总结
一、需求分析
凡人修仙传
这个世界中,有妖兽,灵石,修仙者
妖兽有自己的种类。
妖兽分为不同的等级:
1级妖兽 价值100初级灵石
2级妖兽 价值200初级灵石
3级妖兽 价值500初级灵石
4级妖兽 价值1000初级灵石
5级妖兽 价值2000初级灵石
6级妖兽 价值5000初级灵石
7级妖兽 价值10000初级灵石
8级妖兽 价值20000初级灵石
9级妖兽 价值100000初级灵石
灵石:类似于黄金的硬货币
灵石级别划分:
初级灵石
中级灵石:10初级灵石
高级灵石:10中级灵石
修仙者:
姓名
门派:(黄枫谷,鬼灵门,落云宗,掩月宗,古剑门,御灵宗,散修)
级别:(炼气,筑基,结丹,元婴,化神,炼虚,合体,大成,渡劫)
资产(不定数量的妖兽,不定数量的灵石)
状态:生,死
项目需求:
1.
修仙者之间常常进行贸易活动,用灵石购买妖兽,或者用妖兽换取灵石
修仙者可以通过挖矿获取灵石,每次只能获取100个灵石
修仙者可以捕获妖兽,能否捕获取决于自己的战斗力是否大于妖兽
2.
修仙者之间进行比武,实力更强大的胜利
修仙者之间进行争斗,强大的生,生者获取死者所有资产
修仙者闭关进阶,可能成功,可能失败,进阶成功后,自己的级别+1
二、设计思路
1.类的设计:根据项目需求设计了四个类:灵石类、怪兽类、玩家类、控制类
2.构建接口:将需要实现的活动和对应接口进行定义,进行整体框架的搭建
3.完善接口:将需求一步一步慢慢实现,在实现过程中不断的完善bug和开始设计不足的地方
三、成果展示
创建初始角色,打印角色基本信息:
升级功能:
切磋武艺:
3.杀人夺宝
4. 挖取灵石
5.修仙交易
6.捕获妖兽
四、代码设计
1.妖兽类 妖兽具有三个属性:战斗力、等级、状态(是否有主人)
Monster.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Monster
{
public:
Monster(int Monster_grade,int Monster_state);
int GetMonster_grade();
int GetMonster_attack();
public :
int Monster_attack; //攻击力
int Monster_grade; //等级
int Monster_state;//状态:是否有主
};
Monster.c
#include "Monster.h"
#define Monster_attakxishu 99 //系数
Monster::Monster( int Monster_grade, int Monster_state)
{
this->Monster_attack = Monster_grade * Monster_attakxishu; //等级*系数为战斗力
this->Monster_grade = Monster_grade;
this->Monster_state = Monster_state;
}
int Monster::GetMonster_grade()
{
return Monster_grade;
}
int Monster::GetMonster_attack()
{
return Monster_attack;
}
2. 灵石类 灵石类设计了初级、中级、高级三个属性
Fairy_stone.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
class Fairy_stone
{
public:
Fairy_stone(int fairy_1, int fairy_2,int fairy_3);
~Fairy_stone();
int getLingshi() const; //获取灵石总量
public:
int fairy_1; //初级
int fairy_2;//中级
int fairy_3;//高级
};
Fairy_stone.c
#include "Fairy_stone.h"
Fairy_stone::Fairy_stone(int fairy_1, int fairy_2, int fairy_3)
{
this->fairy_1 = fairy_1;
this->fairy_2 = fairy_2;
this->fairy_3 = fairy_3;
}
Fairy_stone::~Fairy_stone()
{
}
int Fairy_stone::getLingshi()const
{
int zongshu = 0;
zongshu = fairy_1 + fairy_2*10 + fairy_3*100;
return zongshu;
}
3.玩家类 玩家类设计了姓名、门派、资产、等级、状态、战斗力以及用vector设计了灵石和灵兽属性。
Player.h
#pragma once
#include<iostream>
#include<string>
#include<vector>
#include"Fairy_stone.h"
#include"Monster.h"
using namespace std;
class Fairy_stone;
class Monster;
class Player
{
public:
Player(string name, string deparment, vector<Fairy_stone> lingshi,
vector<Monster> monster,int grade,int fighting_capacity);
~Player();
//获取相关东西的信息
string getName() const;
string getDepartment() const;
int getPropetry() const;
void getGrade() const;
int getState() const;
int getFighting_capacity() const;
//挖取灵石的活动
int getFaity_stone() const;
//贸易活动
void exchangeRouse(Player& player)const;
bool catchMonster(Player& player, Monster& monster)const;
public:
//修仙者的属性
string name; //姓名
string department;//门派
//资产 包括灵石与妖兽
int propetry;
vector<Fairy_stone> lingshi;
vector<Monster> monster;
//等级
int grade;
//状态
int state;//(1生2死)
//战斗力 战斗力通过修仙者的等级乘以计算系数决定
int fighting_capacity;
};
Player.c
#include "Player.h"
#include "Monster.h"
#define gradeXishu 100;
string grade1[9] = { "炼气","筑基","结丹","元婴","化神","炼虚","合体","大成","渡劫" };
int money[9] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
Player::Player(string name, string deparment, vector<Fairy_stone> lingshi, vector<Monster> monster, int grade,int state)
{
this->state = state;
this->name = name;
this->department = deparment;
this->lingshi = lingshi;
this->monster = monster;
this->grade = grade;
this->fighting_capacity = (grade + 1) * gradeXishu;
}
Player::~Player()
{
}
string Player::getName() const
{
return name;
}
string Player::getDepartment() const
{
return department;
}
//此处可以设计更简单的方法,但是当时写了懒得改
int Player::getPropetry() const
{
int x = 0;
x = lingshi[0].fairy_1 + 10 * lingshi[0].fairy_2 + 100 * lingshi[0].fairy_3; //零食数量
cout << "初级灵石:" << lingshi[0].fairy_1 << "\t" << "中级灵石:" << lingshi[0].fairy_2 << "\t" << "高级灵石:" << lingshi[0].fairy_3 << "\n";
int y[9] = { 0 };
cout << "妖兽数量:\t" << monster.size()<<"头\n";
for (int i = 0; i < monster.size(); i++) {
if (monster[i].Monster_grade == 1) {
y[0] += 1;
}
if (monster[i].Monster_grade == 2) {
y[1] += 1;
}
if (monster[i].Monster_grade == 3) {
y[2] += 1;
}
if (monster[i].Monster_grade == 4) {
y[3] += 1;
}
if (monster[i].Monster_grade == 5) {
y[4] += 1;
}
if (monster[i].Monster_grade == 6) {
y[5] += 1;
}
if (monster[i].Monster_grade == 7) {
y[6] += 1;
}
if (monster[i].Monster_grade == 8) {
y[7] += 1;
}
if (monster[i].Monster_grade == 9) {
y[8] += 1;
}
}
for (int i = 0; i < 9; i++) {
if (y[i] > 0) {
x += y[i] * money[i];
cout << i + 1 << "级妖兽数量为:" << y[i]<<endl;
}
}
return x;
}
void Player::getGrade() const
{
cout << "境界:\t" << grade1[grade]<<"\t";
}
int Player::getState() const
{
return state;
}
int Player::getFighting_capacity() const
{
return fighting_capacity ;
}
int Player::getFaity_stone() const
{
int x;
x = (grade + 1)*100;
//lingshi[0].fairy_1 += x;
return x;
}
void Player::exchangeRouse(Player& player)const
{
}
bool Player::catchMonster(Player& player, Monster& monster)const
{
return false;
}
4.控制类 控制类使用vector构建了玩家、灵石以及怪兽的可变数组,同时构建了玩家的主要操作。
Control.h
#pragma once
#include "Fairy_stone.h"
#include "Monster.h"
#include "Player.h"
class Control
{
public:
void createPerson();//创建角色
void printPerson();//打印信息
void getLingfshi();//获取灵石
void activity(Control & control);//活动总控制
void improve();//升级修炼
void catchDuck();//抓怪兽
void competition(Control & control);//切磋
int createRperson();//创建NPC
void kill(Control& control);//杀人夺宝
void buy();//交易
//可以设计创建怪兽使功能更加完善合理,但本人太懒,没有改
private:
vector<Player> players;
vector<Fairy_stone> fairy_stones;
vector<Monster> monsters;
};
Control.c
#include "Control.h"
#include<ctime>
#include<cstdlib>
#include<random>
#include<sstream>
#define activity_num 8
int money1[9] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
string deparment1[7] = {"散修" , "黄枫谷","鬼灵门","落云宗","掩月宗","古剑门","御灵宗"};
string grade2[9] = { "炼气","筑基","结丹","元婴","化神","炼虚","合体","大成","渡劫" };
string person_do[activity_num] = {"0.退出游戏","1.闭关进阶","2.切磋武艺","3.杀人夺宝","4.挖取灵石","5.修仙交易","6.捕获妖兽","7.显示角色信息"};
default_random_engine e;
void Control::createPerson()
{
string name;
int choice;
string department;
int state = 1;
//输入姓名
cout << "开始创建游戏角色" << endl;
cout << "请输入游戏角色昵称" << endl;
cin >> name;
cout << "请选择你要加入的门派" << endl;
cout << "1.黄枫谷" << "\n" << "2.鬼灵门\n" << "3.落云宗\n" << "4.掩月宗\n" << "5.古剑门\n" << "6.御灵宗\n" << "0.散修\n";
cin >> choice;
department = deparment1[choice];
int x[3] = { 800,0,0 };
int y[3] = { 99,1,1};
fairy_stones.push_back(Fairy_stone(x[0], x[1], x[1]));
monsters.push_back(Monster(y[1], y[2]));
/*fairy_stones[0].fairy_1 = 800;
fairy_stones[0].fairy_2 = 0;
fairy_stones[0].fairy_3 = 0;*/
int grade = 0;
int proprey = 800;
int fighting_capacity = 100;
/*monsters[0].Monster_attack = 99;
monsters[0].Monster_grade = 1;
monsters[0].Monster_state = 1;*/
players.push_back(Player(name, department, fairy_stones, monsters, grade, state));
}
void Control::printPerson()
{
cout << "角色的基本信息如下:" << endl;
cout << "姓名:\t" << players[0].getName() << "\t";
cout << "门派:\t" << players[0].getDepartment() << "\t";
//cout << players[0].getPropetry() << endl;
players[0].getGrade();
cout << players[0].getState() << "\n";
cout <<"战斗力:" << players[0].getFighting_capacity() << endl;
players[0].getPropetry();
}
void Control::getLingfshi()
{
int x = players[0].getFaity_stone();
players[0].lingshi[0].fairy_1 = x+ players[0].lingshi[0].fairy_1;
cout << "本次挖取到的初级灵石数量为:\t" << x << "颗" << endl;
cout << "角色总资产--" << "初级灵石:"<<players[0].lingshi[0].fairy_1<<"中级灵石:"<<fairy_stones[0].fairy_2<<"高级灵石:"<<fairy_stones[0].fairy_3;
}
void Control::activity(Control &control)
{
int x;
while (1) {
cout << "请选择你要进行的活动" << endl;
for (int i = 0; i < activity_num; i++) {
cout <<person_do[i]<<endl;
}
cin >> x;
switch (x) {
case 1:
control.improve();
break;
case 2:
control.competition(control);
break;
case 3:
control.kill(control);
break;
case 4:
control.getLingfshi();
break;
case 5:
control.buy();
break;
case 6:
control.catchDuck();
break;
case 7:
control.printPerson();
break;
case 0:
exit(0);
default:
cout << "选择错误" << endl;
}
_sleep(1 * 1000);
cout << endl;
system("pause");
system("cls");
}
}
void Control::improve()
{
cout << players[0].name << "开始闭关修炼" << endl;
e.seed(time(0));
uniform_int_distribution<int> u(30, 30 * 300);
int x = u(e);
cout << players[0].name << "修炼了" << x << "天" << endl;
uniform_real_distribution<double> r(0, 2);
double y = r(e);
uniform_int_distribution<int> w(10, 100);
int z = w(e);
if (y >= 1) {
cout << "恭喜您成功晋级" << endl;
players[0].grade += 1;
players[0].fighting_capacity = (players[0].grade + 1) * 100 + z;
cout << "您当前的等级为:" << grade2[players[0].grade];
}
else {
cout << "很遗憾,您未成功晋级" << endl;
cout << "您当前的等级为:" << grade2[players[0].grade];
}
}
void Control::catchDuck()
{
e.seed(time(0));
uniform_int_distribution<int> grade3(1,players[0].grade+3);
int x = grade3(e);
cout << "玩家遇到一头"<<x<<"级野生灵兽"<<endl;
int big = monsters.size();
monsters.push_back(Monster(x, 1));
uniform_int_distribution<int> w(10, 100);
int z = w(e);
int attack = monsters[big].GetMonster_attack() + z;
cout << "该妖兽的战斗力为:" << attack;
cout << "开始捕捉....." << endl;
_sleep(0.5 * 1000);
int person_yaoattack = 0;
for (int i = 0; i < players[0].monster.size(); i++) {
person_yaoattack += players[0].monster[i].Monster_attack;
}
if (attack < (players[0].fighting_capacity + person_yaoattack)) {
cout << "捕捉成功" << endl;
int w = players[0].monster.size();
players[0].monster.push_back(Monster(x,0));
}
else {
cout << "捕捉失败,请您通过切磋或修炼提高战斗力" << endl;
}
}
void Control::competition(Control & control)
{
int x = control.createRperson();
cout << "开始切磋...." << endl;
_sleep(0.5 * 1000);
if (players[0].fighting_capacity + players[0].monster[0].Monster_attack + 50 > players[x].fighting_capacity) {
cout << "胜利" << endl;
players[0].fighting_capacity += 3;
}
else {
cout << "失败,请加强修炼" << endl;
players[0].fighting_capacity += 1;
}
}
int Control::createRperson()
{
e.seed(time(0));
uniform_int_distribution<int> grade3(0, players[0].grade+1);
uniform_int_distribution<int> menpai(0, 6);
int num = players.size();
stringstream ret;
ret << "NPC" << num << "号";
string name;
int grade;
int menpai1;
string deparemnt;
name = ret.str();
grade = grade3(e);
menpai1 = menpai(e);
deparemnt = deparment1[menpai1];
int state = 1;
int x[3] = { 800,0,0 };
int y[3] = { 99,1,1 };
fairy_stones.push_back(Fairy_stone(x[0], x[1], x[1]));
monsters.push_back(Monster(y[1], y[2]));
/*fairy_stones[0].fairy_1 = 800;
fairy_stones[0].fairy_2 = 0;
fairy_stones[0].fairy_3 = 0;*/
int proprey = 800;
int fighting_capacity = 100;
/*monsters[0].Monster_attack = 99;
monsters[0].Monster_grade = 1;
monsters[0].Monster_state = 1;*/
players.push_back(Player(name, deparemnt, fairy_stones, monsters, grade, state));
return num;
}
void Control::kill(Control& control)
{
int x = control.createRperson();
cout << "开始决战...." << endl;
_sleep(0.5 * 1000);
int person_yaoattack = 0;
for (int i = 0; i < players[0].monster.size(); i++) {
person_yaoattack += players[0].monster[i].Monster_attack;
}
if (players[0].fighting_capacity + person_yaoattack > players[x].fighting_capacity) {
cout << "成功击杀" << endl;
players[0].fighting_capacity += 10;
players[0].lingshi[0].fairy_1 = players[x].lingshi[0].fairy_1 + players[0].lingshi[0].fairy_1;
}
else {
cout << "您已经阵亡,游戏结束" << endl;
exit(0);
}
}
void Control::buy()
{
cout << "您的资产为:" << endl;
int y;
y = players[0].getPropetry();
cout << "总初级灵石量:" << y << "颗" << endl;
cout << "请选择您要进行的交易:" << endl;
cout << "1.购买灵兽" << endl;
cout << "2.售卖灵兽" << endl;
int x;
cin >> x;
int jinge = 0;
switch (x) {
case 1:
cout << "请输入您要购买的灵兽等级:";
int dengji;
cin >> dengji;
cout << "交易中...." << endl;
if (players[0].lingshi[0].fairy_1 >= money1[dengji]) {
cout << "交易成功" << endl;
players[0].lingshi[0].fairy_1 = players[0].lingshi[0].fairy_1 - money1[dengji];
players[0].monster.push_back(Monster(dengji, 0));
}
else {
cout << "交易失败,请赚取足够多的灵石再来" << endl;
}
break;
case 2:
cout << "您的全部灵兽已经卖完" << endl;
players[0].monster.clear();
jinge = (y - players[0].lingshi[0].fairy_1) * 0.8;
players[0].lingshi[0].fairy_1 += jinge;
break;
default:
cout << "输入错误" << endl;
break;
}
}
5.主函数
main.c
#include"Control.h" int main() { Control control; control.createPerson(); control.printPerson(); control.activity(control); return 0; }
五、项目总结
本项目是c++基础练习项目,主要运用了面向对象的思想以及vector容器,随机生成等语法,实现了玩家一系列的操作在项目过程中我更加理解了面向对象以及对public、private理解得更加深刻.