团队作业3--王者光耀(体会)

任务

  • 英雄移动

    • 转换左右方向,不改变英雄位置,该操作无需时间冷却
    • 移动操作,改变方向和位置,该操作限次为1s内可移动speed次,速度为1,1s最多可移动一次,速度为2,1s做多可移动2次
    • 设置了上下左右四个移动操作,左右两个换向操作
  • 战斗画面

    • 用面向过程写的,一个函数从(0,0)开始扫描,扫到地图末尾
    • 中间若(x,y)等于某个物体的坐标,判断类别并输出相应标识符,一个一个判断,代码量稍大
    • 后来想把输出显示写到类方法里面作为display,但是效果欠佳,原因是在绘制背景时画的是空白,到display的时候再去覆盖,这样一帧有一帧无,闪烁严重;若是不绘制空白,英雄走动之后会留下残影不能清除

代码展示

操作

利用getch()来获得键盘某键敲击状态,需要

//void kar::operate(char c)//操作
if(blood<=0)return ;                //死亡不可移动 
switch (c)
{
    case 'q':dir=-1;break;    //向左转
    case 'e':dir=1;break;      //向右转
        
    case 'Q':dir=-1;break;    //向左转,大写键输入
    case 'E':dir=1;break;    //向左转,大写键输入
        
    case '4':dir=-1;break;    //向左转
    case '6':dir=1;break;    //向左转

    default:move(c);break;    //转到移动
}

//void kar::move(char c)    //移动
move2=clock();                                                //获取当前时间
if(move2-move1<(1000/speed))return ;        //移动冷却时间 ,冷却是时间没到,不予处理
switch(c)
{
    case 'a':dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break;        //左
    case 'd':dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break;    //右
    case 'w':dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break;    //上
    case 's':dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break;    //下
            
    case 0x4B:dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break;    //左
    case 0x4D:dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break;    //右
    case 0x48:dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break;    //上
    case 0x50:dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break;    //下
            
    case '1':dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break;    //左
    case '3':dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break;    //右
    case '5':dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break;    //上
    case '2':dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break;    //下
            
    case 'A':dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break;    //左
    case 'D':dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break;    //右
    case 'W':dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break;    //上
    case 'S':dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break;    //下
            
    default:return ;            //若是其他操作,不刷新冷却时间
}
move1=move2;            //刷新冷却


界面绘制

用的是字符标识符,字符可以在word文档-插入-字符里找,有很多;代码太长了,只展示部分


for(w=2;w<10;w++)           //塔攻击警示 
{
    if(x[w]==NULL)continue;        //指针为空,下一个
    if(x[w]->prepos==pos(i,r)){        //(i,r)与塔攻击位置相等,输出警示
        write("⊕");break;                //void write(const char *p);是将p字符串写入到待输出列表,好像看到windows.h的函数有write,不过这个是自己写的
    }
}
if(w!=10)continue;                        //该点若已经画了攻击标识符就判断下一个坐标
for(p=10;p<29;p++){
    w=0;
    if(x[p]==NULL)continue;            //空,下一个
    if(x[p]->nowpos==pos(i,r)){            //小兵的位置
        if(x[p]->dir==1)                        //小兵的方向
        write("↗");                            //右
        else write("↖");                    //左
        w=1;
        break;
    }
}


耗时

在整个过程中,总耗时超过32 hours
其中:
总框架构思:2 hours
英雄与子弹类:8 hours
主函数构架:5 hours
画面设计及优化:10 hours
组合队员代码:3 hours
总优化以及后期观察:4 hours

心路历程

令我印象最深刻的就是:

学了继承不久,想用基类指针来存派生类,传参图个方便,结果基类指针调用子类函数时,老是报错,最后发现了virtual的好用之处。。。

子类加了什么函数就在基类里面加相应的virtual函数就ok了

你可能感兴趣的:(团队作业3--王者光耀(体会))