常に星EasyXグラフィックスライブラリのリストを達成するために移動します

常に星EasyXグラフィックスライブラリのリストを達成するために移動します

コード:

#include
する#include <graphics.h>
書式#include <はWindows.h>

名前空間stdを使用。

//マクロ定義の画面の幅と高さ
の#define SCREEN_WIDTH 640
の#define SCREEN_HEIGHT 480

//マクロ定義を主演各プロパティ
の#define MAX_STAR 100 //:ナンバー
。MAX_RADIUS 3への#define
。の#define MAX_STEP 5

//スター移動状態の
列挙型{_statusクラス
STOP、
UP、
DOWN、
LEFT、
rigth、

ALL_STATUS

}。

星形構造の内部に格納されている//リストは、他の星のアドレスの構造体である
構造体のtypedef {_LinkNode
; //のスターノードのアドレス構造体_LinkNode * PREV
次構造体_LinkNode *; //次のノードアドレス星中
} _LinkNode;

//星星结构体
のtypedef構造体{
int型のX;
int型のy;
unsigned int型の半径;
_Status状況;
int型ステップ;
int型カラー;
_LinkNodeノード。
}_星;

//最初のノードが主演初期化
BOOL starInit(_STAR *&L_star){
L_star =新しい新しい_STARを、
IF {(L_star!)
falseに戻ります;
}

//不初始化星星属性
//这里是首节点
L_star->node.next = NULL;
L_star->node.prev = NULL;

return true;

}

プロパティで//初期化星
のボイドinitStar(_STAR * P&){
IF(!P){
; COUT << "!星の無い空間" <<てendl
復帰;
}

p->x = rand() % SCREEN_WIDTH;					//0 - 639
p->y = rand() % SCREEN_HEIGHT;					//0 - 479
p->radius = rand() % MAX_RADIUS + 1;			// 1 - 3
p->status = _STATUS::UP;						//状态向上
p->step = rand() % MAX_STEP + 1;				//步长 1- 5
int rgb = 255 * (p->step / MAX_STEP);			
p->color = RGB(rgb, rgb, rgb);					//颜色

}

//リストを追加します(前方走るフランス)
BOOL linkInsert_front(_LinkNode * L、_LinkNode *ノード){
// L:ノードアドレスの最初の星
//ノード:ノードアドレスに星を追加する
場合(L ||ノード!!) {
falseを返します;
}

if (L->next) {
	L->next->prev = node;
}

node->next = L->next;
node->prev = L;
L->next = node;


return true;

}

//后插法
BOOL linkInsert_back(_LinkNode * L、_LinkNode *ノード){
場合(L ||ノード!){
リターンはfalse;
}

_LinkNode *last = L;

//找到最后一个的地址
while (last->next) {
	last = last->next;
}

node->next = NULL;
node->prev = last;
last->next = node;


return true;

}

//表示スター
空隙starDisplay(_STAR *&L_star){
IF {(L_star || L_star-> node.next !!)
に戻ります;
}

//指向第一个链表节点
_LinkNode *p = L_star->node.next;

//查看距离的_STAR头的位置
int offset = offsetof(_STAR, node);

while (p) {
	_STAR *tmp = (_STAR *)((size_t)p - offset);

	//绘制图像
	setfillcolor(tmp->color);
	solidcircle(tmp->x, tmp->y, tmp->radius);

	//指向下一个星星结构体里的node地址
	p = p->next;
}

}

//モバイル主演
のボイドmoveStar(_STAR *&L_starを){
{IF(!L_star || L_star-> node.next)
戻ります;
}

//指向第一个星星
_LinkNode *p = L_star->node.next;

//查看距离的_STAR头的位置
int offset = offsetof(_STAR, node);

while (p) {
	_STAR *tmp = (_STAR *)((size_t)p - offset);

	//擦除原来位置的星星
	setfillcolor(BLACK);
	solidcircle(tmp->x, tmp->y, tmp->radius);

	//判断移动状态,通过步长移动坐标
	//默认都是UP
	switch (tmp->status) {
	case _STATUS::UP:
		tmp->y -= tmp->step;
		if (tmp->y <= 0)  tmp->y = SCREEN_HEIGHT;
		break;
	case _STATUS::DOWN:
		tmp->y += tmp->step;
		if (tmp->y >= SCREEN_HEIGHT)  tmp->y = 0;
		break;
	case _STATUS::LEFT:
		tmp->x -= tmp->step;
		if (tmp->x <= 0)  tmp->x = SCREEN_WIDTH;
		break;
	case _STATUS::RIGTH:
		tmp->x += tmp->step;
		if (tmp->x >= SCREEN_WIDTH)  tmp->x = 0;
		break;
	case _STATUS::ALL_STATUS:
	default:
		break;
	}

	//绘制新位置图像
	setfillcolor(tmp->color);
	solidcircle(tmp->x, tmp->y, tmp->radius);

	//遍历到下一个星星的node地址
	p = p->next;
}

}

メインINT(ボイド){
//最初の星型構造体ポインタ
_STAR * L_star = NULL;

//存其他的添加的星星结构体
_STAR *s_star = NULL;

//初始化星星首节点
starInit(L_star);

//添加MAX_STAR个星星
for (int i = 0; i < MAX_STAR; i++) {
	s_star = new _STAR;

	//初始化分配空间里的星星各个属性
	initStar(s_star);

	//分配星星里node的链表,形成双向链表[后插法]
	linkInsert_back(&(L_star->node), &(s_star->node));
}

//显示图像
initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
HWND hwnd = GetHWnd();
SetWindowText(hwnd, _T("星空图"));

//显示星空
starDisplay(L_star);

//星星不断移动
while (1) {
	//移动完所有星星
	moveStar(L_star);

	//就休息50ms
	Sleep(50);
}


system("pause");

//关闭图像
closegraph();

return 0;

}

リリース元の4件の記事 ウォンの賞賛1 ビュー48

おすすめ

転載: blog.csdn.net/qq_39752645/article/details/104920192