鱼C论坛

 找回密码
 立即注册
查看: 1237|回复: 1

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

[复制链接]
发表于 2020-4-6 20:42:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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();
      int  statuR() { return statu; }; //需要状态来决定是否退出或做别的什么
      int  nR()     { 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[s] ;
   
    //有了内存,开始 使用头文件的方法来复制这个图形到内存
    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);
     }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 13:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表