基于链表实现的漫天星空

       当然基于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;
}

效果如下  :      程序开始之前设置了一个暂停,  按任意键开始就开始跑起来了

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零二年的冬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值