用C++写一个星空

大家好,这是我学完C++后,完整的编写的一个程序之一,有兴趣的可尝试编写,画面(动态的)还可以。

本程序总结有两个版本,分别是对C++中的继承、多态等一些方面的练习。

编写用的是VS2019,easyx。

首先,来写第一个版本,也是最基础的版本,后续的都是在这个上进行一些细节的优化。有更好想法的小伙伴欢迎来一起讨论。

#include<iostream>
#include<graphics.h>
#include<time.h>
#include<coino.h>
#define SCREEN_WIDTH  1024  
#define SCREEN_HEIGHT  840
using  namespace std;
//创建一个星星类管理数据
class star
{public:star(){}void Init();void move();~star(){}
private:double		m_x=0;int			m_y;int			m_color;double		m_step;
};
void star::Init() //对星星的初始化
{if (m_x == 0){m_x = rand() % SCREEN_WIDTH;}else{m_x = 0;}m_y = rand() % SCREEN_HEIGHT;m_step = (rand() % 5000) / 1000.0 + 1;m_color = (int)(m_step * 255 / 6.0 + 0.5);m_color = RGB(m_color, m_color, m_color);}
void star::move() //星星的移动
{putpixel((int)m_x, m_y, 0);m_x += m_step;if (m_x > SCREEN_WIDTH){this->Init();		\}putpixel((int)m_x, m_y, m_color);
}int main()
{srand((unsigned)time(NULL));initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);star star[MAXSTAR];for (int i = 0; i < MAXSTAR; i++){star[i].Init();}while (!_kbhit()){for (int i = 0; i < MAXSTAR; i++){star[i].move();}Sleep(30);}closegraph();return 0;}

有编译环境的可以上机跑一下,代码不是很难。

 

接下来这个版本是升级版,对一些代码进行了优化,从上述代码中不难看出对星星的“画”、“檫”、“新的位置”这三个用得较多,不如将这三个单独用个函数写出,后面直接调用即可。

代码优化如下:

#include<iostream>
#include<graphics.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#define SCREEN_WIDTH    1024
#define SCREEN_HEIGHT   840
#define MAXSTAR         400
using namespace std;
class Star
{
public:Star() {}~Star() {}void Init();void Move();public:void Draw();void NewPos();void Remove();double  m_x = 0;int     m_y;double  m_step;int     m_color;};
class RectStar : public Star
{
public:RectStar() {}~RectStar() {}void Move(){Remove();NewPos();Draw();}protected:void Draw();void Remove();
};
void Star::Init()
{if (m_x == 0){m_x = rand() % SCREEN_WIDTH;}else{m_x = 0;}m_y = rand() % SCREEN_HEIGHT;m_step = (rand() % 5000) / 1000.0 + 1;m_color = (int)(m_step * 255 / 6.0 + 0.5);  // 速度越快,颜色越亮m_color = RGB(m_color, m_color, m_color);}void Star::Move()
{Remove();NewPos();Draw();}/*void Star::Draw()
{putpixel((int)m_x, m_y, m_color);
}*/void Star::NewPos()
{m_x += m_step;if (m_x > SCREEN_WIDTH)this->Init();
}
void Star::Draw()
{putpixel((int)m_x, m_y, m_color);setcolor(m_color);circle(m_x, m_y, 1);
}void Star::Remove()
{putpixel((int)m_x, m_y, 0);setcolor(0);circle(m_x, m_y, 1);
}
/*void Star::Remove()
{putpixel((int)m_x, m_y, 0);
}*/
int main()
{srand((unsigned)time(NULL));initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);Star star[MAXSTAR];RectStar rstar[MAXSTAR];for (int i = 0; i < MAXSTAR; i++){star[i].Init();rstar[i].Init();}while (!_kbhit()){for (int i = 0; i < MAXSTAR; i++){star[i].Move();rstar[i].Move();}Sleep(50);}closegraph();return 0;}

是不是在运行后觉得一两种星的形状太枯燥了,接下来简单的用多态来实现不同的星星的形状

代码如下:

#include<iostream>
#include<graphics.h>
#include<time.h>
#include<conio.h>
#define SCREEN_WIDTH  1024
#define SCREEN_HEIGHT 840
#define MAXSTAR  400
using namespace std;
class StarType
{
public:virtual void Draw(int x, int y, int color) = 0;virtual void Remove(int x, int y) = 0;
};
class PointStar:public StarType
{void Draw(int x, int y, int color){putpixel((int)x, y, color);setcolor(color);circle(x, y, 1);}void Remove(int x, int y){putpixel((int)x, y,0);setcolor(0);circle(x, y, 1);}};
class RecStar :public StarType
{void Draw(int x, int y, int color){putpixel(x, y, color);setcolor(color);rectangle(x - 1,y - 1, x + 1, y + 1);}void Remove(int x, int y){putpixel(x, y, 0);setcolor(0);rectangle(x - 1, y - 1, x + 1, y + 1);}
};
class XStar :public StarType
{void Draw(int x, int y, int color){setcolor(color);outtextxy(x, y, _T("x"));}void Remove(int x, int y){settextcolor(0);outtextxy(x, y, _T("x"));}
};class Star
{
public:Star(){}~Star() {}void Init();void Move();void Init(StarType* pStarType);
public:void NewPos();double m_x;double m_y;int m_color;double m_step;StarType* m_pStarType;
};
void Star::Init()
{if (m_x == 0){m_x = rand() % SCREEN_WIDTH;}else{m_x = 0;}m_y = rand() % SCREEN_HEIGHT;m_step = (rand() % 5000) / 1000.0 + 1;m_color = (int)(m_step* 255 / 6.0 + 1);m_color = RGB(m_color, m_color, m_color);}
void Star::Init(StarType* pStarType)
{this->Init();m_pStarType = pStarType;
}
void Star::Move()
{m_pStarType->Remove(m_x,m_y);NewPos();m_pStarType->Draw(m_x, m_y, m_color);}
void Star::NewPos()
{m_x += m_step;if (m_x > SCREEN_WIDTH){this->Init();}}
void main()
{srand((unsigned)time(NULL));initgraph(SCREEN_WIDTH, SCREEN_WIDTH);Star star[MAXSTAR];PointStar pointstar;XStar xstar;RecStar restar;for (int i = 0; i < MAXSTAR; i++){switch (i % 3){case 0:star[i].Init(&pointstar);break;case 1:star[i].Init(&pointstar);break;case 2:star[i].Init(&pointstar);break;default:break;}}while (!kbhit){for (int i = 0; i < MAXSTAR; i++){star[i].Move();}Sleep(50);}closegraph();}

以上就是本次本人对对绘制星图的就简单理解。欢迎有志于学好C++的伙伴来分享C++学习心得和友好地评论。如是有问题看到了有时间的话会及时回复。感谢各位的观看。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决方案_环网柜监测解决方案

户外环网柜环境条件各异&#xff0c;复杂。温度过高容易发生火灾&#xff0c;温度过低则会形成凝露从而发生短路等事故&#xff0c;温湿度超过一定阀值都会影响配电功能的正常运行&#xff0c;对环网柜的环境状态进行监测与调节十分重要。行业需求居民小区环网柜公共建筑环网柜…

python建筑案例_Python数据分析实战-链家北京二手房价分析

前言最近在自学Python&#xff0c;通过学习大家的分享案例&#xff0c;看到使用Python进行较多的主要4个方面&#xff1a;爬虫&#xff0c;数据处理&#xff0c;数据可视化以及机器学习建模。对我来说目标就是&#xff1a;熟练使用numpy pandas 进行数据清洗和预处理&#xff1…

execve系统调用_Linux系统编程——进程替换:exec 函数族

在 Windows 平台下&#xff0c;我们可以通过双击运行可执行程序&#xff0c;让这个可执行程序成为一个进程&#xff1b;而在 Linux 平台&#xff0c;我们可以通过 ./ 运行&#xff0c;让一个可执行程序成为一个进程。但是&#xff0c;如果我们本来就运行着一个程序&#xff08;…

idea shell 使用linux_Linux使用shell定时任务实现ffmpeg视频转码和截图

Linux安装操作系统&#xff1a;CentOS7 ffmpeg版本&#xff1a;3.4.1安装先访问ffmpeg官网下载linux安装包 http://ffmpeg.org/download.html &#xff0c;这里我下载的是官方已经编译过的版本&#xff0c;别问我为啥不自己编译&#xff0c;因为我自己编译耗费了好久&#xff0…

曾辉机器人_武昌理工学子在2020年中国机器人大赛中夺冠

“它在过弯的时候非常稳&#xff0c;而且速度快&#xff0c;跑完一圈的时间比第二名少十秒左右。”武昌理工学院学生余辉激动地说。11月27日从武昌理工学院获悉&#xff0c;在刚刚结束的2020中国机器人大赛中&#xff0c;武昌理工学院人工智能学院“晨旭队”&#xff0c;经过激…

升级bios_华硕400系主板升级BIOS:静待11代酷睿CPU

1月份对PC玩家来说还有很多惊喜&#xff0c;AMD、NVIDIA、Intel都会在CES上推出新一代产品&#xff0c;其中Intel针对桌面端的产品是11代酷睿&#xff0c;代号Rocket Lake-S。Rocket Lake仍将采用14nm制造工艺&#xff0c;基本确定也将是Intel最后一代14nm处理器。CPU架构方面&…

取得数组下标_《零基础C++入门教程》——(8)搞定二维数组与循环嵌套

一、学习目标了解二维数组的使用方法了解循环嵌套的使用方法目录预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《零基础看得懂的C语言入门教程》——(二)简单带你了解流程 想了解编译原理和学习方法点这…

linux 的swap具体分析_Linux SWAP 深度解读

概述本文讨论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统&#xff0c;而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文&#xff0c;应该可以帮你解决以下问题&#xff1a;1、 swap到底是干嘛的&…

物联卡的使用_物联卡在手机上使用有什么影响?网友:寿命分别是3个月,16天,9天...

个人使用物联卡是否合法&#xff1f;当然&#xff0c;个人是可以使用的&#xff0c;只不过是使用在除手机、平板以外的智能设备上。重点提醒&#xff1a;手机和平板除外。物联卡&#xff0c;是运营商为物流网服务企业提供的用于智能终端设备联网的&#xff0c;仅面对企业用户进…

多行文字cad提取数据_利用CAD自带的数据提取功能手动提取假表格至Excel

“吾生也有涯&#xff0c;而知也无涯&#xff0c;以有涯随无涯&#xff0c;殆已&#xff01;”&#xff0c;在已经有了免费的“源泉设计”插件可以自动提取假表格至Excel之后&#xff0c;笔者为什么还要讲解手动提取的方法&#xff1f;无他&#xff0c;生命在于折(zhuang)腾(bi…

gridview标题居中显示_Pr:制作片尾滚动字幕(旧版标题法)

本文介绍使用 Pr 的旧版标题设计器来制作传统片尾滚动字幕的方法。效果视频◆ ◆ ◆一般方法与步骤1、首先&#xff0c;将文字内容输入到一个文本文件中。按 Ctrl/Cmd A 全选&#xff0c;按 Ctrl/Cmd C 复制以备用。2、Pr菜单&#xff1a;文件/新建/旧版标题。3、点击“滚动…

mysql 从库状态_大神教你自动发现监控mysql从库状态

导读zabbix从库如果复制有问题&#xff0c;在主库机器有问题的时候&#xff0c;切为主就会导致数据的丢失。或者主从分离的时候&#xff0c;如果从库出现延时状态的话&#xff0c;会导致前端页面展示的数据不是为最新的数据。因此&#xff0c;监控mysql从库的状态是必要的。mys…

服务器搭建php mysql5_Windows下php5+apache+mysql5 手工搭建笔记

Windows下php5apachemysql5 手工搭建笔记更新时间&#xff1a;2011年02月15日 01:35:09 作者&#xff1a;php运行环境对于站长们或者初学者来说可以直接用一键包的方式或者直接从服务提供商处得到支持&#xff0c;不必自己手工按部就班的搭建&#xff0c;所以这篇文章是写给我…

Java编程和C语言哪个更好?

学编程用哪一个编程语言好?很多人刚开始接触编程的时候都不知道自己该学哪个好&#xff0c;软件开发编程语言多达600余种&#xff0c;每种都有各自的特点和应用领域。目前&#xff0c;热门编程语言无外乎Java、C、C了&#xff0c;实际上&#xff0c;Java确实是从C语言和C语言继…

Java程序员常犯的几类错误

1.忽视异常 相信很多小伙伴在编程的过程中经常对异常置之不理。针对初学者和有经验的 Java 程序员&#xff0c;最佳实践仍是处理它们。异常抛出通常是带有目的性的&#xff0c;因此在大多数情况下需要记录引起异常的事件。不要小看这件事&#xff0c;如果必要的话&#xff0c;…

jdk1.8 mysql_Centos 7配置JDK1.8+MySQL5.7+Tomcat 8 开发环境

工具腾讯云服务器(可通过公网ip访问)Xshell 6Xftp 61、Xshell 6 连接云服务器打开xshell很简单&#xff0c;直接上图配置好之后连接云服务器&#xff0c;之后就可以对云服务器进行操作了。2、配置JDK 1.8a、下载JDK1.8如果直接在云服务器的命令行中使用wget http://download.or…

做为一名java高级程序员,需要了解哪些岗位?

一、Java高级程序员 要想成为JAVA&#xff08;高级&#xff09;程序员也称Java高级工程师&#xff0c;肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA高级程序员&#xff0c;您要对JAVA做比较深入的研究。您应该多研究一下JDBC、IO包…

Java 程序员必读的五本书籍

如果你是一名程序员&#xff0c;想知道如何提高你对Java的了解或者成为更好的Java开发人员。在本文中&#xff0c;我将分享一些最好的Java书籍。这些书经受住了时间的考验&#xff0c;随着岁月的流逝变得越来越重要。不管你是学生还是职业者&#xff0c;你总有很多东西要学&…

使用sqlserver连接mysql服务_Sqlserver创建连接MySql的链接服务器

第一步&#xff1a;在MySql服务器上安装与系统对应的 MySql-Connector-ODBC安装过程中可能会报 缺失 msvcr100.dll的错误&#xff0c;这需要你根据系统到网上下载对应的这个dll文件。(当初遇到这个问题的时候&#xff0c;在网上试了很多的这种文件 最后才找到一个合适自己的)第…

什么人适合学习Java编程?编程好学吗?

什么人适合学习Java编程&#xff1f;编程好学吗&#xff1f;首先自己做个自我评估&#xff0c;包括能力、兴趣、逻辑思维、性格特点等等&#xff0c;结合这些特质判断自己是否适合学习Java。评估自己时&#xff0c;要尽量客观&#xff0c;追随内心&#xff0c;切勿轻易抬高或者…