howzyao 发表于 2020-4-6 20:42:58

看了第一课: c++快速入门,决定重拾旧码,各位同学讨论

本帖最后由 howzyao 于 2020-4-6 20:59 编辑

#include <cstdlib>
#include <iostream>
#include <graphics.h>
using namespace std;
/* 001 --- 尽可能的解释 面向对像
      这里的一组int内置类型的数据, 来组成的一个自定义叫做ab类型的 数据结构
      用这个结构来做一个小动画,来说明oo,来让大家快速明白 对像(数据结构)的好处
      此码需要头文件和静态库文件,才能执行,需要头文件和库文件的同学,请PM我,
      留下邮箱,将发送给大家方便一起学习,讨论.
      此为完整代码,可以运行于小巧的dev c++中.
*/
class ab
{
      int *p, left, top, right, bottom, s, c, l, w, n, statu, mx, my;
      public:
             ab():p(NULL),left(0),top(0),right(0),bottom(0),s(0),c(0),
                  l(0),w(0),n(0),statu(0),mx(0),my(0) { };
             ~ab(){ delete [] p; };
            
             //以上定义默认的构造:全0赋值,也没有申请连续的内存.            
            
             //定义一个接受两个参数的构造函数...
             ab(int,int);
            
      //初始化这一个对像到屏幕...
      void init(int,int);
      
      //这个对像动起来...
      void move();
      
      //对像动起来后,需要屏幕弹回和退出...
      void screen();
      intstatuR() { return statu; }; //需要状态来决定是否退出或做别的什么
      intnR()   { return n;   }; //同上      
};

typedef ab draw; //把ab类新定义一个别名:画 ,要好理解的多. 画一个对像.


int main(int argc, char *argv[])
{
   // graphics.h中的方法,创建绘图窗
    initwindow(800,600,"数据结构-001",500,100);
   
    //一个ab类的对像 a出生
    ab a(50,WHITE);
   
    //画 一个球 20半径 绿色
    draw aball(20,GREEN);
   
    //初始化这两个对像到哪里?屏上的某一点
    a.init(100,300);
    aball.init(200,400);
   
    //需要动起来... 8次触底时,退出while
    while(a.statuR()>0 && a.nR()<8 )
    {
      
      a.move();    // ab类型的数据对象 a 调用自己的移动函数
      a.screen(); //ab类型的数据对象 a 调用自己的屏幕弹回函数
      
      aball.move();
      aball.screen();
      
      delay(15); //延时15毫秒
      
      //getch();    //为了单步慢动作
    }
    cout<<a.nR()<<"== while(a.statuR()>0 && a.nR()<8 )\nExit"<<endl;
   
   
    getch();
    //system("PAUSE");
    return EXIT_SUCCESS;
}

howzyao 发表于 2020-4-6 20:46:28

方法补帖如下:

//画圆,至少需要指定半径,和它的色,暂时就定这么多了
ab::ab(int R, int C):p(NULL),left(0),top(0),right(0),bottom(0),s(0),
                              c(C),l(R+R),w(R+R),n(0),statu(0),mx(0),my(0)
{
    /*
    以上的"构造器"是抄写于默认的那段文字,只是把两个变量初始化为了入参变量,含意是:
    圆的长,宽是2倍的半径,颜色也被存储到成员数据s中去了,
    目前只做了这两个事. 下面开始画圆
    */
    setcolor(c);
    circle(R,R,R);//circle()是头文件的方法,暂时不重要,画圆用的,将来再解释它.
    setfillstyle(1,c);//设置填充,以后再说
    floodfill(R,R,c); //填充,... 实心圆已画好
   
    /*
    下面开始储存这个圆的各种属性了
    首先需要得到这个画面的大小,然后需要申请同样大小的内存来存储这个图形,同时
    给也初始化的大小等相关值并存储待用:
    */
   
    right=l; //l在 初始化器 中已经存储好值 l== R+R
    bottom=w;//同上. left和top都为0,代表左上角顶点处,不变化
   
    //代表这个矩形里的图形,需要占用的字节数,将来需要改变它的大小时,可以改动s的值
    s=imagesize(left,top,right,bottom);
   
    //依靠大小,申请内存,并用指针 p指向这块内存.
    p= new int ;
   
    //有了内存,开始 使用头文件的方法来复制这个图形到内存
    getimage(left,top,right,bottom,p);
   
    //复制完毕,恢复默认颜,并清场
    setcolor(WHITE);
    cleardevice();
}

void ab:: init(int x, int y)
{
    left   = x;
    top    = y;
    right= left + l;
    bottom = top+ w;
    putimage(left,top,p,1);//以头文件1的方式摆出图形,是按位异或:指不消除其它未重合的图形
    statu=1; //状态置为1,代表已激活,可以活动了
    n=1;
    mx=10;
    my=10; //步幅都为1
}

void ab:: move()
{
    //怎么动呢?
    putimage(left,top,p,1); //原地摆放图形 若完全重合,就会消失这个图形
    left   += mx;
    top    += my;
    right   = left + l;
    bottom= top+ w;
    putimage(left,top,p,1); //再次摆放出来
}

void ab :: screen()
{
   /*
   当靠边时,需要改变mx my的值,并使判定到边的条件失效
   */
   if(left<=0 && mx<0 ) //当球左移到屏左之内时 并球是从右至左运动时
   {
         putimage(left,top,p,1);   //先消除跳出的球
         left =1;               //还要使条件脱离      
         mx*= -1;               //还要向反方向移动
         right= left + l;          //还要使球右边到左边的直径始终正确
         putimage(left,top,p,1);//再次摆放出来以下以此类推...
   }
   else if( bottom>=getmaxy() ) //球下到屏下时
   {
         putimage(left,top,p,1);
         bottom= getmaxy()-1;
         my+=2;               
         mx+=5;
         my   *= -1;               
         top   = bottom - w;         
         putimage(left,top,p,1);
         n++;
   }
   else if( right>=getmaxx() ) //球右到屏右时
   {
         putimage(left,top,p,1);
         right   = getmaxx()-1;                  
         mx   *= -1;               
         left    = right - l;         
         putimage(left,top,p,1);
   }
   else if( top<=0 )            //球上到屏上时
   {
         putimage(left,top,p,1);
         top   = 1;                  
         my   *= -1;               
         bottom= top + w;         
         putimage(left,top,p,1);
   }
}
页: [1]
查看完整版本: 看了第一课: c++快速入门,决定重拾旧码,各位同学讨论