• 团队作业——个人总结


    团队作业——个人总结


    基本介绍

    关于代码设计的内容在上一次作业博客已经讲的差不多了,这次主要写点对于这次作业的总结和想法吧。最后做出来的东西没那么完美,可以说,各个部件我们都造出来了,可惜最后没有合理的拼起来。


    历程

    一开始我们想法也比较简单,规划一个主题的框架,然后分工逐步实现每个部分。
    但是在实际的操作过程中,哪怕有完整的流程图,类图的,在编码的过程中还是会出现大大小小的问题,私有,公有,还有常量的设计都会在实现过程中暴露出不合理,代码与代码之间的连接整合也是这次遇到的最致命的问题之一。而且由于分工合作的关系,如果某一位成员的代码无法按时的完成,都会对后续的计划造成很大的影响,从一开始的信心满满,到后面的截止前的焦头烂额。也深感自己能力的不足。


    个人以及团队所遇的问题与反思

    先谈谈自己的

    1. 这次作业我们采用的是cocos2d,语言是c++,用的ide是vs2017,由于此前从未使用过cocos2d,再未考虑有限的时间的情况下,花在学习新工具上的时间太多。而且不熟练带来的问题也埋下了很大的隐患。感觉在以后的实践中还是要考虑到自己的学习能力以及时间的规划上。
    2. 在编码过程使用了不少此前没有使用过的东西,例如shared_ptrstatic_ptr智能指针之类,通过网络上不少的博客和分享,来使用这些内容,在享受到起优秀的效果以及便利的同时也因为自己经验的不足踩了不少的坑。智能指针不能使用dynamic_cast而应该使用dynamic_pointer_cast,而且不少的坑是在学习搜索过程中未见人提及。当遇到问题再去搜索时,才会发现问题的本质。以后在尝试新事物时,不能总是盯着新事物的优点,还应该关注其会带来的问题和如何避免这类的问题。尝试自己不熟练的新事物的时候,还是应该谨慎。犹如f7u弯刀一般,过多不熟练的尝试只会带来更多的隐患。
    3. 规范代码的书写,在设计初期,我们已经定下来代码规范以及注释的规范,一开始其实觉得这样有些麻烦,但实际操作过程中,合理的注释规范在一个强大ide的帮助下可以更好的理解代码和继续下一步的操作,各个工具类的方法也不会因为数量过多而忘记其作用,在编写注释上消耗的时间,在后续的相互整合上会得到弥补。
    4. 短代码不一定值得,也许在平时做acm的时候总是追求精简代码,但是在这种合作项目上,你写的短,也许实现的功能一样,但很多时候会在阅读上相互产生困惑,很多时候快速直接的理解每个方法的实现过程是必要的,自己在调试的时候有时候也会出现毛病。清晰明了的代码比精简生涩的代码更让人喜欢。短!=好。
    5. 类的单个方法功能不能多,以前觉得一个方法函数能解决多个问题是很好的,但是在几经尝试后,还是一个方法一个功能,哪怕多写几个方法,一个冗杂的方法在出现bug的时候总是会加大修改难度。
    6. github的使用,github很好用很方便,但是第一次的合作还是让我琢磨了很久。先合并到本地再提交新的。

    再说说团队

    1. 合理的设计是一个项目的关键,合理的分工也是效率的保证,我们的框架设计在实现中修修补补,也是勉勉强强。分工没有那么明确,经过最后基本都完成的工作量,但是在时间规划上,我们还是输了。
    2. 思维分散,各自的思维在几次讨论中并没有统一,在写代码的过程还是会出现思维冲突。
    3. 尽管各成员的能力都不弱,但团队并没有发挥出1+1>2的能力,哪怕1+1=2都未必实现。成员间的默契和配合都很欠缺。
    4. 理想要有,现实也要有,想的太多,做的时候才发现难以做到。

    小总结

    总之,这是我的第一次尝试,也许不够成功,但是永远不亏,至少学到了不少新东西,也体会到了不少困苦边缘的起死回生。自己能力也有所不足,以后应该能更加游刃有余吧。


    一点小内容

    #include "Skill.h"
    #include "Hero.h"
    #include "RWorld.h"
    #include "Utils.h"
    #include "Buff.h"
    #include <cmath>
    
    /**
     * rief 取得技能宿主单位
     * 
    eturn 此技能的宿主单位
     */
    Unit* Skill::getHost() const
    {
    	return host;
    }
    /**
     * rief 获取技能宿主单位,构建技能对象
     * param ht 技能宿主单位
     */
    Skill::Skill(Unit* ht)
    {
    	host = ht;
    }
    /**
     * rief 取得当前技能剩余cd
     * 
    eturn 技能剩余cd
     */
    int Skill::getCd() const
    {
    	int tim(0);
    	RWorld* rWorld = RWorld::getInstance();
    	tim = CD - (rWorld->getTime() - lastCast);
    	if (tim > 0) return tim;
    	else return 0;
    }
    /**
     * rief 取得上次释放技能时间
     * 
    eturn 技能上次释放时间
     */
    int Skill::getLastCast() const
    {
    	return lastCast;
    }
    /**
     *
     */
    Skill::~Skill()
    {
    }
    /**
     * rief 构造试探技能对象
     * param ht 技能宿主单位
     */
    Probe::Probe(Unit* ht) :Skill(ht)
    {
    	CD = 10;
    }
    /**
     * rief 技能作用:对3格范围内小兵造成300伤害
     */
    int Probe::cast()
    {
    	cocos2d::Point posSelf = Utils::CoordinateTransform::cocosToTileMap(host->getPosition());
    	cocos2d::Point posOther; int side_judge;
    	RWorld* rWorld = RWorld::getInstance();
    	list<shared_ptr<Unit>> Unit_pause = rWorld->getUnitRegistry();
    	if (host->getSide() == 1) side_judge = 2;
    	else side_judge = 1;
    	for ( auto i = Unit_pause.begin(); i != Unit_pause.end(); i++)
    	{
    		shared_ptr<Unit> it = *i;
    		posOther = Utils::CoordinateTransform::cocosToTileMap(it->getPosition());
    		shared_ptr<Character> judge_C = dynamic_pointer_cast<Character>(it);
    		shared_ptr<Hero> judge_H = dynamic_pointer_cast<Hero>(it);
    		if (judge_C != nullptr&&judge_H == nullptr) {
    			if(it->getSide()==side_judge)
    			if (abs(posOther.x - posSelf.x) <= 2 && abs(posOther.y - posSelf.y) <= 2) {
    				it->setEffectiveHp(it->getEffectiveHp() - 300);
    			}
    		}
    	}
    	return 0;
    }
    /**
     * rief "试探"是否可以释放
     * 
    eturn "试探"是否可以释放
     */
    bool Probe::isCastable()
    {
    	if (this->getCd() == 0) return true;
    	else return false;
    }
    /**
     * rief 构造惩戒技能对象
     * param ht 技能宿主单位
     */
    Punishment::Punishment(Unit* ht) :Skill(ht)
    {
    	CD = 30;
    }
    /**
     * rief 技能作用:对3格范围内小兵造成650伤害
     */
    int Punishment::cast()
    {
    	cocos2d::Point posSelf = Utils::CoordinateTransform::cocosToTileMap(host->getPosition());
    	cocos2d::Point posOther; int side_judge;
    	RWorld* rWorld = RWorld::getInstance();
    	if (host->getSide() == 1) side_judge = 2;
    	else side_judge = 1;
    	list<shared_ptr<Unit>> Unit_pause = rWorld->getUnitRegistry();
    	for (auto i = Unit_pause.begin(); i != Unit_pause.end(); i++)
    	{
    		shared_ptr<Unit> it = *i;
    		shared_ptr<Character> judge_C = dynamic_pointer_cast<Character>(it);
    		shared_ptr<Hero> judge_H = dynamic_pointer_cast<Hero>(it);
    		if (judge_C != nullptr&&judge_H == nullptr) {
    			if (it->getSide() == side_judge)
    			if (abs(posOther.x - posSelf.x) <= 2 && abs(posOther.y - posSelf.y) <= 2) {
    				it->setEffectiveHp(it->getEffectiveHp() - 650);
    			}
    		}
    	}
    	return 0;
    }
    /**
     * rief "惩戒"是否可以释放
     * 
    eturn "惩戒"是否可以释放
     */
    bool Punishment::isCastable()
    {
    	if (this->getCd() == 0) return true;
    	else return false;
    }
    /**
     * rief 构造斩杀技能对象
     * param ht 技能宿主单位
     */
    Execute::Execute(Unit* ht) :Skill(ht)
    {
    	CD = 90;
    }
    /**
     * rief 技能作用:对5格范围内小兵与英雄造成已损失生命值12%伤害
     */
    int Execute::cast()
    {
    	cocos2d::Point posSelf = Utils::CoordinateTransform::cocosToTileMap(host->getPosition());
    	cocos2d::Point posOther; int side_judge;
    	RWorld* rWorld = RWorld::getInstance();
    	if (host->getSide() == 1) side_judge = 2;
    	else side_judge = 1;
    	list<shared_ptr<Unit>> Unit_pause = rWorld->getUnitRegistry();
    	for (auto i = Unit_pause.begin(); i != Unit_pause.end(); i++)
    	{
    		shared_ptr<Unit> it = *i;
    		shared_ptr<Character> judge_C = dynamic_pointer_cast<Character>(it);
    		posOther = Utils::CoordinateTransform::cocosToTileMap(it->getPosition());
    		if (judge_C != nullptr) {
    			if (it->getSide() == side_judge)
    			if (abs(posOther.x - posSelf.x) <= 4 && abs(posOther.y - posSelf.y) <= 4) {
    				it->setEffectiveHp(it->getEffectiveHp() - ((it->getBaseHp() - it->getEffectiveHp())*0.12));
    			}
    		}
    	}
    	return 0;
    }
    /**
     * rief "斩杀"是否可以释放
     * 
    eturn "斩杀"是否可以释放
     */
    bool Execute::isCastable()
    {
    	if (this->getCd() == 0) return true;
    	else return false;
    }
    /**
     * ried 构造狂暴技能对象
     * param ht 技能宿主单位
     */
    Rage::Rage(Unit* ht) :Skill(ht)
    {
    	CD = 60;
    }
    /**
     * rief 技能作用:增加攻击力30%,增加攻击速度60%,持续5s
     */
    int Rage::cast()
    {
    	Buffs::Rage rage;
    	host->addBuff(rage);
    	return 0;
    }
    /**
     * rief "狂暴"是否可以释放
     * 
    eturn "狂暴"是否可以释放
     */
    bool Rage::isCastable()
    {
    	if (this->getCd() == 0) return true;
    	else return false;
    }
    /**
     * ried 构造幽灵疾步技能对象
     * param ht 技能宿主单位
     */
    Haste::Haste(Unit* ht) :Skill(ht)
    {
    	CD = 75;
    }
    /**
     * rief 技能作用:增加移动速度30%,持续10s
     */
    int Haste::cast()
    {
    	Buffs::Haste haste;
    	host->addBuff(haste);
    	return 0;
    }
    /**
     * rief "幽灵疾步"是否可以释放
     * 
    eturn "幽灵疾步"是否可以释放
     */
    bool Haste::isCastable()
    {
    	if (this->getCd() == 0) return true;
    	else return false;
    }
    /**
     * ried 构造治疗术技能对象
     * param ht 技能宿主单位
     */
    Cure::Cure(Unit* ht) :Skill(ht)
    {
    	CD = 120;
    }
    /**
     * rief 技能作用:恢复自己与5格范围内的所有我方人员已损失生命值40%
     */
    int Cure::cast()
    {
    	cocos2d::Point posSelf = Utils::CoordinateTransform::cocosToTileMap(host->getPosition());
    	cocos2d::Point posOther;
    	RWorld* rWorld = RWorld::getInstance();
    	list<shared_ptr<Unit>> Unit_pause = rWorld->getUnitRegistry();
    	for (auto i = Unit_pause.begin(); i != Unit_pause.end(); i++)
    	{
    		shared_ptr<Unit> it = *i;
    		shared_ptr<Character> judge_C = dynamic_pointer_cast<Character>(it);
    		posOther = Utils::CoordinateTransform::cocosToTileMap(it->getPosition());
    		if (judge_C != nullptr) {
    			if (it->getSide() == host->getSide())
    			if (abs(posOther.x - posSelf.x) <= 4 && abs(posOther.y - posSelf.y) <= 4) {
    				it->setEffectiveHp(it->getEffectiveHp() + ((it->getBaseHp() - it->getEffectiveHp())*0.4));
    			}
    		}
    	}
    	return 0;
    }
    /**
     * rief "治疗术"是否可以释放
     * 
    eturn "治疗术"是否可以释放
     */
    bool Cure::isCastable()
    {
    	if (this->getCd() == 0) return true;
    	else return false;
    }
    

  • 相关阅读:
    可序列化serializable的作用是什么
    HelloWorld编译正常运行报noclassdeffounderror
    dtd对xml没有起到约束作用
    Ajax发送XML请求案例
    Ajax发送GET和POST请求案例
    Ajax发送简单请求案例
    初识Ajax
    数据库设计
    数据库和实例的区别
    Flask
  • 原文地址:https://www.cnblogs.com/pullself/p/9244965.html
Copyright © 2020-2023  润新知