当然基于earyX实现还是比较简陋的,但是通过链表实现,效率还是没得说的,大致对的原理就是,会生成有些五颜六色的小圆点,然后从屏幕的上面慢慢消失,还是比较好看,
代码分三部分组成
1. Star.h 的头文件 , 定义了一个信息的结构的,还有星星的状态信息,链表的相关接口
//#pragma once
#define WIN_W 800 //窗口宽度
#define WIN_H 800 //窗口高度
#define STAR_COUNT 100 //星星数量
#define STAR_RADIUS 5 //星星的最大半径
#define STEP 5
enum StarState {
UP, //向上
DOWN, //向下
LEFT, //向左
RIGHT, //向右
COUNT
};
struct Star
{
int x; //星星的x坐标
int y; //星星的y坐标
int radius; //星星的半径
int step; //星星每次跳跃的间隔
int color; //星星的颜色
enum StarState state; //星星状态
};
//Star star[STAR_COUNT]; //定义一百个星星
typedef struct _LinkNode {
struct Star elemt; //数据域
struct _LinkNode *next; //指针域
}LinkHead,LinkNode;
//链表的接口
bool initNode(LinkHead*& head);
void print(LinkHead*& head);
bool insterNode_front(LinkHead*& head, struct Star _elemt); //插入(头插法)
bool insterNode_back(LinkHead*& head, struct Star _elemt); //插入(尾差法)
bool insterNode(LinkHead*& head, int i, struct Star _elemt); //任一位置插入
bool find(LinkHead*& head, int e); //查找对应的结点
//bool deleteDode(LinkHead*& head, int i); //删除结点
bool deleteDode(LinkHead*& head, int y);
void distroyNode(LinkHead*& head); //销毁链表
2 Star.cpp的文件, 对头文件中的相关接口进行实现,主要是一些链表相关的操作
#include<iostream>
#include"Star.h"
using namespace std;
//初始化头结点
bool initNode(LinkHead* &head) {
head = new LinkHead; //分配内存
if (!head) return false; //内存分配失败
head->next = NULL;
return true;
}
//头插法
bool insterNode_front(LinkHead*& head, struct Star _elemt) {
if (!head) return false; //传入的链表为空
LinkNode* p = new LinkNode;
p->elemt = _elemt;
p->next = head->next;
head->next = p;
return true;
}
//遍历整个链表
void print(LinkHead*& head) {
if (!head) return; //链表为空
LinkNode* p;
p = head->next;
while (p) {
cout << "x坐标: " << p->elemt.x<<" y坐标: "<<p->elemt.y<<" 半径: "<<p->elemt.radius<<endl;
p = p->next;
}
}
//尾插法
bool insterNode_back(LinkHead*& head, struct Star _elemt) {
if (!head) return false;
LinkNode* p,*last;
p = new LinkNode;
p->elemt = _elemt;
last = head;
while (last->next) { //当一个结点的指针域为NULL,表示是尾结点
last = last->next;
}
p->next = last->next;
last->next = p;
return true;
}
// 任意位置插入
bool insterNode(LinkHead*& head, int i, struct Star _elemt) {
LinkNode* p=NULL;
p = head;
int j = 0; //记录链表的位置
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) { //判断i的合法性 i可能<1,
return false;
}
else{
LinkNode* s = new LinkNode; //生成新的结点
s->elemt = _elemt;
s->next = p->next;
p->next = s;
return true;
}
}
//按值查找
bool find(LinkHead*& head, int e) {
LinkNode* node = NULL;
node = head->next; //从第一个结点开始遍历
while (node && node->elemt.x != e) {
node = node->next;
}
if (!node) {
return false;
}
else {
return true;
}
}
//查找第i个位置的值
bool find(LinkHead*& head, int e, int& x) {
if (e <= 0) return false; //判断位置e的合法性
LinkNode* node = NULL;
node = head;
int index = 0;
while (node && index < e) {
node = node->next;
index++;
}
if (!node) {
return false;
}else {
x = node->elemt.x;
return true;
}
}
//删除元素
//bool deleteDode(LinkHead*& head, int i) {
// LinkNode* p = NULL;
// LinkNode* s = NULL; //用来表示删除的结点
// p = head;
// if (!p || !p->next) return false; //判断链表是否为空,或者链表只有头结点
// int index = 0; //记录结点位置
// //遍历单链表
// while ( p && index<i-1) {
// p = p->next;
// index++;
// }
// if (! p || index > i-1) { //判断i位置的合法性
// return false;
// }
// else {
// s = p->next;
// p->next=s->next;
// delete s; //释放结点内存
// return true;
// }
//}
//按值删除元素
bool deleteDode(LinkHead*& head, int y) {
if (!head) return false;
LinkNode* p = head;
while (p) {
if (p->next->elemt.y == y) break;
p = p->next;
}
if (!p) return false;
LinkNode* s = p->next; //要删除的结点
p->next = s->next;
return true;
}
//销毁单链表
void distroyNode(LinkHead*& head) {
LinkHead* p = head;
while (p) {
head = head->next;
cout << "\n释放:" << "x:"<<p->elemt.x<<" y:"<<p->elemt.y << " 的内存" << endl;
delete p;
p = head;
}
}
3.. 主函数, 综合的调用相关接口
#include<graphics.h>
#include<iostream>
#include<time.h>
#include"Star.h"
using namespace std;
//初始化界面
void init() {
initgraph(WIN_W, WIN_H);
}
void initStar(struct Star& star) {
//srand(time(NULL));
star.x = 1 + rand() % WIN_W;
star.y = 1 + rand() % (WIN_W - 200);
star.radius = rand() % STAR_RADIUS;
star.step = 1 + rand() % STEP;
int rgb1 = rand() % 256;
int rgb2 = rand() % 256;
int rgb3 = rand() % 256;
star.color = RGB(rgb1, rgb2, rgb3);
// star.state = static_cast<enum StarState>(rand() % (int)COUNT);
star.state = UP;
}
bool remove(LinkHead*& head) {
if (!head || head->next==NULL) return false;
LinkNode* p = head->next;
while (p) {
setfillcolor(BLACK);
solidcircle(p->elemt.x, p->elemt.y, p->elemt.radius); //把原来的位置抹除
if (p->elemt.state == UP) {
p->elemt.y -= p->elemt.step;
if (p->elemt.y <-5) {
int e = p->elemt.y;
deleteDode(head, e);
}
}
/*
else if (p->elemt.state == DOWN) {
p->elemt.y += p->elemt.step;
if (p->elemt.y > WIN_H) deleteDode(head, p->elemt.y);
}
else if (p->elemt.state == LEFT) {
p->elemt.x -= p->elemt.step;
if (p->elemt.x < 0) deleteDode(head, p->elemt.y);
}
else if (p->elemt.state == RIGHT) {
p->elemt.x += p->elemt.step;
if (p->elemt.x < WIN_W) deleteDode(head, p->elemt.y);
}*/
setfillcolor(p->elemt.color); //填充色
solidcircle(p->elemt.x, p->elemt.y, p->elemt.radius); //画圆
p = p->next;
}
return true;
}
int main() {
LinkHead* head;
struct Star star;
initNode(head); //初始化链表
//初始化界面
init();
for (int i = 0; i < STAR_COUNT; i++) {
initStar(star); //初始化星星
insterNode_back(head, star);
}
LinkNode* p = head->next;
while (p) { //遍历这个链表,将星星显示出来
setfillcolor(p->elemt.color); //填充颜色
solidcircle(p->elemt.x, p->elemt.y, p->elemt.radius); //画圆
p = p->next;
}
system("pause");
bool falg = true;
while (falg) {
if (!remove(head)) {
falg = false;
}
Sleep(5);
}
system("pause");
closegraph();
return 0;
}
效果如下 : 程序开始之前设置了一个暂停, 按任意键开始就开始跑起来了