顺序表实现烂漫星空

star.h

#ifndef _STAR_H__ 
#define _STAR_H__ 
#define MAX_STAR 100 
#define SCREEN_WIDTH 640 
#define SCREEN_HEIGHT 480 
#define MAX_STEP 5 
#define MAX_RADIUS 3 
#define BOTTOM_MARGIN 100 

//星星状态 
enum STATUS{ 
	STOP=0,
	UP,
	DOWN,
	LEFT, 
	RIGHT, 
	RANDOM,
	ALL_STATUS 
};

struct STAR{ 
	int x; //星星的 x 坐标 
	int y; //星星的 y 坐标 
	enum STATUS stat; //状态 
	unsigned radius; //星星的半径 
	int step; //每次跳跃的间隔 
	int color; //星星的颜色
};

typedef struct {
	struct STAR *elems;
	int length;
	int size;
}SQlist;

//顺序表的接口 
bool InitList(SQlist &L);
bool ListAppend(SQlist &L, struct STAR e);
bool ListDelete(SQlist &L, int i);
void ListDestroy(SQlist &L);
#endif

star.cpp

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include "star.h"

using namespace std;

void MoveStar(SQlist &L,int i){
	//LinkList *L = NULL;
	if(L.elems[i].stat==STOP) return;

	//擦除原来的星星
	setfillcolor(BLACK);												
	solidcircle(L.elems[i].x,L.elems[i].y,L.elems[i].radius);

	if(L.elems[i].stat == DOWN){
		L.elems[i].y +=  L.elems[i].step;
		if(L.elems[i].y>SCREEN_HEIGHT) ListDelete(L, i);
	}else if(L.elems[i].stat == UP){
		L.elems[i].y -= L.elems[i].step;
		if(L.elems[i].y<0) ListDelete(L, i); 
	}else if(L.elems[i].stat == LEFT){
		L.elems[i].x -= L.elems[i].step;
		if(L.elems[i].x<0) ListDelete(L, i);
	}else if(L.elems[i].stat == RIGHT){
		L.elems[i].x += L.elems[i].step;
		if(L.elems[i].x>SCREEN_WIDTH) ListDelete(L, i); 
	}
	setfillcolor(L.elems[i].color);
	solidcircle(L.elems[i].x, L.elems[i].y, L.elems[i].radius);
}
/************************************
* 功能:初始化星星 
* 输入参数: 
* i - 星星在全局数组中的下标 
* 返回值:无 
************************************/ 
void initStar(struct STAR &_star){
	int rgb = 0; 
	
	//rand() 得到随机数范围 0 - 32767 RAND_MAX 
	_star.x = rand()% SCREEN_WIDTH; // x 范围 0 -639 
	_star.y = rand()% (SCREEN_HEIGHT - BOTTOM_MARGIN);// y 范围 0 - 379 
	_star.stat = UP; 
	_star.radius = 1+rand()%MAX_RADIUS; //半径控制 1 - 3 
	_star.step = rand() % MAX_STEP +1; //步长 1 - 5 
	rgb = 255 * _star.step / MAX_STEP; // 0 - 255 
	_star.color = RGB(rgb, rgb, rgb); 
}
int main(){
	bool quit = false; 
	struct STAR star; 
	SQlist starList;
	//初始化保存星星状态的顺序表 
	InitList(starList); 
	initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
	for(int i=0; i<MAX_STAR; i++){ 
		initStar(star); 
		ListAppend(starList, star);
	}
	for(int i=0;i<=starList.length-1;i++){
		setfillcolor(starList.elems[i].color);
		solidcircle(starList.elems[i].x, starList.elems[i].y, 
			starList.elems[i].radius);
	}
	
while(quit==false){
	for(int i=0;i<=starList.length-1;i++){
		MoveStar(starList,i);
	}
		/*if(isQuit()){ quit = true; }*/
	if(starList.length==0) { 
		quit = true; 
	}
	Sleep(50);
}
	system("pause");
	return 0;
}

starsqlist.cpp

#include <iostream>
#include <string>
#include <stdlib.h>
#include "star.h"

using namespace std;


#define MAX_SIZE 100
using namespace std;


bool InitList(SQlist &L){
	L.elems = new struct STAR [MAX_STAR];
	L.length = 0;
	L.size = MAX_STAR;
	return true;
}

bool ListAppend(SQlist &L, struct STAR e){
	if(L.length == L.size){
		cout<<"顺序表已满,不能添加了!"<<endl;
		return false;
	}
	L.elems[L.length] = e;
	L.length++;
	return true;
}


bool ListDelete(SQlist &L, int i){
	if(i<0 || i> L.length-1){
		cout<<"i值不合法,请重新输入"<<endl;
		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 ListDestroy(SQlist &L){
	if(L.elems){
		delete []L.elems;
	}
	L.length = 0;
	L.size = 0;
}

```cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值