//star.h
#pragma once
//开发工具:vs2019
//图形库:EasyX_2019
//qq:1020785391
//作者:王杰
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define MAX_STAR 100 //最大星星数
#define SCREEN_WIDTH 720 //屏幕宽度
#define SCREEN_HIGHT 480 //屏幕高度
#define MAX_STEP 5 //星星移动步数
#define MAX_RADIUS 3 //星星半径
#define MAX_RGB 255 //星星颜色
//星星状态
typedef enum STATUS
{
STOP,
UP,
DOWN,
LEFT,
RIGHT,
RANDOM,
ALL_STATUS
}STATUS;
//星星
typedef struct STAR
{
int x; //星星x坐标
int y; //星星y坐标
STATUS status; //星星状态
unsigned radius; //星星半径
int step; //星星移动步数
int color; //星星颜色
}STAR;
//顺序表结构体
typedef struct SqList
{
STAR* elems; //存储数据
int length; //长度
int size; //大小
}SqList;
//星星函数
void initStar(SqList& L,int i);
void moveStar(SqList& L, int i);
//顺序表函数
bool initList(SqList& L);
bool listAppend(SqList& L, STAR e);
void listPrint(SqList& L);
bool listInsert(SqList& L, int i, STAR e);
bool listDelete(SqList& L, int i);
void listDestory(SqList& L);
//starSqList.h
#include <iostream>
#include "Star.h"
using namespace std;
//初始化
bool initList(SqList& L)
{
L.elems = new STAR[MAX_STAR];
if (!L.elems) return false;
L.length = 0;
L.size = MAX_STAR;
return true;
}
//添加元素
bool listAppend(SqList& L, STAR e)
{
if (L.length == MAX_STAR) return false;
L.elems[L.length] = e;
L.length++;
return true;
}
//输出
void listPrint(SqList& L)
{
cout << "顺序表存储空间size:" << L.size
<< ",已保存元素个数length:" << L.length << endl;
for (int i = 0; i < L.length; i++)
{
cout << L.elems[i].x<<L.elems[i].y << "\t";
}
cout << endl;
}
//插入元素
bool listInsert(SqList& L, int i, STAR e)
{
if (i<0 || i>L.length) return false;
if (L.length == MAX_STAR) return false;
for (int j = L.length - 1; j > i - 1; j--)
{
L.elems[j + 1] = L.elems[j];
}
L.elems[i] = e;
L.length++;
return true;
}
//删除元素
bool listDelete(SqList& L, int i)
{
if (i < 0 || i >= L.length) return false;
if (i == L.length - 1)
{
L.length--;
return true;
}
for (int j = i; j < L.length - 1; j++)
{
L.elems[j] = L.elems[j + 1];
}
L.length--;
return true;
}
//销毁顺序表
void listDestory(SqList& L)
{
if (L.elems)
{
delete L.elems;
L.elems = NULL;
}
L.length = 0;
L.size = 0;
}
//star.cpp
#include "Star.h"
//初始化星星
void initStar(SqList &L,int i)
{
L.elems[i].x = rand() % SCREEN_WIDTH;
L.elems[i].y = rand() % SCREEN_HIGHT;
L.elems[i].step = rand() % MAX_STEP + 1;
L.elems[i].radius = rand() % MAX_RADIUS + 1;
L.elems[i].status = (STATUS)(rand() % ALL_STATUS);
int rgb = rand() % MAX_RGB + 1;
L.elems[i].color = RGB(rgb, rgb, rgb);
listAppend(L,L.elems[i]);
}
//移动星星
void moveStar(SqList &L,int i)
{
setfillcolor(BLACK);
solidcircle(L.elems[i].x, L.elems[i].y, L.elems[i].radius);
switch (L.elems[i].status)
{
case STOP:
break;
case UP:
L.elems[i].y = L.elems[i].y - L.elems[i].step;
if(L.elems[i].y<0) listDelete(L, i);
break;
case DOWN:
L.elems[i].y = L.elems[i].y + L.elems[i].step;
if (L.elems[i].y > SCREEN_HIGHT) listDelete(L, i);
break;
case LEFT:
L.elems[i].x = L.elems[i].x - L.elems[i].step;
if (L.elems[i].x < 0) listDelete(L, i);
break;
case RIGHT:
L.elems[i].x = L.elems[i].x + L.elems[i].step;
if (L.elems[i].x > SCREEN_WIDTH) listDelete(L, i);
break;
case RANDOM:
L.elems[i].status = (STATUS)(rand() % RANDOM);
switch (L.elems[i].status)
{
case STOP:
break;
case UP:
L.elems[i].y = L.elems[i].y - L.elems[i].step;
if (L.elems[i].y < 0) listDelete(L, i);
break;
case DOWN:
L.elems[i].y = L.elems[i].y + L.elems[i].step;
if (L.elems[i].y > SCREEN_HIGHT) listDelete(L, i);
break;
case LEFT:
L.elems[i].x = L.elems[i].x - L.elems[i].step;
if (L.elems[i].x < 0) listDelete(L, i);
break;
case RIGHT:
L.elems[i].x = L.elems[i].x + L.elems[i].step;
if (L.elems[i].x > SCREEN_WIDTH) listDelete(L, i);
break;
default:
break;
}
break;
default:
break;
}
setfillcolor(L.elems[i].color);
solidcircle(L.elems[i].x, L.elems[i].y, L.elems[i].radius);
}
int main()
{
initgraph(SCREEN_WIDTH, SCREEN_HIGHT);
SqList L;
initList(L);
//初始化星星
for (int i = 0; i < MAX_STAR; i++)
{
initStar(L,i);
}
//画星星
for (int i = 0; i < L.length; i++)
{
setfillcolor(L.elems[i].color);
solidcircle(L.elems[i].x, L.elems[i].y, L.elems[i].radius);
}
//实现漫天星空移动版
while (true)
{
for (int i = 0; i < L.length; i++)
{
moveStar(L,i);
}
Sleep(100);
}
system("pause");
closegraph();
return 0;
}