c++使用easyx实现单文件格子涂色小游戏

使用C++实现的格子涂色小游戏效果如下:

右侧16个格子是颜色选择区。鼠标单机格子可选择颜色。左侧16X13个格子是涂色区。选择颜色后可涂色。可随时切换颜色。

使用easyx图形库

实现思路:

1.先定义两个结构体。一个结构体用来存放涂色区域格子的位置坐标信息。另一个结构体用来存放颜色格子的区域位置坐标信息。颜色格子的结构体需要新增一个成员COLORREF,代表这个格子的颜色

2.定义一个二维数组。里面的每个元素为涂色区域格子。定义一个一维数组,里面存放颜色格子的区域信息。

3.遍历二维数组,使用fillrectangle画出每个涂色区域的格子。遍历一维数组画出每个颜色区域的格子。并且设置对应的颜色。

4.监听鼠标事件。使用peekmessage 非阻塞方法。判断鼠标的点击事件,如果是鼠标左键点击。获取当前鼠标点击的X,Y点。遍历一维数组和二维数组。检查鼠标的X,Y是否在这两个格子区域的X,Y内。如果在就可以判读出是点击的颜色区域还是格子区域。如果是颜色区域,setfillcolor()方法调用对应的颜色即可。如果是涂色区域。fillrectangle()方法画出对应的格子即可。

源代码:

#include<graphics.h>
#include <conio.h>
#include<string.h>

/*
格子涂色小游戏。By:jiangaimin
website: www.jiangaimin.com
*/

#define MAXSECTION 16
#define JUXINGROW 16
#define JUXINGCOLUMN 13
//定义一个颜色矩形部分
typedef struct {
	int left;
	int top;
	int right;
	int bottom;
	COLORREF color;
} ColorSection;



typedef struct {
	int left;
	int top;
	int right;
	int bottom;
} juxing;


//生成颜色格子并填充
void CreateColorSection(ColorSection* colorSection) {
	int colors[] = {
		0,0xAA0000,0x00AA00,0xAAAA00,0x0000AA,0xAA00AA,0x0055AA,
		0xAAAAAA,0x555555,0xFF5555,0x55FF55,0xFFFF55,0x5555FF,
		0xFF55FF,0x55FFFF,0xFFFFFF
	};


	int x = 930, y = 10, ry = 70;
	for (int i = 0; i < MAXSECTION; i++) {
		colorSection[i].left = x;
		colorSection[i].top = y;
		colorSection[i].right = x + 60;
		colorSection[i].bottom = ry;
		colorSection[i].color = colors[i];
		setfillcolor(colorSection[i].color);
		fillrectangle(colorSection[i].left, colorSection[i].top, colorSection[i].right, colorSection[i].bottom);

		y += 60;
		ry += 60;
	}
}

//生成文字
void CreateText() {
	TCHAR str[] = __T("请单击右侧颜色区域选择颜色");
	int x = 850, y = 300;
	int strCount = lstrlenW(str);
	for (int i = 0; i < strCount; i++) {
		outtextxy(x, y, str[i]);
		y += 20;
	}

}

//判断点击区域是颜色格子还是涂色格子
void MouseClick(juxing jx[][JUXINGCOLUMN], ColorSection* colorSection, int x, int y, int* color) {

	//先判断是否是颜色
	for (int i = 0; i < MAXSECTION; i++) {
		int left = colorSection[i].left;
		int right = colorSection[i].right;
		int top = colorSection[i].top;
		int bottom = colorSection[i].bottom;
		if ((x > left && x < right) && (y > top && y < bottom)) {
			*color = colorSection[i].color;
			break;
		}
	}

	for (int i = 0; i < JUXINGROW; i++) {
		for (int j = 0; j < JUXINGCOLUMN; j++) {
			if ((x > jx[i][j].left && x < jx[i][j].right) && (y > jx[i][j].top && y < jx[i][j].bottom)) {
				setfillcolor(*color);
				fillrectangle(jx[i][j].left, jx[i][j].top, jx[i][j].right, jx[i][j].bottom);
				break;
			}
		}
	}

}



//监听鼠标事件,如果点击的范围内是颜色区域。就设置填充的颜色。如果是格子区域,就填充格子
void ListenDraw(juxing jx[][JUXINGCOLUMN], ColorSection* colorSection) {
	ExMessage em;
	int x = 0, y = 0, color = 0;
	while (1) {
		peekmessage(&em, EM_MOUSE);
		switch (em.message) {
		case WM_LBUTTONDOWN:
			x = em.x;
			y = em.y;
			MouseClick(jx, colorSection, x, y, &color);
			break;
		}

	}
}


int main() {

	initgraph(1000, 1000);
	setfillcolor(BLACK);

	int y = 10, ry = 70;
	juxing juxingData[JUXINGROW][JUXINGCOLUMN];

	for (int i = 0; i < JUXINGROW; i++) {
		int x = 10, rx = 70;
		for (int j = 0; j < JUXINGCOLUMN; j++) {
			juxingData[i][j] = { x,y,rx,ry };
			x = rx;
			rx += 60;
		}
		y += 60;
		ry += 60;
	}

	//生成格子
	for (int i = 0; i < JUXINGROW; i++)
		for (int j = 0; j < JUXINGCOLUMN; j++)
			fillrectangle(juxingData[i][j].left, juxingData[i][j].top, juxingData[i][j].right, juxingData[i][j].bottom);

	//生成颜色选择区的格子
	ColorSection colores[MAXSECTION];
	CreateColorSection(colores);
	//创建文字
	CreateText();
	

	while (1) {
		ListenDraw(juxingData, colores);
	}

	closegraph();



	return 0;
}

保存编译,打开即可运行。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注