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 size; //顺序表的总空间大小
int length; //顺序表的长度
}SqList;
//顺序表的接口
bool initList(SqList& list);
void listPrint(SqList& list);
bool listAppend(SqList& list, struct STAR e);
bool listDelete(SqList& list, int i);
void destroyList(SqList& list);
#endif _STAR_H__
star.cpp
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include "star.h"
using namespace std;
//struct STAR star[MAX_STAR];
//bool isQuit() {
// for (int i = 0; i < MAX_STAR; i++) {
// if (star[i].x > 0 && star[i].x < SCREEN_WIDTH && star[i].y>0 &&
// star[i].y < SCREEN_HEIGHT) {
// return false;
// }
// }
// return true;
//}
void MoveStar(SqList &L, int i) {
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].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) L.elems[i].step;
}
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() {
SqList starList;
struct STAR star;
//初始化保存星星状态的顺序表
initList(starList);
bool quit = false;
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; i++) {
setfillcolor(starList.elems[i].color);
solidcircle(starList.elems[i].x, starList.elems[i].y, starList.elems[i].radius);
}
//IMAGE tortoise;//王八图片
//loadimage(&tortoise, "tortoise.jpg", 30, 30, false);
//putimage(SCREEN_WIDTH * 4 / 10 - 30, SCREEN_HEIGHT - 30, &tortoise);
//putimage(SCREEN_WIDTH * 6 / 10, SCREEN_HEIGHT - 30, &tortoise);
while (quit == false) {
for (int i = 0; i < starList.length; i++) {
MoveStar(starList,i);
}
/*if (isQuit()) {
quit = true;
}*/
if (starList.length == 0) {
quit = true;
}
Sleep(50);
}
system("pause");
closegraph();
return 0;
}
starSqList.cpp
#include "star.h"
#include <iostream>
using namespace std;
bool initList(SqList& list) { //构造一个空的顺序表
list.elems = new struct STAR[MAX_STAR]; //为顺序表分配MAX_SIZE个int元素的空间
if (!list.elems) return false;
list.length = 0;
list.size = MAX_STAR;
return true;
}
void listPrint(SqList& list) {
cout << "顺序表的存储空间size:" << list.size
<< ",已保存元素个数length:" << list.length << endl;
for (int i = 0; i <= list.length - 1; i++) {
cout << "第" << i + 1 << "颗星星:x=" << list.elems[i].x << ",y=" << list.elems[i].y;
}
cout << endl;
}
bool listAppend(SqList& list, struct STAR e) {
if (list.length == list.size) return false;
list.elems[list.length] = e;
list.length++;
return true;
}
//bool listInsert(SqList& list, int i, int e) {
// if (i < 0 || i >= list.length) return false;
// if (list.length == list.size)return false;
// for (int j = list.length - 1; j >= i; j--) {
// list.elems[j + 1] = list.elems[j];//从最后一个元素开始往后移,直到下标为i元素后移
// }
// list.elems[i] = e;//将新元素e放入第i的位置
// list.length++;//表长+1
// return true;
//}
bool listDelete(SqList& list, int i) {
if (i < 0 || i >= list.length) return false;
if (i == list.length - 1) {//边界值,删除最后一个元素
list.length--;
return true;
}
for (int j = i; j < list.length - 1; j++) {
list.elems[i] = list.elems[j + 1];//删除位置的后续元素依次往前移
}
list.length--;
return true;
}
void destroyList(SqList& list) {
if (list.elems) delete[] list.elems;
list.length = 0;
list.size = 0;
}