使用easyX运用顺序表打印星星
1、star.h
#pragma once
#include<iostream>
#include<graphics.h>//需要在easyX官网下载安装对应VS的版本,不然会报错
#include<conio.h>
#define MAX_STAR 200 //星星个数
#define SCREEN_WIDTH 640 //高度
#define SCREEN_HEIGTH 480 //宽度
#define MAX_STEP 5 //步距
#define MAX_RADIUS 3 //半径
#define BOTTOM_MARGIN 100 //下边距
enum STUTS
{
STOP = 0,
UP,
DOWN,
LEFT,
RIGTH,
RANDOM,
ALL_STATUS
};
struct STAR
{
int x=0;//x坐标
int y=0;//y坐标
enum STUTS stat;//状态
unsigned radius=0;//半径
int step=0;//跳跃间隔
int color=0;//颜色
};
typedef struct {
STAR* elem;
int length;
int size;
}SqList;
//接口
bool initList(SqList& L);//初始化
bool addList(SqList& L, struct STAR e);//添加
bool deleteList(SqList& L, int i);//删除
void printfList(SqList& L);//打印
void destroyList(SqList& L);//销毁顺序表
void MoveStar(SqList& L, int i);//擦除星星
void initStar(struct STAR&_star);//生成星星
2、star.cpp
#include "star.h"
using namespace std;
bool initList(SqList& L)
{
L.elem = new struct STAR[MAX_STAR];
if (!L.elem)return false;
L.length = 0;
L.size = MAX_STAR;
return true;
}
bool addList(SqList& L, STAR e)
{
if (L.length == L.size)return false;
L.elem[L.length] = e;
L.length++;
return true;
}
bool deleteList(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.elem[j] = L.elem[j + 1];
}
L.length--;
return true;
}
void printfList(SqList& L)
{
cout << "顺序表容量 size: " << L.size << ", 已保存元素的个数 length:"
<<L.length<<endl;
for (int i = 0; i < L.length; i++) {
cout << "第" << i + 1 << " 颗星星: x=" << L.elem[i].x << ","
" y = "<<L.elem[i].y<<", radius = "<<L.elem[i].radius<<endl;
}
cout << endl;
}
void destroyList(SqList& L)
{
if (L.elem) delete[] L.elem;
L.length = 0;
L.size = 0;
}
void MoveStar(SqList& L, int i)
{
if (L.elem[i].stat == STOP) return;
setfillcolor(BLACK);
solidcircle(L.elem[i].x, L.elem[i].y, L.elem[i].radius);
if (L.elem[i].stat == DOWN) {
L.elem[i].y = L.elem[i].y + L.elem[i].step;
if (L.elem[i].y > SCREEN_HEIGTH)deleteList(L, i);
}
else if (L.elem[i].stat==UP) {
L.elem[i].y -= L.elem[i].step;
if (L.elem[i].y < 0)deleteList(L, i);
}
else if (L.elem[i].stat== LEFT) {
L.elem[i].x -= L.elem[i].step;
if (L.elem[i].x < 0)deleteList(L, i);
}
else if (L.elem[i].stat == RIGTH) {
L.elem[i].x += L.elem[i].step;
if (L.elem[i].x > SCREEN_WIDTH)deleteList(L, i);
}
setfillcolor(L.elem[i].color);
solidcircle(L.elem[i].x, L.elem[i].y, L.elem[i].radius);
}
void initStar(STAR& _star)
{
int rbg = 0;
_star.x = rand() % SCREEN_WIDTH;//X范围
_star.y = rand() % (SCREEN_HEIGTH- BOTTOM_MARGIN);//Y范围
_star.stat = DOWN;//控制方向
_star.radius = 1+rand() % MAX_RADIUS;//半径
_star.step = rand() % MAX_STEP+1;//步长
rbg = 255*_star.step / MAX_STEP;
_star.color = RGB(rbg, rbg, rbg);//颜色
}
3、main
#include<iostream>
#include"star.h"
using namespace std;
int main() {
bool quit = false;
struct STAR star;
SqList sqList;
initList(sqList);//初始化顺序表
initgraph(SCREEN_WIDTH, SCREEN_HEIGTH);//绘制框
for (int i = 0; i < MAX_STAR; i++) {
initStar(star);
addList(sqList, star);//循环添加
}
printfList(sqList);//打印顺序表信息
for (int i = 0; i < sqList.length; i++) {
setfillcolor(sqList.elem[i].color);//制定雪花颜色
solidcircle(sqList.elem[i].x, sqList.elem[i].y, sqList.elem[i].radius);
}
while (quit == false) {//擦除雪花
for (int i = 0; i < sqList.length; i++) {
MoveStar(sqList, i);
}
if (sqList.length == 0) {//没有了就退出
quit = true;
}
Sleep(50);//休眠
}
closegraph();
destroyList(sqList);//销毁顺序表
return 0;
}