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


    任务

    • 英雄移动

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

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

    代码展示

    操作

    利用getch()来获得键盘某键敲击状态,需要<windows.h>
    
    //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了
  • 相关阅读:
    001 分布式系统
    024 RabbitTemplate组件
    023 RabbitAdmin组件
    022 spring与Rabbitmq整合
    011 mandatory参数
    这样自己组装数据,醉了,
    cool,
    swift,
    page enable,
    构建 HTTPserver,
  • 原文地址:https://www.cnblogs.com/M031702113/p/9240738.html
Copyright © 2020-2023  润新知