使用easyX运用顺序表打印星星

本文介绍了如何利用easyX库在C++中创建一个顺序表结构来管理星星的位置、状态和颜色,并演示了如何通过循环添加、擦除和移动星星来实现动态星星轨迹的绘制。

使用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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值