郭炜老师魔兽三备战思路及代码

这个题目,我花了差不多4天才全部做出来的,一开始也没很好的设计,就是看见有什么功能,就写一个函数的声明,然后写另一个类的时候,发现我要用到前面写的类的函数时,才去定义相应的函数,所以可能会很混乱。我写这篇文章一是为了重新理一下思路,也希望能给后面设计的人一个想法吧。

首先我大体上设置了5个类吧,不包括相应的子类,分别是factorial(工厂类)、headquarter(司令部类,其实叫做城市类更好)、time(时间类,用来管理时间和大部分的输出的)、warrior(武士类,这道题中最重要的类)、weapon(武器类)。先从最重要的开始吧。

  • warrior

    武士有生命值(life)、编号(serial 注意这个编号是从1开始算的,每制造一个武士编号就相应的加一,而且并不会因为删除前面的武士而改变)、攻击力(damage,由司令部决定,但具体的规则不同,可以由不同的子类传进去)、位置(location,用来记录武士现在所在的位置,用于打架与移动)、武器的数量数组(WeaponNum,静态数组用来储存不同武器的数量),名字(用来存储子类不同的名字)colorname(隶属司令部的颜色)、武器(这里使用一个vector数组,放武士拥有的武器)。武士有两个重要的方法一个是抢武器,一个是用武器。

  • weapon

    武器有攻击力,武器的编号,剩余的使用次数,还有使用string存储它的名字。武器最终要的是ninja武士使用bomb不会自残,我的做法是使用一个使用武器的方法,并把武士作为形参传进来。

  • factorial

    这个类听从了hhy老师的建议,使用了了静态函数负责制造武士和制造武器,但是我现在的工厂类没有任何数据成员,所以我还是不知道为什么不使用普通的函数,或许可以给工厂多一些功能,比如一个静态成员去记录现在的武士武器编号??

  • time

    用于对于处理各种事件并输出,主要要总的输出时间和现在的时间,可以包括小时与分钟,也可以只包括小时。这个类的方法大致于题目不同时刻的事件相同,有制造武士,武士逃跑,武士前进,同一个城市的武士抢武器,打架,司令部报告,武士报告。对于武士我的处理方法是先按司令部全部遍历都前进一步,在根据城市的顺序从左到右输出,或许可以全部由城市来负责。

  • headquarters

    司令部是继承普通的city类来着,司令部有总的生命值,制造武士的顺序,各个武士的攻击力和所需要的生命(或许这两个就可以放置在factorial类中作为静态成员),还需要一个vector用来记录司令部的士兵。

类的介绍就差不多是这样了,删除武士删除武器的操作,或许都可以由factorial来实现,把功能给对应的类吧,不过这样好像要写成模板函数了。


最后再说一下可能会遇到的一些坑吧。

武士打架时,在奇数城市红方先攻击,偶数城市蓝方先攻击

武器的攻击力会随使用者的改变而发生改变,所以在抢夺武器时记得要给一个接口去改变武器的攻击力

Wolf的抢夺武器与打赢后抢夺武器是不一样的,wolf只抢劫一种(编号最小的武器),而打赢之后进行的抢劫,所有的武器都能抢。

关于删除武器,武士的erase,erase最好写一个函数,参数传递要删除的对应指针(容器里面放的是指针嘛),erase的参数都是迭代器,推荐使用for循环找到要删除指针对应的迭代器。

注意iceman前进一步损失10%的生命值,表示的方式是 l i f e − l i f e ∗ 0.1 life -life *0.1 lifelife0.1,而不是 l i f e ∗ 90 life*90% life90!!!

移动的输出顺序是按目的地从西向东的,我的做法是先全部移动,再按city输出相应的信息

如果武士用一个数组去存储武器的数量,另外还有如果wolf抢劫了敌人的武器记得把敌人数组的数量减掉,武士的数组加相应的值。

还有一个非常坑的点,在打架时,假如两个都剩余一件sword的攻击力为0,或者有一个没有武器,都会进行入死循环。但是其他两种武器是有使用次数的就每关系。

耳聋咆哮是活下来就要的,不是赢了才。


//最后附上代码,可能有很多功能没有分离好,导致接口写的太多了
#include<iostream>
#include<climits>
#include<iomanip>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
class factorial;
class Time;
class headquarter;
class city;
class warrior;
class weapon;
class factorial
{
private:
public:
	//l表示武士的生命,L表示武士的位置,s表示武士的标号,choice确定选择哪一个武士
	//需要的变量哪一个武士,武士的各种信息
	static warrior* creator_warrior(int choice, int s, int life, int L, int total, int, int*, int);
	//
	static void creator_weapon(int attack, int seria, int num, std::vector<weapon*>&d, int *);
};
class warrior;
class city
{
protected:
	int location;
	std::vector<warrior*> qwarriors;	//用来占领存放武士的容器
public:
	city(int l = 0) :location(l)
	{

	}
	void add_qwarriors(warrior *);
	std::vector<warrior*> &show_qwarriors()
	{
		return qwarriors;
	}
	void city_delete(warrior *);
};
class headquarter :public city
{
private:
	int TotalLife;					//司令部总的生命元
	char name[7];					//司令部的名字
	int makeseq[5];					//制造武士的顺序
	int LifeNeed[5];				//把制造武士所需的生命元也放在类里
	int WarriorAttack[5];
	std::vector<warrior*> warriors;	//用来存放武士的容器
	bool WheatherCreate = true;			//是否可以制造武士
	bool IsContinue = true;
	int WarriorSeria &#
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值