第八周项目四(3)-游戏中角色类的增强版
来源:互联网 发布:小米wifi无法连接网络 编辑:程序博客网 时间:2024/05/04 13:43
问题及代码:
main.cpp
/**烟台大学计算机学院*文件名称:xiangmu1(2).cpp*作 者:闫安*完成日期:2016年5月5日*版 本 号:codeblocks 16.01**问题描述:(1)产生随机数时,没有避免重复,以致于会有自己攻击自己的情况——好在加了血又减去了,没有变化, 还有同样的武器会有多件——都是棍,但带两条棍,也行;(2)只是让自动产生的角色玩起来了,自己没 有参与,其实,指定对象数组中第0个对象就是自己(随机选取动作者时,随机数最小为1),加个菜单, 选择动作,即可。*输入描述:无*程序输出:任务的各种状态*/#include <iostream>#include <fstream>#include <cstdlib>#include <ctime>#include "game.h"using namespace std;void initializeRoles(Role roles[]); //初始化角色,由计算机随机产生int readWeaponInfo(Weapon WeaponBase[]); //从文件中读取武器信息int randBetween(int low, int high); //产生一定范围内的随机数void play(Role roles[], int n);//主函数int main( ){ srand(time(0)); Role roles[M]; initializeRoles(roles); play(roles, 1000); return 0;}//初始化角色void initializeRoles(Role roles[]){ Weapon weaponBase[SIZE]; //存储系统中可以用到的武器库数组 int weaponNum = readWeaponInfo(weaponBase); //从文件中读取武器信息到武器库数组,并返回武器种类数 char cno[5]; //人物序号 int wn; //要加的武器数 int wno; //要加入的武器的编号(weaponBase中的下标) for(int i=0; i<M; i++) //产生M个角色对象,即游戏中的人物 { itoa(i,cno,10); roles[i].setBaseInfo(string("Soldier")+cno,randBetween(10, 100)); roles[i].setLocation(randBetween(0,1000),randBetween(0, 1000)); wn=randBetween(1,N); for(int j=0; j<wn; j++) //添加wn件武器 { wno=randBetween(0,weaponNum); roles[i].addWeapon(weaponBase[wno]); } roles[i].changeWeapon(randBetween(0,wn));//当前持什么武器 }}//初始化武器库int readWeaponInfo(Weapon WeaponBase[]){ ifstream infile("weapon.txt",ios::in); int n=0; string wn; int wf; double wr; //分别代表武器名、杀伤力、杀伤范围 if(!infile) { cerr<<"open error!"<<endl; exit(1); } while(infile>>wn>>wf>>wr) { WeaponBase[n++].setWeapon(wn,wf,wr); } infile.close(); return n;}//产生一定大于等于low,小于high范围内的随机数int randBetween(int low, int high){ return low+rand()%(high-low);}//玩n轮游戏,每一轮有一个角色行动//行动可以是攻击、移动、换武器、吃//所有的结果,保存到log.txt文件中void play(Role roles[], int n){ int i; int rno,rno2; //选中的游戏者 int action; //行动0-攻击,1-移动,2-换武器,3-吃东西 int newx, newy, newWeapon, eatd; ofstream outfile("log.txt",ios::out); //创建输出流对象 if(!outfile) //如果打开失败,outfile返回0值 { cerr<<"open error!"<<endl; exit(1); } cout<<"开始前...."<<endl; for(i=0; i<M; i++) roles[i].show(); cout<<"开始游戏,请到日志文件中看过程...."<<endl<<endl; for(i=0; i<n; i++) { rno=randBetween(0,M); outfile<<"第"<<i<<"轮: "<<roles[rno].getName(); action=randBetween(0,4); switch(action) { case 0: //攻击 rno2=randBetween(0,M); outfile<<"攻击"<<roles[rno2].getName(); roles[rno].attack(roles[rno2]); break; case 1: //移动 newx=randBetween(0,1000); newy=randBetween(0, 1000); outfile<<"移动到("<<newx<<","<<newy<<")"; roles[rno].moveTo(newx,newy); break; case 2: //换武器 newWeapon=randBetween(0,roles[rno].getWeaponNum()); roles[rno].changeWeapon(newWeapon); outfile<<"将武器换为: "<<roles[rno].getCurWeapon(); break; case 3: //吃 eatd=randBetween(0,100); roles[rno].eat(eatd); outfile<<"吃了: "<<eatd; break; } outfile<<". "<<endl; } outfile<<endl; outfile.close(); cout<<"游戏结束后...."<<endl; for(i=0; i<M; i++) roles[i].show();}
game.h
#ifndef GAME_H_INCLUDED#define GAME_H_INCLUDED#include <string>using namespace std;const int N=5; //每个角色最多拥有的武器const int M=30; //游戏人物的最大数const int NOWEAPON=-1; //表示手中无武器const int SIZE=100; //将从文件是读取武器信息,最多100种武器class Point //Point类声明{public: //外部接口 Point(int x=0, int y=0); int getX(); int getY(); double distance(const Point &p); //返回与另外一点p之间的距离 void moveTo(int x, int y); //移到另外一点 void move(int dx, int dy); //从当前位置移动private: int x, y; //座标};class Weapon{public: Weapon(){}; Weapon(string wnam, int f, double k); Weapon(const Weapon&); string getWname(); int getForce(); //返回杀伤力 double getKillRange(); //返回杀伤距离 void setWeapon(string,int,double);private: string wname; //名称 int force; //杀伤力 double killRange; //杀伤距离};class Role{public: Role():weaponNum(0),holdWeapon(NOWEAPON){}; Role(string nam, int b, Point l, Weapon w[], int n); //构造函数 ~Role(); //析构函数 void eat(int d); //吃东西,涨d血(死了后吃上东西可以复活) void attack(Role &r); //攻击别人,自己涨血,同时对方被攻击失血。血量取决于当前用的武器 void beAttack(int f); //被别人攻击,参数f是承受的攻击力 double distance(Role &r); //返回与另一角色的距离 bool isAlived(); //是否活着 void moveTo(int x, int y); //移到另外一点 void move(int dx, int dy); //从当前位置移动 void changeWeapon(int wno); //换手中的武器 void show(); //显示 void setBaseInfo(string, int);//角色名称和初始血量 void setLocation(int,int);//设置位置 void addWeapon(Weapon);//添一件武器 string getName(); int getWeaponNum(); string getCurWeapon();private: string name; //角色名称 int blood; //当前血量 bool life; //是否活着 Point location; //位置 Weapon weapons[N]; //武器 int weaponNum; //武器数目 int holdWeapon; //现在手持哪一件武器(空手为NOWEAPON,初始时空手)};#endif // GAME_H_INCLUDED
point.cpp
#include "game.h"#include <cmath>Point::Point(int x, int y): x(x), y(y) { }int Point::getX(){ return x;}int Point::getY(){ return y;}//移到另外一点void Point::moveTo(int x, int y){ this->x=x; this->y=y;}//从当前位置移动void Point::move(int dx, int dy){ this->x+=dx; this->y+=dy;}double Point::distance(const Point& p){ double dx = this->x - p.x; double dy = this->y - p.y; return (sqrt(dx * dx + dy * dy));}
weapon.cpp
#include "game.h"Weapon::Weapon(string wnam, int f, double k):wname(wnam),force(f),killRange(k) {}Weapon::Weapon(const Weapon &w):wname(w.wname),force(w.force),killRange(w.killRange) {}string Weapon::getWname(){ return wname;}//返回杀伤力int Weapon::getForce(){ return force;}//返回杀伤距离double Weapon::getKillRange(){ return killRange;}void Weapon::setWeapon(string name,int f,double r){ wname=name; force=f; killRange=r;}
role.cpp
#include <iostream>#include "game.h"using namespace std;Role::Role(string nam, int b, Point l, Weapon w[], int n) :name(nam),blood(b),location(l),weaponNum(n),holdWeapon(NOWEAPON){ if(blood>0) life=true; else life=false; for(int i=0; i<n; i++) weapons[i]=w[i];}Role::~Role(){ cout<<name<<"退出江湖..."<<endl;}//吃东西,涨d血(死了后吃上东西可以复活)void Role::eat(int d) //吃东西,涨d血(死了也能吃,别人喂的,以使能复活){ blood+=d; if(blood>0) life=true;}//攻击别人,自己涨血,同时对方被攻击失血,血量取决于当前用的武器//在武器的攻击范围内才可以攻击void Role::attack(Role &r){ if(isAlived()&&holdWeapon>NOWEAPON&&weapons[holdWeapon].getKillRange()>this->distance(r)) //活着且在杀伤范围内 { blood+=weapons[holdWeapon].getForce(); r.beAttack(weapons[holdWeapon].getForce()); }}//被别人攻击,参数f是承受的攻击力void Role::beAttack(int f){ blood-=f; if(blood<=0) life=false;}//返回与另一角色的距离double Role::distance(Role &r){ return location.distance(r.location);}//换手中的武器void Role::changeWeapon(int wno){ if(wno<weaponNum) holdWeapon=wno;}//是否活着bool Role::isAlived(){ return life;}//移到另外一点void Role::moveTo(int x, int y){ if(isAlived()) //死了就不能动了 location.moveTo(x,y);}//从当前位置移动void Role::move(int dx, int dy){ if(isAlived()) location.move(dx,dy);}//显示void Role::show(){ cout<<name<<" has "<<blood<<" blood, hold "; if(holdWeapon==NOWEAPON) cout<<"no weapon"; else cout<<weapons[holdWeapon].getWname(); cout<<"("; for(int i=0; i<weaponNum; i++) cout<<weapons[i].getWname()<<","; cout<<"\b)"; cout<<". He is in ("<<location.getX()<<", "<<location.getY()<<") and "; if(isAlived()) cout<<"alived."; else cout<<"dead."; cout<<endl;}//角色名称和初始血量void Role::setBaseInfo(string nam, int b){ name=nam; blood=b; if(blood>0) life=true;}//设置位置void Role::setLocation(int x,int y){ location.moveTo(x,y);}//添一件武器void Role::addWeapon(Weapon w){ if(weaponNum<N) { weapons[weaponNum]=w; weaponNum++; }}//返回名称string Role::getName(){ return name;} int Role::getWeaponNum() { return weaponNum; }string Role::getCurWeapon(){ return weapons[holdWeapon].getWname();}
0 0
- 第八周项目四(3)-游戏中角色类的增强版
- 第八周项目四(1)-游戏中角色类的增强版
- 第八周项目四(2)-游戏中角色类的增强版
- 第八周项目四 游戏中的角色类增强版
- 第八周上机实践项目4(1):游戏中角色类增强版
- 第八周项目4游戏中的角色类增强版
- 第八周上机实践项目——项目4-游戏中的角色类增强版-问题(3)
- 第八周上机实践项目4(2):游戏中的角色类增强版
- 第八周项目(2)-游戏中的角色类增强版
- 第八周上机实践项目——项目4-游戏中的角色类增强版-问题(2)
- 第八周项目四—游戏中的角色类
- 第八周项目四—游戏中的角色类
- 第8周项目4——游戏中的角色类增强版
- 第8周项目4:游戏中的角色类增强版(2)
- 第8周【项目4-游戏中的角色类增强版】
- 游戏中的角色类增强版
- C++第8周项目 数组和指针 【项目4-游戏中的角色类增强版】 (复习新版)
- 第六周项目二 游戏中角色类的设计(类的组合)
- ImageView.ScaleType设置图解
- 在C++中使用类模板帮助用户创建类实例
- LeetCode-136&137&260.Single Number
- hdu_4529_郑厂长系列故事——N骑士问题(状压DP)
- c++实验6
- 第八周项目四(3)-游戏中角色类的增强版
- Spark Streaming源码解读之Driver容错安全性
- 新的个人博客~
- OpenGL渲染管线,着色器,光栅化等概念理解
- C++实验6-矩阵求和
- Struts Action匹配出错解决方案
- HackRF One 解调数字对讲机
- Centos7下关于memcached的安装和简单使用
- Linux嵌入式之————Linux下安装SQLite3数据库