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