看了第一课: 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;
} 方法补帖如下:
//画圆,至少需要指定半径,和它的色,暂时就定这么多了
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]